.tw-taglist { 
   background-color    : lightgreen; 
     -webkit-border-top-left-radius: 0.3em;
     -webkit-border-bottom-left-radius: 0.3em;
     -moz-border-radius-topleft: 0.3em;
     -moz-border-radius-bottomleft: 0.3em;
     border-top-left-radius: 0.3em;
     border-bottom-left-radius: 0.3em;

     -webkit-border-top-right-radius: 0.3em;
     -webkit-border-bottom-right-radius: 0.3em;
     -moz-border-radius-topright: 0.3em;
     -moz-border-radius-bottomright: 0.3em;
     border-top-right-radius: 0.3em;
     border-bottom-right-radius: 0.3em;

}



.tw-taglist:hover {
     background-color: yellow;
}

<$link><span class="tw-taglist"><$view field="title"/></span></$link><$fieldmangler><$button param=<<tcc1>> message="tm-remove-tag" class="tc-btn-invisible">{{$:/core/images/cancel-button}}</$button></$fieldmangler>
\define lingo-base() $:/language/EditTemplate/Body/
<$list filter="[is[current]has[_canonical_uri]]">

<div class="tc-message-box">

<<lingo External/Hint>>

<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>

<$edit-text field="_canonical_uri" class="tc-edit-fields"></$edit-text>

</div>

</$list>

<$list filter="[is[current]!has[_canonical_uri]]">



<$edit field="text" class="tc-edit-texteditor" placeholder={{$:/language/EditTemplate/Body/Placeholder}}/>



</$list>
Built from branch 'tiddlywiki-com' at commit 634ac92ba2cb142e85f90de584e028fd6d32e812 of https://github.com/Jermolene/TiddlyWiki5.git at 2019-05-11 19:04:12 UTC
0
json
none
html
html
x-perimental
test/EditTemplate
show
hide
yes
no
yes

test/ViewTemplate
text/x-readonly/ViewTemplate1
show
show
show
hide
enable
{
    "tiddlers": {
        "$:/Acknowledgements": {
            "title": "$:/Acknowledgements",
            "text": "TiddlyWiki incorporates code from these fine OpenSource projects:\n\n* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]\n* [[The Jasmine JavaScript Test Framework|http://pivotal.github.io/jasmine/]]\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\n\nAnd media from these projects:\n\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\n"
        },
        "$:/core/copyright.txt": {
            "title": "$:/core/copyright.txt",
            "type": "text/plain",
            "text": "TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright (c) 2004-2007, Jeremy Ruston\nCopyright (c) 2007-2020, UnaMesa Association\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
        },
        "$:/core/icon": {
            "title": "$:/core/icon",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path d=\"M64 0l54.56 32v64L64 128 9.44 96V32L64 0zm21.127 95.408c-3.578-.103-5.15-.094-6.974-3.152l-1.42.042c-1.653-.075-.964-.04-2.067-.097-1.844-.07-1.548-1.86-1.873-2.8-.52-3.202.687-6.43.65-9.632-.014-1.14-1.593-5.17-2.157-6.61-1.768.34-3.546.406-5.34.497-4.134-.01-8.24-.527-12.317-1.183-.8 3.35-3.16 8.036-1.21 11.44 2.37 3.52 4.03 4.495 6.61 4.707 2.572.212 3.16 3.18 2.53 4.242-.55.73-1.52.864-2.346 1.04l-1.65.08c-1.296-.046-2.455-.404-3.61-.955-1.93-1.097-3.925-3.383-5.406-5.024.345.658.55 1.938.24 2.53-.878 1.27-4.665 1.26-6.4.47-1.97-.89-6.73-7.162-7.468-11.86 1.96-3.78 4.812-7.07 6.255-11.186-3.146-2.05-4.83-5.384-4.61-9.16l.08-.44c-3.097.59-1.49.37-4.82.628-10.608-.032-19.935-7.37-14.68-18.774.34-.673.664-1.287 1.243-.994.466.237.4 1.18.166 2.227-3.005 13.627 11.67 13.732 20.69 11.21.89-.25 2.67-1.936 3.905-2.495 2.016-.91 4.205-1.282 6.376-1.55 5.4-.63 11.893 2.276 15.19 2.37 3.3.096 7.99-.805 10.87-.615 2.09.098 4.143.483 6.16 1.03 1.306-6.49 1.4-11.27 4.492-12.38 1.814.293 3.213 2.818 4.25 4.167 2.112-.086 4.12.46 6.115 1.066 3.61-.522 6.642-2.593 9.833-4.203-3.234 2.69-3.673 7.075-3.303 11.127.138 2.103-.444 4.386-1.164 6.54-1.348 3.507-3.95 7.204-6.97 7.014-1.14-.036-1.805-.695-2.653-1.4-.164 1.427-.81 2.7-1.434 3.96-1.44 2.797-5.203 4.03-8.687 7.016-3.484 2.985 1.114 13.65 2.23 15.594 1.114 1.94 4.226 2.652 3.02 4.406-.37.58-.936.785-1.54 1.01l-.82.11zm-40.097-8.85l.553.14c.694-.27 2.09.15 2.83.353-1.363-1.31-3.417-3.24-4.897-4.46-.485-1.47-.278-2.96-.174-4.46l.02-.123c-.582 1.205-1.322 2.376-1.72 3.645-.465 1.71 2.07 3.557 3.052 4.615l.336.3z\" fill-rule=\"evenodd\"/></svg>"
        },
        "$:/core/images/add-comment": {
            "title": "$:/core/images/add-comment",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-add-comment tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 56H36a8 8 0 100 16h20v20a8 8 0 1016 0V72h20a8 8 0 100-16H72V36a8 8 0 10-16 0v20zm-12.595 58.362c-6.683 7.659-20.297 12.903-36.006 12.903-2.196 0-4.35-.102-6.451-.3 9.652-3.836 17.356-12.24 21.01-22.874C8.516 94.28 0 79.734 0 63.5 0 33.953 28.206 10 63 10s63 23.953 63 53.5S97.794 117 63 117c-6.841 0-13.428-.926-19.595-2.638z\"/></svg>"
        },
        "$:/core/images/advanced-search-button": {
            "title": "$:/core/images/advanced-search-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-advanced-search-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M74.565 87.985A47.776 47.776 0 0148 96C21.49 96 0 74.51 0 48S21.49 0 48 0s48 21.49 48 48c0 9.854-2.97 19.015-8.062 26.636l34.347 34.347a9.443 9.443 0 010 13.36 9.446 9.446 0 01-13.36 0l-34.36-34.358zM48 80c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/><circle cx=\"48\" cy=\"48\" r=\"8\"/><circle cx=\"28\" cy=\"48\" r=\"8\"/><circle cx=\"68\" cy=\"48\" r=\"8\"/></g></svg>"
        },
        "$:/core/images/auto-height": {
            "title": "$:/core/images/auto-height",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-auto-height tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M67.987 114.356l-.029-14.477a4 4 0 00-2.067-3.494l-15.966-8.813-1.933 7.502H79.9c4.222 0 5.564-5.693 1.786-7.58L49.797 71.572 48.01 79.15h31.982c4.217 0 5.564-5.682 1.795-7.575L49.805 55.517l-1.795 7.575h31.982c4.212 0 5.563-5.67 1.805-7.57l-16.034-8.105 2.195 3.57V35.614l9.214 9.213a4 4 0 105.656-5.656l-16-16a4 4 0 00-5.656 0l-16 16a4 4 0 105.656 5.656l9.13-9.13v15.288a4 4 0 002.195 3.57l16.035 8.106 1.804-7.57H48.01c-4.217 0-5.564 5.682-1.795 7.574l31.982 16.059 1.795-7.575H48.01c-4.222 0-5.564 5.693-1.787 7.579l31.89 15.923 1.787-7.578H47.992c-4.133 0-5.552 5.504-1.933 7.501l15.966 8.813-2.067-3.494.029 14.436-9.159-9.158a4 4 0 00-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656l-9.185 9.184zM16 20h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
        },
        "$:/core/images/blank": {
            "title": "$:/core/images/blank",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-blank tc-image-button\" viewBox=\"0 0 128 128\"/>"
        },
        "$:/core/images/bold": {
            "title": "$:/core/images/bold",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-bold tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.146 51.81V21.87h26.353c2.51 0 4.93.21 7.26.628 2.33.418 4.392 1.165 6.185 2.24 1.793 1.076 3.227 2.57 4.302 4.482 1.076 1.913 1.614 4.363 1.614 7.35 0 5.379-1.613 9.263-4.84 11.653-3.227 2.39-7.35 3.586-12.37 3.586H41.146zM13 0v128h62.028a65.45 65.45 0 0016.762-2.151c5.438-1.434 10.278-3.645 14.52-6.633 4.244-2.988 7.62-6.842 10.13-11.563 2.51-4.721 3.764-10.308 3.764-16.762 0-8.008-1.942-14.85-5.826-20.527-3.884-5.677-9.77-9.65-17.658-11.921 5.737-2.75 10.069-6.275 12.997-10.577 2.928-4.303 4.392-9.681 4.392-16.135 0-5.976-.986-10.995-2.958-15.059-1.972-4.063-4.75-7.32-8.336-9.77-3.585-2.45-7.888-4.213-12.907-5.289C84.888.538 79.33 0 73.235 0H13zm28.146 106.129V70.992H71.8c6.095 0 10.995 1.404 14.7 4.212 3.705 2.81 5.558 7.5 5.558 14.073 0 3.347-.568 6.096-1.703 8.247-1.136 2.151-2.66 3.854-4.572 5.11-1.912 1.254-4.123 2.15-6.633 2.688-2.51.538-5.139.807-7.888.807H41.146z\"/></svg>"
        },
        "$:/core/images/cancel-button": {
            "title": "$:/core/images/cancel-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 76.314l-16.97 16.97a7.999 7.999 0 01-11.314 0c-3.118-3.118-3.124-8.19 0-11.313L52.686 65l-16.97-16.97a7.999 7.999 0 010-11.314c3.118-3.118 8.19-3.124 11.313 0L64 53.686l16.97-16.97a7.999 7.999 0 0111.314 0c3.118 3.118 3.124 8.19 0 11.313L75.314 65l16.97 16.97a7.999 7.999 0 010 11.314c-3.118 3.118-8.19 3.124-11.313 0L64 76.314zM64 129c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 1 0 29.654 0 65c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 17 64 17 16 38.49 16 65s21.49 48 48 48z\"/></svg>"
        },
        "$:/core/images/chevron-down": {
            "title": "$:/core/images/chevron-down",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-down tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.053 85.456a7.889 7.889 0 01-5.6-2.316L2.473 27.16a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0L64.05 66.344l50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.105 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.317z\"/><path d=\"M64.053 124.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></g></svg>"
        },
        "$:/core/images/chevron-left": {
            "title": "$:/core/images/chevron-left",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M47.544 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L66.656 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.105 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.317-5.595z\"/><path d=\"M8.931 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L28.041 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.104 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.316-5.595z\"/></g></svg>"
        },
        "$:/core/images/chevron-right": {
            "title": "$:/core/images/chevron-right",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-right tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M83.456 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196L64.344 63.95 13.963 13.567a7.92 7.92 0 010-11.195c3.086-3.085 8.105-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.317 5.595z\"/><path d=\"M122.069 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></g></svg>"
        },
        "$:/core/images/chevron-up": {
            "title": "$:/core/images/chevron-up",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-up tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M63.947 44.544c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 63.656l-50.382 50.382a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.317z\"/><path d=\"M63.947 5.931c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 25.041 13.567 75.423a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.104 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.316z\"/></g></svg>"
        },
        "$:/core/images/clone-button": {
            "title": "$:/core/images/clone-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-clone-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M32.265 96v24.002A7.996 7.996 0 0040.263 128h79.74a7.996 7.996 0 007.997-7.998v-79.74a7.996 7.996 0 00-7.998-7.997H96V48h12.859a2.99 2.99 0 012.994 2.994v57.865a2.99 2.99 0 01-2.994 2.994H50.994A2.99 2.99 0 0148 108.859V96H32.265z\"/><path d=\"M40 56h-7.993C27.588 56 24 52.418 24 48c0-4.41 3.585-8 8.007-8H40v-7.993C40 27.588 43.582 24 48 24c4.41 0 8 3.585 8 8.007V40h7.993C68.412 40 72 43.582 72 48c0 4.41-3.585 8-8.007 8H56v7.993C56 68.412 52.418 72 48 72c-4.41 0-8-3.585-8-8.007V56zM8 0C3.58 0 0 3.588 0 8v80c0 4.419 3.588 8 8 8h80c4.419 0 8-3.588 8-8V8c0-4.419-3.588-8-8-8H8zM19 16A2.997 2.997 0 0016 19.001v57.998A2.997 2.997 0 0019.001 80h57.998A2.997 2.997 0 0080 76.999V19.001A2.997 2.997 0 0076.999 16H19.001z\"/></g></svg>"
        },
        "$:/core/images/close-all-button": {
            "title": "$:/core/images/close-all-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-close-all-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M28 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L16.686 100 2.543 85.856a8 8 0 0111.313-11.313L28 88.686l14.144-14.143a8 8 0 0111.313 11.313L39.314 100l14.143 14.144a8 8 0 01-11.313 11.313L28 111.314zM28 39.314L13.856 53.457A8 8 0 012.543 42.144L16.686 28 2.543 13.856A8 8 0 0113.856 2.543L28 16.686 42.144 2.543a8 8 0 0111.313 11.313L39.314 28l14.143 14.144a8 8 0 01-11.313 11.313L28 39.314zM100 39.314L85.856 53.457a8 8 0 01-11.313-11.313L88.686 28 74.543 13.856A8 8 0 0185.856 2.543L100 16.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 28l14.143 14.144a8 8 0 01-11.313 11.313L100 39.314zM100 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L88.686 100 74.543 85.856a8 8 0 0111.313-11.313L100 88.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 100l14.143 14.144a8 8 0 01-11.313 11.313L100 111.314z\"/></g></svg>"
        },
        "$:/core/images/close-button": {
            "title": "$:/core/images/close-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M65.086 75.41l-50.113 50.113c-3.121 3.121-8.192 3.126-11.316.002-3.118-3.118-3.123-8.19.002-11.316l50.114-50.114L3.659 13.982C.538 10.86.533 5.79 3.657 2.666c3.118-3.118 8.19-3.123 11.316.002l50.113 50.114L115.2 2.668c3.121-3.121 8.192-3.126 11.316-.002 3.118 3.118 3.123 8.19-.002 11.316L76.4 64.095l50.114 50.114c3.121 3.121 3.126 8.192.002 11.316-3.118 3.118-8.19 3.123-11.316-.002L65.086 75.409z\"/></svg>"
        },
        "$:/core/images/close-others-button": {
            "title": "$:/core/images/close-others-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-others-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48zm0-16c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32zm0-16c8.837 0 16-7.163 16-16s-7.163-16-16-16-16 7.163-16 16 7.163 16 16 16z\"/></svg>"
        },
        "$:/core/images/copy-clipboard": {
            "title": "$:/core/images/copy-clipboard",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-copy-clipboard tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"33\" height=\"8\" x=\"40\" y=\"40\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"82\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"54\" rx=\"4\"/><rect width=\"33\" height=\"8\" x=\"40\" y=\"96\" rx=\"4\"/><rect width=\"12\" height=\"8\" x=\"40\" y=\"68\" rx=\"4\"/><path d=\"M40 16H24c-4.419 0-8 3.59-8 8a8.031 8.031 0 000 .01v95.98a8.03 8.03 0 000 .01c0 4.41 3.581 8 8 8h80a7.975 7.975 0 005.652-2.34 7.958 7.958 0 002.348-5.652v-16.016c0-4.414-3.582-7.992-8-7.992-4.41 0-8 3.578-8 7.992V112H32V32h64v8.008C96 44.422 99.582 48 104 48c4.41 0 8-3.578 8-7.992V23.992a7.963 7.963 0 00-2.343-5.651A7.995 7.995 0 00104.001 16H88c0-4.41-3.585-8-8.007-8H48.007C43.588 8 40 11.582 40 16zm4-1.004A4.001 4.001 0 0148 11h32c2.21 0 4 1.797 4 3.996v4.008A4.001 4.001 0 0180 23H48c-2.21 0-4-1.797-4-3.996v-4.008z\"/><rect width=\"66\" height=\"16\" x=\"62\" y=\"64\" rx=\"8\"/><path d=\"M84.657 82.343l-16-16v11.314l16-16a8 8 0 10-11.314-11.314l-16 16a8 8 0 000 11.314l16 16a8 8 0 1011.314-11.314z\"/></g></svg>"
        },
        "$:/core/images/delete-button": {
            "title": "$:/core/images/delete-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(12)\"><rect width=\"105\" height=\"16\" y=\"11\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"28\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"8\" y=\"16\" rx=\"8\"/><rect width=\"88\" height=\"16\" x=\"8\" y=\"112\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"80\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"56\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"32\" y=\"16\" rx=\"8\"/></g></svg>"
        },
        "$:/core/images/done-button": {
            "title": "$:/core/images/done-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M42.26 111.032c-2.051.001-4.103-.78-5.668-2.345L2.662 74.758a8 8 0 01-.005-11.32c3.118-3.117 8.192-3.12 11.32.007l28.278 28.278 72.124-72.124a8.002 8.002 0 0111.314-.001c3.118 3.118 3.124 8.19 0 11.315l-77.78 77.78a7.978 7.978 0 01-5.658 2.343z\"/></svg>"
        },
        "$:/core/images/down-arrow": {
            "title": "$:/core/images/down-arrow",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.177 100.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.086 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></svg>"
        },
        "$:/core/images/download-button": {
            "title": "$:/core/images/download-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-download-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\" class=\"tc-image-download-button-ring\"/><path d=\"M34.35 66.43l26.892 27.205a4.57 4.57 0 006.516 0L94.65 66.43a4.7 4.7 0 000-6.593 4.581 4.581 0 00-3.258-1.365h-8.46c-2.545 0-4.608-2.087-4.608-4.661v-15.15c0-2.575-2.063-4.662-4.608-4.662H55.284c-2.545 0-4.608 2.087-4.608 4.662v15.15c0 2.574-2.063 4.661-4.608 4.661h-8.46c-2.545 0-4.608 2.087-4.608 4.662a4.69 4.69 0 001.35 3.296z\"/></g></svg>"
        },
        "$:/core/images/edit-button": {
            "title": "$:/core/images/edit-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M95.627 10.059l-5.656 5.657 11.313 11.313 5.657-5.656-11.314-11.314zm5.657-5.657l1.966-1.966c3.123-3.122 8.194-3.129 11.319-.005 3.117 3.118 3.122 8.192-.005 11.32l-1.966 1.965-11.314-11.314zm-16.97 16.97l-60.25 60.25a8.12 8.12 0 00-.322.342c-.1.087-.198.179-.295.275-5.735 5.735-10.702 22.016-10.702 22.016s16.405-5.09 22.016-10.702c.095-.096.186-.193.272-.292a8.12 8.12 0 00.345-.325l60.25-60.25-11.314-11.313zM35.171 124.19c6.788-.577 13.898-2.272 23.689-5.348 1.825-.573 3.57-1.136 6.336-2.04 16-5.226 21.877-6.807 28.745-7.146 8.358-.413 13.854 2.13 17.58 8.699a4 4 0 006.959-3.946c-5.334-9.406-13.745-13.296-24.933-12.744-7.875.39-14.057 2.052-30.835 7.533-2.739.894-4.46 1.45-6.25 2.012-19.46 6.112-30.77 7.072-39.597 1.747a4 4 0 10-4.132 6.85c6.333 3.82 13.754 5.12 22.438 4.383z\"/></g></svg>"
        },
        "$:/core/images/erase": {
            "title": "$:/core/images/erase",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-erase tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.087 127.996l63.015-63.015c6.535-6.535 6.528-17.115-.003-23.646L99.466 17.702c-6.539-6.538-17.117-6.532-23.646-.003L4.898 88.62c-6.535 6.534-6.528 17.115.003 23.646l15.73 15.73h39.456zm-34.95-7.313l-14.324-14.325c-3.267-3.268-3.268-8.564-.008-11.824L46.269 59.07l35.462 35.462-26.15 26.15H25.137z\"/></svg>"
        },
        "$:/core/images/excise": {
            "title": "$:/core/images/excise",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-excise tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 107.314l-2.343 2.343a8 8 0 11-11.314-11.314l16-16a8 8 0 0111.314 0l16 16a8 8 0 11-11.314 11.314L72 107.314v14.284c0 3.536-3.582 6.402-8 6.402s-8-2.866-8-6.402v-14.284zM0 40.007C0 35.585 3.59 32 8 32c4.418 0 8 3.588 8 8.007v31.986C16 76.415 12.41 80 8 80c-4.418 0-8-3.588-8-8.007V40.007zm32 0C32 35.585 35.59 32 40 32c4.418 0 8 3.588 8 8.007v31.986C48 76.415 44.41 80 40 80c-4.418 0-8-3.588-8-8.007V40.007zm48 0C80 35.585 83.59 32 88 32c4.418 0 8 3.588 8 8.007v31.986C96 76.415 92.41 80 88 80c-4.418 0-8-3.588-8-8.007V40.007zm-24-32C56 3.585 59.59 0 64 0c4.418 0 8 3.588 8 8.007v31.986C72 44.415 68.41 48 64 48c-4.418 0-8-3.588-8-8.007V8.007zm56 32c0-4.422 3.59-8.007 8-8.007 4.418 0 8 3.588 8 8.007v31.986c0 4.422-3.59 8.007-8 8.007-4.418 0-8-3.588-8-8.007V40.007z\"/></svg>"
        },
        "$:/core/images/export-button": {
            "title": "$:/core/images/export-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-export-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.003 128H119.993a7.984 7.984 0 005.664-2.349v.007A7.975 7.975 0 00128 120V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v56H16V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v64c0 4.418 3.59 8 8 8h.003zm48.62-100.689l-8.965 8.966c-3.125 3.125-8.195 3.13-11.319.005-3.118-3.118-3.122-8.192.005-11.319L58.962 2.346A7.986 7.986 0 0164.625 0l-.006.002c2.05-.001 4.102.78 5.666 2.344l22.618 22.617c3.124 3.125 3.129 8.195.005 11.319-3.118 3.118-8.192 3.122-11.319-.005l-8.965-8.966v61.256c0 4.411-3.582 8-8 8-4.41 0-8-3.582-8-8V27.311z\"/></svg>"
        },
        "$:/core/images/file": {
            "title": "$:/core/images/file",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-file tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M111.968 30.5H112V120a8 8 0 01-8 8H24a8 8 0 01-8-8V8a8 8 0 018-8h57v.02a7.978 7.978 0 015.998 2.337l22.627 22.627a7.975 7.975 0 012.343 5.516zM81 8H24v112h80V30.5H89c-4.418 0-8-3.578-8-8V8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"68\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"84\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"100\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/></svg>"
        },
        "$:/core/images/fixed-height": {
            "title": "$:/core/images/fixed-height",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fixed-height tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60 35.657l-9.172 9.171a4 4 0 11-5.656-5.656l16-16a4 4 0 015.656 0l16 16a4 4 0 01-5.656 5.656L68 35.657v57.686l9.172-9.171a4 4 0 115.656 5.656l-16 16a4 4 0 01-5.656 0l-16-16a4 4 0 115.656-5.656L60 93.343V35.657zM16 116h96a4 4 0 100-8H16a4 4 0 100 8zm0-96h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
        },
        "$:/core/images/fold-all-button": {
            "title": "$:/core/images/fold-all-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M64.03 20.004c-2.05 0-4.102.78-5.667 2.344L35.746 44.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 22.348a7.986 7.986 0 00-5.663-2.346zM64.03 85.002c-2.05-.001-4.102.78-5.667 2.344l-22.617 22.617c-3.125 3.125-3.13 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.966 16.966 16.966c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.192-.005-11.319L69.687 87.346A7.986 7.986 0 0064.024 85z\"/></g></svg>"
        },
        "$:/core/images/fold-button": {
            "title": "$:/core/images/fold-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M64.03 25.004c-2.05 0-4.102.78-5.667 2.344L35.746 49.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 27.348a7.986 7.986 0 00-5.663-2.346zM64.005 67.379c-2.05 0-4.102.78-5.666 2.344L35.722 92.34c-3.125 3.125-3.13 8.195-.006 11.32 3.118 3.117 8.192 3.121 11.32-.006L64 86.69l16.965 16.965c3.125 3.125 8.195 3.13 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L69.663 69.723A7.986 7.986 0 0064 67.377z\"/></g></svg>"
        },
        "$:/core/images/fold-others-button": {
            "title": "$:/core/images/fold-others-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-others tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" y=\"56.031\" rx=\"8\"/><path d=\"M86.632 79.976c-2.05 0-4.102.78-5.666 2.345L64 99.286 47.034 82.321a7.986 7.986 0 00-5.662-2.346l.005.001c-2.05 0-4.102.78-5.666 2.345l-22.618 22.617c-3.124 3.125-3.129 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.966-16.966 16.965 16.966a7.986 7.986 0 005.663 2.346l-.005-.002c2.05 0 4.102-.78 5.666-2.344l16.965-16.966 16.966 16.966c3.125 3.124 8.194 3.129 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L92.289 82.321a7.986 7.986 0 00-5.663-2.346zM86.7 48.024c-2.05 0-4.102-.78-5.666-2.345L64.07 28.714 47.103 45.679a7.986 7.986 0 01-5.663 2.346l.005-.001c-2.05 0-4.101-.78-5.666-2.345L13.162 23.062c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L41.44 28.714l16.966-16.966a7.986 7.986 0 015.662-2.346l-.005.002c2.05 0 4.102.78 5.666 2.344l16.966 16.966 16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L92.358 45.679a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
        },
        "$:/core/images/folder": {
            "title": "$:/core/images/folder",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-folder tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.694 128H8C3.58 128 0 124.414 0 119.996V48.004C0 43.584 3.584 40 7.999 40H16v-8c0-4.418 3.578-8 8-8h32a8 8 0 018 8v8h40.001c4.418 0 7.999 3.586 7.999 8.004V59.83l-8-.082v-7.749A4 4 0 0099.997 48H56V36c0-2.21-1.793-4-4.004-4H28.004A4 4 0 0024 36v12H12.003A4 4 0 008 52v64a4 4 0 004.003 4h46.76l-3.069 8z\"/><path d=\"M23.873 55.5h96.003c4.417 0 7.004 4.053 5.774 9.063l-13.344 54.374c-1.228 5.005-5.808 9.063-10.223 9.063H6.08c-4.417 0-7.003-4.053-5.774-9.063L13.65 64.563c1.228-5.005 5.808-9.063 10.223-9.063zm1.78 8.5h87.994c2.211 0 3.504 2.093 2.891 4.666l-11.12 46.668c-.614 2.577-2.902 4.666-5.115 4.666H12.31c-2.211 0-3.504-2.093-2.891-4.666l11.12-46.668C21.152 66.09 23.44 64 25.653 64z\"/></g></svg>"
        },
        "$:/core/images/full-screen-button": {
            "title": "$:/core/images/full-screen-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-full-screen-button tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 8a8 8 0 018-8h32a8 8 0 110 16H16v24a8 8 0 11-16 0V8zM128 120a8 8 0 01-8 8H88a8 8 0 110-16h24V88a8 8 0 1116 0v32zM8 128a8 8 0 01-8-8V88a8 8 0 1116 0v24h24a8 8 0 110 16H8zM120 0a8 8 0 018 8v32a8 8 0 11-16 0V16H88a8 8 0 110-16h32z\"/></svg>"
        },
        "$:/core/images/github": {
            "title": "$:/core/images/github",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-github tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M63.938 1.607c-35.336 0-63.994 28.69-63.994 64.084 0 28.312 18.336 52.329 43.768 60.802 3.202.59 4.37-1.388 4.37-3.088 0-1.518-.056-5.55-.087-10.897-17.802 3.871-21.558-8.591-21.558-8.591-2.911-7.404-7.108-9.375-7.108-9.375-5.81-3.973.44-3.895.44-3.895 6.424.453 9.803 6.606 9.803 6.606 5.709 9.791 14.981 6.963 18.627 5.322.582-4.138 2.236-6.963 4.063-8.564-14.211-1.617-29.153-7.117-29.153-31.672 0-6.995 2.495-12.718 6.589-17.195-.66-1.621-2.856-8.14.629-16.96 0 0 5.37-1.722 17.597 6.57 5.104-1.424 10.58-2.132 16.022-2.16 5.438.028 10.91.736 16.022 2.16 12.22-8.292 17.582-6.57 17.582-6.57 3.493 8.82 1.297 15.339.64 16.96 4.102 4.477 6.578 10.2 6.578 17.195 0 24.618-14.966 30.035-29.22 31.62 2.295 1.98 4.342 5.89 4.342 11.87 0 8.564-.079 15.476-.079 17.576 0 1.715 1.155 3.71 4.4 3.084 25.413-8.493 43.733-32.494 43.733-60.798 0-35.394-28.657-64.084-64.006-64.084\"/></svg>"
        },
        "$:/core/images/gitter": {
            "title": "$:/core/images/gitter",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-gitter tc-image-button\" viewBox=\"0 0 18 25\"><path d=\"M15 5h2v10h-2zM10 5h2v20h-2zM5 5h2v20H5zM0 0h2v15H0z\"/></svg>"
        },
        "$:/core/images/globe": {
            "title": "$:/core/images/globe",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-globe tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M72.811 37.128v2.554c0 2.196.978 6.881 0 8.832-1.466 2.928-4.65 3.54-6.394 5.867-1.182 1.577-4.618 10.601-3.69 12.92 3.969 9.922 11.534 3.187 17.962 9.293.864.821 2.887 2.273 3.296 3.296 3.29 8.223-7.576 15.009 3.757 26.3 1.245 1.24 3.813-3.817 4.079-4.614.852-2.563 6.725-5.45 9.088-7.053 2.02-1.37 4.873-2.667 6.328-4.745 2.27-3.244 1.48-7.514 3.098-10.745 2.139-4.274 3.828-9.635 5.998-13.966 3.898-7.781 4.721 2.093 5.067 2.439.358.357 1.011 0 1.517 0 .094 0 1.447.099 1.516 0 .65-.935-1.043-17.92-1.318-19.297-1.404-7.01-6.944-15.781-11.865-20.5-6.274-6.015-7.09-16.197-18.259-14.954-.204.022-5.084 10.148-7.777 13.512-3.728 4.657-2.47-4.153-6.526-4.153-.081 0-1.183-.103-1.253 0-.586.88-1.44 3.896-2.306 4.417-.265.16-1.722-.239-1.846 0-2.243 4.3 8.256 2.212 5.792 7.952-2.352 5.481-6.328-1.997-6.328 8.56M44.467 7.01c9.685 6.13.682 12.198 2.694 16.215 1.655 3.303 4.241 5.395 1.714 9.814-2.063 3.608-6.87 3.966-9.623 6.723-3.04 3.044-5.464 8.94-6.79 12.911-1.617 4.843 14.547 6.866 12.063 11.008-1.386 2.311-6.746 1.466-8.437.198-1.165-.873-3.593-.546-4.417-1.78-2.613-3.915-2.26-8.023-3.625-12.128-.938-2.822-6.313-2.12-7.844-.593-.523.522-.33 1.792-.33 2.505 0 5.285 7.12 3.316 7.12 6.46 0 14.636 3.927 6.534 11.14 11.336 10.036 6.683 7.844 7.303 14.946 14.404 3.673 3.673 7.741 3.686 9.425 9.294 1.602 5.331-9.327 5.339-11.716 7.448-1.123.991-2.813 4.146-4.219 4.615-1.792.598-3.234.496-4.944 1.78-2.427 1.82-3.9 4.932-4.02 4.81-2.148-2.147-3.52-15.479-3.89-18.257-.588-4.42-5.59-5.54-6.986-9.03-1.57-3.927 1.524-9.52-1.129-13.761-6.52-10.424-11.821-14.5-15.35-26.292-.942-3.148 3.342-6.529 4.877-8.833 1.877-2.816 2.662-5.854 4.746-8.635C22.147 24.19 40.855 9.461 43.857 8.635l.61-1.625z\"/><path d=\"M64 126c34.242 0 62-27.758 62-62 0-34.242-27.758-62-62-62C29.758 2 2 29.758 2 64c0 34.242 27.758 62 62 62zm0-6c30.928 0 56-25.072 56-56S94.928 8 64 8 8 33.072 8 64s25.072 56 56 56z\"/></g></svg>"
        },
        "$:/core/images/heading-1": {
            "title": "$:/core/images/heading-1",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-1 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M14 30h13.25v30.104H61.7V30h13.25v75.684H61.7V71.552H27.25v34.132H14V30zm70.335 13.78c2.544 0 5.017-.212 7.42-.636 2.403-.424 4.576-1.13 6.52-2.12 1.942-.99 3.603-2.261 4.981-3.816 1.378-1.555 2.28-3.463 2.703-5.724h9.858v74.2h-13.25V53.32H84.335v-9.54z\"/></svg>"
        },
        "$:/core/images/heading-2": {
            "title": "$:/core/images/heading-2",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-2 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm119.52 75.684H74.85c.07-6.148 1.555-11.519 4.452-16.112 2.897-4.593 6.855-8.586 11.872-11.978a133.725 133.725 0 017.526-5.141 59.6 59.6 0 007.208-5.353c2.19-1.908 3.993-3.975 5.406-6.201 1.413-2.226 2.155-4.788 2.226-7.685 0-1.343-.159-2.774-.477-4.293a11.357 11.357 0 00-1.855-4.24c-.919-1.307-2.19-2.403-3.816-3.286-1.625-.883-3.745-1.325-6.36-1.325-2.403 0-4.399.477-5.989 1.431-1.59.954-2.862 2.261-3.816 3.922-.954 1.66-1.66 3.622-2.12 5.883-.46 2.261-.724 4.7-.795 7.314H76.23c0-4.099.548-7.897 1.643-11.395 1.095-3.498 2.738-6.519 4.93-9.063 2.19-2.544 4.857-4.54 8.002-5.989C93.95 30.724 97.606 30 101.775 30c4.523 0 8.303.742 11.342 2.226 3.039 1.484 5.494 3.357 7.367 5.618 1.873 2.261 3.198 4.717 3.975 7.367.777 2.65 1.166 5.176 1.166 7.579 0 2.968-.46 5.653-1.378 8.056a25.942 25.942 0 01-3.71 6.625 37.5 37.5 0 01-5.3 5.565 79.468 79.468 0 01-6.148 4.77 165.627 165.627 0 01-6.36 4.24 94.28 94.28 0 00-5.883 4.028c-1.802 1.343-3.374 2.738-4.717 4.187-1.343 1.449-2.261 2.986-2.756 4.611h36.146v10.812z\"/></svg>"
        },
        "$:/core/images/heading-3": {
            "title": "$:/core/images/heading-3",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-3 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm88.885 32.224c1.979.07 3.957-.07 5.936-.424 1.979-.353 3.745-.972 5.3-1.855a10.365 10.365 0 003.763-3.657c.954-1.555 1.431-3.463 1.431-5.724 0-3.18-1.078-5.724-3.233-7.632-2.155-1.908-4.929-2.862-8.32-2.862-2.12 0-3.958.424-5.513 1.272a11.318 11.318 0 00-3.869 3.445c-1.025 1.449-1.784 3.074-2.279 4.876a18.335 18.335 0 00-.636 5.565H75.381c.141-3.604.813-6.943 2.014-10.017 1.201-3.074 2.844-5.742 4.93-8.003 2.084-2.261 4.61-4.028 7.578-5.3C92.871 30.636 96.228 30 99.973 30a29.2 29.2 0 018.533 1.272c2.791.848 5.3 2.085 7.526 3.71s4.01 3.692 5.353 6.201c1.343 2.509 2.014 5.388 2.014 8.639 0 3.745-.848 7.014-2.544 9.805-1.696 2.791-4.346 4.823-7.95 6.095v.212c4.24.848 7.544 2.95 9.911 6.307s3.551 7.438 3.551 12.243c0 3.533-.707 6.696-2.12 9.487a21.538 21.538 0 01-5.724 7.102c-2.403 1.943-5.194 3.445-8.374 4.505-3.18 1.06-6.537 1.59-10.07 1.59-4.31 0-8.074-.618-11.289-1.855s-5.9-2.986-8.056-5.247c-2.155-2.261-3.798-4.982-4.929-8.162-1.13-3.18-1.731-6.713-1.802-10.6h12.084c-.141 4.523.972 8.286 3.34 11.289 2.366 3.003 5.917 4.505 10.652 4.505 4.028 0 7.402-1.148 10.123-3.445 2.72-2.297 4.081-5.565 4.081-9.805 0-2.897-.565-5.194-1.696-6.89a10.97 10.97 0 00-4.452-3.869c-1.837-.883-3.904-1.431-6.2-1.643a58.067 58.067 0 00-7.05-.212v-9.01z\"/></svg>"
        },
        "$:/core/images/heading-4": {
            "title": "$:/core/images/heading-4",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-4 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8 30h13.25v30.104H55.7V30h13.25v75.684H55.7V71.552H21.25v34.132H8V30zm76.59 48.548h22.471V45.9h-.212L84.59 78.548zm43.46 9.54h-9.54v17.596H107.06V88.088h-31.8V76.11l31.8-44.626h11.448v47.064h9.54v9.54z\"/></svg>"
        },
        "$:/core/images/heading-5": {
            "title": "$:/core/images/heading-5",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-5 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm77.755 1.484h38.372v10.812H92.765L88.95 61.164l.212.212c1.625-1.837 3.692-3.233 6.201-4.187 2.509-.954 5-1.431 7.473-1.431 3.675 0 6.96.618 9.858 1.855 2.897 1.237 5.335 2.968 7.314 5.194s3.48 4.858 4.505 7.897c1.025 3.039 1.537 6.325 1.537 9.858 0 2.968-.477 6.024-1.43 9.169a25.161 25.161 0 01-4.559 8.586c-2.085 2.58-4.752 4.7-8.003 6.36-3.25 1.66-7.137 2.491-11.66 2.491-3.604 0-6.943-.477-10.017-1.431-3.074-.954-5.777-2.385-8.109-4.293-2.332-1.908-4.187-4.258-5.565-7.049-1.378-2.791-2.138-6.06-2.279-9.805h12.084c.353 4.028 1.731 7.12 4.134 9.275 2.403 2.155 5.583 3.233 9.54 3.233 2.544 0 4.7-.424 6.466-1.272 1.767-.848 3.198-2.014 4.293-3.498 1.095-1.484 1.873-3.215 2.332-5.194.46-1.979.69-4.099.69-6.36 0-2.05-.284-4.01-.849-5.883-.565-1.873-1.413-3.516-2.544-4.929-1.13-1.413-2.597-2.544-4.399-3.392-1.802-.848-3.904-1.272-6.307-1.272-2.544 0-4.929.477-7.155 1.431-2.226.954-3.834 2.738-4.823 5.353H75.805l7.95-40.598z\"/></svg>"
        },
        "$:/core/images/heading-6": {
            "title": "$:/core/images/heading-6",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-6 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm106.587 20.246c-.283-3.039-1.36-5.494-3.233-7.367-1.873-1.873-4.399-2.809-7.579-2.809-2.19 0-4.08.406-5.67 1.219a12.435 12.435 0 00-4.029 3.233c-1.095 1.343-1.979 2.88-2.65 4.611a37.696 37.696 0 00-1.643 5.459 46.08 46.08 0 00-.9 5.671 722.213 722.213 0 00-.478 5.247l.212.212c1.625-2.968 3.87-5.176 6.731-6.625 2.862-1.449 5.954-2.173 9.275-2.173 3.675 0 6.96.636 9.858 1.908 2.897 1.272 5.353 3.021 7.367 5.247 2.014 2.226 3.551 4.858 4.611 7.897 1.06 3.039 1.59 6.325 1.59 9.858 0 3.604-.583 6.943-1.749 10.017-1.166 3.074-2.844 5.76-5.035 8.056-2.19 2.297-4.805 4.081-7.844 5.353-3.039 1.272-6.395 1.908-10.07 1.908-5.441 0-9.91-1.007-13.409-3.021-3.498-2.014-6.254-4.77-8.268-8.268-2.014-3.498-3.41-7.597-4.187-12.296-.777-4.7-1.166-9.77-1.166-15.211 0-4.452.477-8.94 1.431-13.462.954-4.523 2.526-8.639 4.717-12.349 2.19-3.71 5.07-6.731 8.64-9.063C92.676 31.166 97.075 30 102.304 30c2.968 0 5.76.495 8.374 1.484 2.615.99 4.93 2.367 6.943 4.134 2.014 1.767 3.657 3.887 4.93 6.36 1.271 2.473 1.978 5.23 2.12 8.268h-12.085zm-11.66 46.852c2.19 0 4.099-.442 5.724-1.325a12.869 12.869 0 004.081-3.445c1.095-1.413 1.908-3.056 2.438-4.929.53-1.873.795-3.798.795-5.777s-.265-3.887-.795-5.724c-.53-1.837-1.343-3.445-2.438-4.823-1.095-1.378-2.456-2.491-4.08-3.339-1.626-.848-3.534-1.272-5.725-1.272-2.19 0-4.116.406-5.777 1.219-1.66.813-3.056 1.908-4.187 3.286-1.13 1.378-1.979 2.986-2.544 4.823-.565 1.837-.848 3.78-.848 5.83 0 2.05.283 3.993.848 5.83.565 1.837 1.413 3.48 2.544 4.929a12.39 12.39 0 004.187 3.445c1.66.848 3.586 1.272 5.777 1.272z\"/></svg>"
        },
        "$:/core/images/help": {
            "title": "$:/core/images/help",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-help tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M36.055 111.441c-5.24 4.396-15.168 7.362-26.555 7.362-1.635 0-3.24-.06-4.806-.179 7.919-2.64 14.062-8.6 16.367-16.014C8.747 92.845 1.05 78.936 1.05 63.5c0-29.547 28.206-53.5 63-53.5s63 23.953 63 53.5-28.206 53.5-63 53.5c-10.055 0-19.56-2-27.994-5.559zm35.35-33.843a536.471 536.471 0 00.018-4.682 199.02 199.02 0 00-.023-3.042c.008-1.357.595-2.087 3.727-4.235.112-.077 1.085-.74 1.386-.948 3.093-2.133 5.022-3.786 6.762-6.187 2.34-3.228 3.558-7.077 3.558-11.649 0-13.292-9.86-21.952-21.455-21.952-11.103 0-22.499 9.609-24.066 22.295a6.023 6.023 0 1011.956 1.477c.806-6.527 6.972-11.726 12.11-11.726 5.265 0 9.408 3.64 9.408 9.906 0 3.634-1.1 5.153-5.111 7.919l-1.362.93c-2.682 1.84-4.227 3.1-5.7 4.931-2.109 2.62-3.242 5.717-3.258 9.314.013.892.02 1.86.022 2.981a470.766 470.766 0 01-.022 4.943 6.023 6.023 0 1012.046.12l.003-.395zm-6.027 24.499a7.529 7.529 0 100-15.058 7.529 7.529 0 000 15.058z\"/></svg>"
        },
        "$:/core/images/home-button": {
            "title": "$:/core/images/home-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112.985 119.502c.01-.165.015-.331.015-.499V67.568c3.137 2.948 8.076 2.884 11.134-.174a7.999 7.999 0 00-.002-11.316L70.396 2.343A7.978 7.978 0 0064.734 0a7.957 7.957 0 00-5.656 2.343L33 28.42V8.007C33 3.585 29.41 0 25 0c-4.418 0-8 3.59-8 8.007V44.42L5.342 56.078c-3.125 3.125-3.12 8.198-.002 11.316a7.999 7.999 0 0011.316-.003l.344-.343v52.945a8.11 8.11 0 000 .007c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8a8.11 8.11 0 00-.015-.498zM97 112V51.574L64.737 19.31 33 51.048V112h64z\"/></svg>"
        },
        "$:/core/images/import-button": {
            "title": "$:/core/images/import-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-import-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M114.832 60.436s3.235-3.27 6.921.417c3.686 3.686.231 7.14.231 7.14l-42.153 42.92s-30.765 32.367-58.798 4.333C-7 87.213 24.59 55.623 24.59 55.623L67.363 12.85s22.725-24.6 43.587-3.738c20.862 20.862-3.96 43.09-3.96 43.09l-35.04 35.04S49.903 112.546 36.426 99.07c-13.476-13.477 11.83-35.523 11.83-35.523l35.04-35.04s3.902-3.902 7.78-.023c3.879 3.878.118 7.921.118 7.921l-35.04 35.04s-13.212 13.212-8.872 17.551c4.34 4.34 16.77-9.653 16.77-9.653l35.04-35.04s16.668-14.598 3.966-27.3c-13.893-13.892-27.565 3.702-27.565 3.702l-42.91 42.91s-23.698 23.698-3.658 43.738 43.012-4.385 43.012-4.385l42.895-42.533z\"/></svg>"
        },
        "$:/core/images/info-button": {
            "title": "$:/core/images/info-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(.05)\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\"/><circle cx=\"64\" cy=\"32\" r=\"8\"/><rect width=\"16\" height=\"56\" x=\"56\" y=\"48\" rx=\"8\"/></g></svg>"
        },
        "$:/core/images/italic": {
            "title": "$:/core/images/italic",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-italic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M66.711 0h22.41L62.408 128H40z\"/></svg>"
        },
        "$:/core/images/left-arrow": {
            "title": "$:/core/images/left-arrow",
            "created": "20150315234410875",
            "modified": "20150315235324760",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-left-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 64.177c0-2.026.771-4.054 2.317-5.6l55.98-55.98a7.92 7.92 0 0111.195.001c3.086 3.085 3.092 8.104.001 11.195L19.111 64.175l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.086-8.105 3.092-11.196.001l-55.98-55.98A7.892 7.892 0 010 64.177z\"/></svg>"
        },
        "$:/core/images/line-width": {
            "title": "$:/core/images/line-width",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-line-width tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M16 18h96a2 2 0 000-4H16a2 2 0 100 4zm0 17h96a4 4 0 100-8H16a4 4 0 100 8zm0 21h96a6 6 0 000-12H16a6 6 0 100 12zm0 29h96c5.523 0 10-4.477 10-10s-4.477-10-10-10H16c-5.523 0-10 4.477-10 10s4.477 10 10 10zm0 43h96c8.837 0 16-7.163 16-16s-7.163-16-16-16H16c-8.837 0-16 7.163-16 16s7.163 16 16 16z\"/></svg>"
        },
        "$:/core/images/link": {
            "title": "$:/core/images/link",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-link tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M42.263 69.38a31.919 31.919 0 006.841 10.13c12.5 12.5 32.758 12.496 45.255 0l22.627-22.628c12.502-12.501 12.497-32.758 0-45.255-12.5-12.5-32.758-12.496-45.254 0L49.104 34.255a32.333 32.333 0 00-2.666 3.019 36.156 36.156 0 0121.94.334l14.663-14.663c6.25-6.25 16.382-6.254 22.632-.004 6.248 6.249 6.254 16.373-.004 22.631l-22.62 22.62c-6.25 6.25-16.381 6.254-22.631.004a15.93 15.93 0 01-4.428-8.433 11.948 11.948 0 00-7.59 3.48l-6.137 6.137z\"/><path d=\"M86.35 59.234a31.919 31.919 0 00-6.84-10.13c-12.5-12.5-32.758-12.497-45.255 0L11.627 71.732c-12.501 12.5-12.496 32.758 0 45.254 12.5 12.5 32.758 12.497 45.255 0L79.51 94.36a32.333 32.333 0 002.665-3.02 36.156 36.156 0 01-21.94-.333l-14.663 14.663c-6.25 6.25-16.381 6.253-22.63.004-6.25-6.249-6.255-16.374.003-22.632l22.62-22.62c6.25-6.25 16.381-6.253 22.631-.003a15.93 15.93 0 014.428 8.432 11.948 11.948 0 007.59-3.48l6.137-6.136z\"/></g></svg>"
        },
        "$:/core/images/linkify": {
            "title": "$:/core/images/linkify",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-linkify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M17.031 31.919H9.048V96.85h7.983v6.92H0V25h17.031v6.919zm24.66 0h-7.983V96.85h7.983v6.92H24.66V25h17.03v6.919zM67.77 56.422l11.975-3.903 2.306 7.096-12.063 3.903 7.628 10.379-6.12 4.435-7.63-10.467-7.45 10.2-5.943-4.523L58.1 63.518 45.95 59.35l2.306-7.096 12.064 4.17V43.825h7.45v12.596zM86.31 96.85h7.982V31.92H86.31V25h17.031v78.77H86.31v-6.92zm24.659 0h7.983V31.92h-7.983V25H128v78.77h-17.031v-6.92z\"/></svg>"
        },
        "$:/core/images/list-bullet": {
            "title": "$:/core/images/list-bullet",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-bullet tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M11.636 40.273c6.427 0 11.637-5.21 11.637-11.637C23.273 22.21 18.063 17 11.636 17 5.21 17 0 22.21 0 28.636c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.637 0-6.426-5.21-11.636-11.637-11.636C5.21 51.91 0 57.12 0 63.545c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.636 0-6.427-5.21-11.637-11.637-11.637C5.21 86.818 0 92.028 0 98.455c0 6.426 5.21 11.636 11.636 11.636zM34.91 22.818H128v11.637H34.91V22.818zm0 34.91H128v11.636H34.91V57.727zm0 34.908H128v11.637H34.91V92.636z\"/></svg>"
        },
        "$:/core/images/list-number": {
            "title": "$:/core/images/list-number",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-number tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M33.84 22.356H128v11.77H33.84v-11.77zm0 35.31H128v11.77H33.84v-11.77zm0 35.311H128v11.77H33.84v-11.77zM.38 42.631v-2.223h.998c.826 0 1.445-.14 1.858-.42.413-.28.619-.948.619-2.002V22.769c0-1.442-.193-2.336-.58-2.683-.385-.347-1.477-.52-3.275-.52v-2.143c3.502-.147 6.252-.955 8.25-2.423h2.117v22.865c0 .921.15 1.575.449 1.963.3.387.949.58 1.948.58h.998v2.223H.38zm-.3 35.356v-1.902c7.19-6.554 10.786-12.58 10.786-18.08 0-1.562-.326-2.81-.979-3.744-.652-.934-1.524-1.402-2.616-1.402-.893 0-1.655.317-2.287.952-.633.634-.95 1.364-.95 2.192 0 .974.247 1.829.74 2.563.106.16.16.28.16.36 0 .147-.16.28-.48.4-.213.08-.752.308-1.618.681-.839.374-1.358.561-1.558.561-.24 0-.512-.37-.819-1.111A6.2 6.2 0 010 57.064c0-1.949.849-3.544 2.547-4.785 1.698-1.242 3.798-1.862 6.302-1.862 2.463 0 4.53.67 6.202 2.012 1.67 1.341 2.506 3.093 2.506 5.256a8.644 8.644 0 01-.849 3.724c-.566 1.201-1.92 3.053-4.064 5.556a165.471 165.471 0 01-6.272 6.938h11.445l-1.019 5.726h-2.117c.08-.28.12-.534.12-.76 0-.388-.1-.631-.3-.731-.2-.1-.599-.15-1.198-.15H.08zm12.124 19.207c1.745.04 3.236.637 4.474 1.792 1.239 1.154 1.858 2.773 1.858 4.855 0 2.99-1.132 5.393-3.396 7.208-2.263 1.815-5 2.723-8.209 2.723-2.01 0-3.669-.384-4.974-1.151C.652 111.853 0 110.849 0 109.607c0-.774.27-1.398.809-1.872.54-.474 1.128-.71 1.768-.71.639 0 1.162.2 1.568.6.406.4.782 1.055 1.128 1.962.466 1.268 1.239 1.902 2.317 1.902 1.265 0 2.287-.477 3.066-1.431.78-.955 1.169-2.686 1.169-5.196 0-1.709-.12-3.023-.36-3.944-.24-.921-.792-1.382-1.658-1.382-.586 0-1.185.307-1.797.921-.493.494-.932.741-1.319.741-.333 0-.602-.147-.809-.44-.206-.294-.31-.574-.31-.841 0-.32.104-.594.31-.821.207-.227.69-.594 1.449-1.102 2.876-1.922 4.314-4.017 4.314-6.287 0-1.188-.306-2.092-.919-2.713a3.001 3.001 0 00-2.217-.93c-.799 0-1.525.263-2.177.79-.653.528-.979 1.158-.979 1.892 0 .641.253 1.235.76 1.782.172.2.259.367.259.5 0 .121-.57.428-1.708.922-1.139.494-1.854.74-2.147.74-.413 0-.75-.333-1.009-1-.26-.668-.39-1.282-.39-1.842 0-1.749.93-3.224 2.787-4.425 1.858-1.202 3.965-1.802 6.322-1.802 2.064 0 3.851.447 5.363 1.341 1.511.895 2.267 2.116 2.267 3.664 0 1.362-.57 2.623-1.708 3.784a13.387 13.387 0 01-3.945 2.784z\"/></svg>"
        },
        "$:/core/images/list": {
            "title": "$:/core/images/list",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M87.748 128H23.999c-4.418 0-7.999-3.59-7.999-8.007V8.007C16 3.585 19.588 0 24 0h80c4.419 0 8 3.59 8 8.007V104H91.25c-.965 0-1.84.392-2.473 1.025a3.476 3.476 0 00-1.029 2.476V128zm8-.12l15.88-15.88h-15.88v15.88zM40 15.508A3.502 3.502 0 0143.5 12h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 20h-55a3.498 3.498 0 01-3.5-3.509v-.982zM32 22a6 6 0 100-12 6 6 0 000 12zm8 9.509A3.502 3.502 0 0143.5 28h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 36h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 44h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 52h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 60h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 68h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 76h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 84h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 92h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 100h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.505 3.505 0 0143.497 108h33.006A3.497 3.497 0 0180 111.509v.982A3.505 3.505 0 0176.503 116H43.497A3.497 3.497 0 0140 112.491v-.982zM32 38a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12z\"/></svg>"
        },
        "$:/core/images/locked-padlock": {
            "title": "$:/core/images/locked-padlock",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-locked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M96.472 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h8c.003-15.723.303-47.731 32.16-47.731 31.794 0 32.305 32.057 32.312 47.731zm-15.897 0H48.44c.002-16.287.142-32 15.719-32 15.684 0 16.977 16.136 16.415 32zM67.732 92.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
        },
        "$:/core/images/mail": {
            "title": "$:/core/images/mail",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mail tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M122.827 104.894a7.986 7.986 0 01-2.834.516H8.007c-.812 0-1.597-.12-2.335-.345l34.163-34.163 20.842 20.842a3.998 3.998 0 003.418 1.134 4.003 4.003 0 003.395-1.134L88.594 70.64c.075.09.155.176.24.26l33.993 33.994zm5.076-6.237c.064-.406.097-.823.097-1.247v-64c0-.669-.082-1.318-.237-1.94L94.23 65.006c.09.075.177.154.261.239l33.413 33.413zm-127.698.56A8.023 8.023 0 010 97.41v-64c0-.716.094-1.41.271-2.071l33.907 33.906L.205 99.218zM5.93 25.684a8.012 8.012 0 012.078-.273h111.986c.766 0 1.507.108 2.209.308L64.083 83.837 5.93 25.683z\"/></svg>"
        },
        "$:/core/images/menu-button": {
            "title": "$:/core/images/menu-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 128 128\"><rect width=\"128\" height=\"16\" y=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"56\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"96\" rx=\"8\"/></svg>"
        },
        "$:/core/images/mono-block": {
            "title": "$:/core/images/mono-block",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-block tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M23.965 32.967h.357c.755 0 1.328.192 1.72.577.39.384.586.947.586 1.688 0 .824-.206 1.418-.618 1.782-.413.363-1.094.545-2.045.545h-6.31c-.965 0-1.65-.178-2.056-.535-.405-.356-.608-.954-.608-1.792 0-.811.203-1.391.608-1.74.406-.35 1.09-.525 2.055-.525h.734l-.86-2.453H8.471l-.902 2.453h.734c.95 0 1.632.178 2.044.535.413.356.619.933.619 1.73 0 .824-.206 1.418-.619 1.782-.412.363-1.094.545-2.044.545h-5.41c-.964 0-1.649-.182-2.054-.545-.406-.364-.608-.958-.608-1.782 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.719-.577h.356l5.62-15.641H6.835c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.95-.619-1.76 0-.825.207-1.42.619-1.783.412-.363 1.094-.545 2.044-.545h7.863c1.244 0 2.118.67 2.62 2.013v.063l6.647 18.2zM12.98 17.326l-3.04 8.848h6.08l-3.04-8.848zm22.402 9.372v6.395h3.145c2.223 0 3.788-.245 4.697-.734.908-.49 1.362-1.307 1.362-2.453 0-1.16-.433-1.985-1.3-2.474-.866-.49-2.383-.734-4.55-.734h-3.354zm10.693-2.327c1.524.559 2.642 1.324 3.355 2.295.713.972 1.07 2.212 1.07 3.722 0 1.272-.308 2.432-.923 3.48-.615 1.049-1.496 1.909-2.642 2.58a7.499 7.499 0 01-2.254.849c-.832.174-2.01.262-3.533.262H30.202c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.782 0-.741.189-1.304.566-1.688.378-.385.93-.577 1.657-.577h.356V17.326h-.356c-.727 0-1.28-.196-1.657-.587-.377-.392-.566-.965-.566-1.72 0-.81.203-1.401.608-1.771.406-.37 1.062-.556 1.971-.556h9.645c2.95 0 5.19.573 6.72 1.72 1.53 1.145 2.296 2.823 2.296 5.031 0 1.09-.234 2.052-.703 2.883-.468.832-1.163 1.513-2.086 2.045zM35.381 17.2v5.284h2.83c1.72 0 2.932-.203 3.638-.609.706-.405 1.06-1.09 1.06-2.054 0-.909-.319-1.573-.955-1.992-.636-.42-1.667-.63-3.093-.63h-3.48zm35.863-3.816c.28-.503.566-.86.86-1.07.293-.21.664-.314 1.111-.314.685 0 1.17.182 1.457.545.287.364.43.986.43 1.866l.042 5.452c0 .964-.157 1.614-.472 1.95-.314.335-.884.503-1.709.503-.587 0-1.037-.14-1.352-.42-.314-.28-.584-.796-.807-1.551-.364-1.328-.944-2.282-1.74-2.862-.797-.58-1.901-.87-3.313-.87-2.153 0-3.802.727-4.948 2.18-1.147 1.454-1.72 3.558-1.72 6.311 0 2.74.58 4.844 1.74 6.311 1.16 1.468 2.817 2.202 4.97 2.202 1.467 0 3.085-.49 4.854-1.468 1.768-.978 2.883-1.467 3.344-1.467.545 0 1.003.23 1.373.692.37.46.556 1.034.556 1.719 0 1.23-1.084 2.39-3.25 3.48-2.167 1.09-4.606 1.636-7.318 1.636-3.662 0-6.625-1.21-8.89-3.627-2.264-2.419-3.396-5.578-3.396-9.478 0-3.76 1.146-6.884 3.438-9.372 2.293-2.488 5.2-3.732 8.723-3.732.992 0 1.97.112 2.935.335.964.224 1.992.574 3.082 1.049zm10.22 19.583V17.326h-.356c-.755 0-1.328-.196-1.72-.587-.39-.392-.586-.965-.586-1.72 0-.81.21-1.401.629-1.771.42-.37 1.097-.556 2.034-.556h5.178c2.922 0 5.06.126 6.416.377 1.356.252 2.51.671 3.46 1.258 1.691 1.007 2.988 2.443 3.89 4.31.9 1.865 1.352 4.021 1.352 6.467 0 2.586-.514 4.847-1.541 6.783-1.028 1.936-2.485 3.4-4.372 4.393-.853.447-1.852.772-2.998.975-1.147.203-2.852.304-5.116.304h-6.269c-.965 0-1.65-.178-2.055-.535-.406-.356-.608-.954-.608-1.792 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.72-.577h.356zm5.41-15.725v15.725h1.195c2.642 0 4.592-.646 5.85-1.94 1.258-1.292 1.887-3.28 1.887-5.965 0-2.641-.64-4.612-1.918-5.912-1.28-1.3-3.205-1.95-5.777-1.95-.335 0-.59.003-.765.01a7.992 7.992 0 00-.472.032zm35.067-.126h-9.75v5.368h3.69v-.252c0-.797.175-1.39.524-1.782.35-.392.88-.587 1.594-.587.629 0 1.142.178 1.54.534.4.357.598.808.598 1.353 0 .028.007.118.021.272.014.154.021.308.021.462v4.34c0 .936-.167 1.607-.503 2.013-.335.405-.88.608-1.635.608-.713 0-1.251-.19-1.615-.567-.363-.377-.545-.936-.545-1.677v-.377h-3.69v6.269h9.75v-2.495c0-.937.178-1.608.534-2.013.357-.405.94-.608 1.75-.608.798 0 1.367.2 1.71.597.342.399.513 1.073.513 2.024v5.074c0 .755-.146 1.258-.44 1.51-.293.251-.873.377-1.74.377h-17.172c-.923 0-1.583-.182-1.982-.545-.398-.364-.597-.958-.597-1.782 0-.741.189-1.304.566-1.688.377-.385.93-.577 1.656-.577h.357V17.326h-.357c-.712 0-1.261-.2-1.646-.598-.384-.398-.576-.968-.576-1.709 0-.81.203-1.401.608-1.771.405-.37 1.062-.556 1.97-.556h17.173c.853 0 1.43.13 1.73.388.3.258.45.772.45 1.54v4.698c0 .95-.174 1.631-.524 2.044-.35.412-.915.618-1.698.618-.81 0-1.394-.21-1.75-.629-.357-.419-.535-1.097-.535-2.033v-2.202zM19.77 47.641c.267-.504.55-.86.85-1.07.3-.21.675-.314 1.122-.314.685 0 1.17.181 1.457.545.287.363.43.985.43 1.866l.042 5.451c0 .965-.157 1.615-.472 1.95-.314.336-.891.504-1.73.504-.587 0-1.045-.144-1.373-.43-.329-.287-.598-.8-.807-1.541-.378-1.342-.958-2.3-1.74-2.873-.783-.573-1.88-.86-3.292-.86-2.153 0-3.799.727-4.938 2.181-1.14 1.454-1.709 3.557-1.709 6.311s.598 4.882 1.793 6.385C10.599 67.248 12.294 68 14.488 68c.503 0 1.077-.06 1.72-.179a23.809 23.809 0 002.264-.555v-3.313h-2.37c-.95 0-1.624-.175-2.023-.524-.398-.35-.597-.93-.597-1.74 0-.84.199-1.437.597-1.793.399-.357 1.073-.535 2.024-.535h7.569c.978 0 1.667.175 2.065.524.398.35.598.937.598 1.762 0 .74-.2 1.31-.598 1.708-.398.399-.975.598-1.73.598h-.335v5.242c0 .447-.05.758-.147.933-.098.174-.293.353-.587.534-.797.476-2.062.895-3.795 1.258a25.576 25.576 0 01-5.263.546c-3.662 0-6.625-1.21-8.89-3.628-2.264-2.418-3.397-5.577-3.397-9.477 0-3.76 1.147-6.884 3.44-9.372 2.292-2.488 5.199-3.732 8.721-3.732.979 0 1.954.112 2.925.335.972.224 2.003.573 3.093 1.049zm15.84 3.941v4.823h6.857v-4.823h-.336c-.754 0-1.331-.195-1.73-.587-.398-.391-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.364 1.093-.545 2.044-.545h5.41c.95 0 1.624.181 2.023.545.398.363.597.957.597 1.782 0 .755-.192 1.328-.576 1.72-.385.39-.947.586-1.688.586h-.357v15.642h.357c.755 0 1.328.192 1.719.576.391.385.587.947.587 1.688 0 .825-.203 1.419-.608 1.782-.405.364-1.09.546-2.055.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.2-1.303.598-1.688.398-.384.975-.576 1.73-.576h.335v-6.186h-6.856v6.186h.335c.755 0 1.331.192 1.73.576.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.412.364-1.094.546-2.044.546h-5.41c-.964 0-1.65-.179-2.055-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.392-.384.965-.576 1.72-.576h.356V51.582h-.356c-.741 0-1.304-.195-1.688-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.073-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.335zm31.754 0v15.642h3.523c.95 0 1.632.178 2.044.534.412.357.618.933.618 1.73 0 .811-.21 1.402-.629 1.772-.419.37-1.097.556-2.033.556H58.433c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.957-.619-1.782 0-.81.203-1.39.608-1.74.406-.35 1.09-.524 2.055-.524h3.523V51.582h-3.523c-.95 0-1.632-.181-2.044-.545-.412-.363-.619-.95-.619-1.761 0-.825.203-1.412.608-1.761.406-.35 1.09-.524 2.055-.524h12.455c.992 0 1.684.174 2.075.524.392.35.587.936.587 1.761 0 .81-.202 1.398-.608 1.761-.405.364-1.09.545-2.054.545h-3.523zm30.496 0v11.994c0 1.873-.122 3.228-.367 4.067a5.876 5.876 0 01-1.227 2.244c-.74.852-1.768 1.495-3.082 1.929-1.314.433-2.893.65-4.738.65-1.3 0-2.555-.126-3.764-.378a16.843 16.843 0 01-3.491-1.132c-.615-.28-1.017-.643-1.206-1.09-.188-.448-.283-1.175-.283-2.18v-4.32c0-1.202.175-2.04.525-2.516.349-.475.957-.713 1.824-.713 1.244 0 1.929.915 2.054 2.747.014.321.035.566.063.733.168 1.622.545 2.73 1.133 3.324.587.594 1.523.89 2.81.89 1.593 0 2.714-.422 3.364-1.268.65-.845.975-2.386.975-4.623V51.582H88.93c-.95 0-1.632-.181-2.044-.545-.413-.363-.619-.95-.619-1.761 0-.825.2-1.412.598-1.761.398-.35 1.086-.524 2.065-.524h10.693c.979 0 1.667.174 2.065.524.399.35.598.936.598 1.761 0 .81-.206 1.398-.619 1.761-.412.364-1.093.545-2.044.545h-1.761zm14.644 0v6.353l6.48-6.478c-.728-.084-1.238-.29-1.531-.619-.294-.328-.44-.85-.44-1.562 0-.825.198-1.419.597-1.782.398-.364 1.073-.545 2.023-.545h5.137c.95 0 1.625.181 2.023.545.399.363.598.957.598 1.782 0 .769-.2 1.345-.598 1.73-.398.384-.982.576-1.75.576h-.483l-6.101 6.06c1.132.839 2.167 1.94 3.103 3.302.937 1.363 2.034 3.456 3.292 6.28h.692c.825 0 1.44.188 1.845.566.405.377.608.943.608 1.698 0 .825-.206 1.419-.619 1.782-.412.364-1.093.546-2.044.546h-2.579c-1.132 0-2.048-.762-2.746-2.286-.126-.28-.224-.503-.294-.67-.923-1.958-1.768-3.467-2.537-4.53a16.616 16.616 0 00-2.705-2.914l-1.97 1.887v3.92h.335c.755 0 1.331.193 1.73.577.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.413.364-1.094.546-2.045.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.391-.384.965-.576 1.72-.576h.356V51.582h-.357c-.74 0-1.303-.195-1.687-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.072-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.336zM13.44 96.326l4.005-11.889c.251-.782.6-1.352 1.048-1.709.447-.356 1.041-.534 1.782-.534h3.271c.95 0 1.632.182 2.044.545.413.363.619.957.619 1.782 0 .755-.2 1.328-.598 1.72-.398.39-.975.587-1.73.587h-.335l.587 15.641h.357c.754 0 1.32.192 1.698.577.377.384.566.947.566 1.687 0 .825-.2 1.42-.598 1.783-.398.363-1.072.545-2.023.545h-4.718c-.95 0-1.624-.178-2.023-.535-.398-.356-.597-.954-.597-1.793 0-.74.192-1.303.576-1.687.385-.385.954-.577 1.709-.577h.335l-.293-12.79-3.061 9.52c-.224.712-.542 1.226-.954 1.54-.413.315-.982.472-1.709.472-.727 0-1.303-.157-1.73-.472-.426-.314-.751-.828-.975-1.54l-3.04-9.52-.294 12.79h.336c.755 0 1.324.192 1.709.577.384.384.576.947.576 1.687 0 .825-.202 1.42-.608 1.783-.405.363-1.076.545-2.013.545H2.621c-.937 0-1.608-.182-2.013-.545-.405-.364-.608-.958-.608-1.783 0-.74.192-1.303.577-1.687.384-.385.954-.577 1.708-.577h.336l.608-15.641h-.336c-.754 0-1.331-.196-1.73-.588-.398-.39-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.363 1.093-.545 2.044-.545h3.27c.728 0 1.311.175 1.752.524.44.35.8.923 1.08 1.72l4.109 11.888zm30.454 2.054V86.828H42.74c-.922 0-1.583-.182-1.981-.546-.398-.363-.598-.95-.598-1.76 0-.812.2-1.402.598-1.773.398-.37 1.059-.555 1.981-.555h5.955c.909 0 1.566.185 1.97.555.406.37.609.961.609 1.772 0 .741-.192 1.31-.577 1.709-.384.398-.933.598-1.646.598h-.356v19.038c0 .657-.07 1.069-.21 1.237-.14.167-.454.251-.943.251h-2.097c-.67 0-1.143-.07-1.415-.21-.273-.14-.507-.384-.703-.733l-8.722-15.327v11.385h1.216c.909 0 1.559.175 1.95.524.392.35.587.93.587 1.74 0 .825-.199 1.42-.597 1.783-.399.363-1.045.545-1.94.545h-6.017c-.909 0-1.566-.182-1.971-.545-.406-.364-.608-.958-.608-1.783 0-.74.188-1.303.566-1.687.377-.385.936-.577 1.677-.577h.336V86.828h-.336c-.713 0-1.265-.2-1.656-.598-.392-.398-.587-.968-.587-1.709 0-.81.206-1.401.618-1.772.413-.37 1.066-.555 1.96-.555h3.44c.824 0 1.383.108 1.677.325.293.216.622.653.985 1.31l7.989 14.551zM64.66 86.366c-1.803 0-3.218.727-4.245 2.18-1.028 1.455-1.541 3.474-1.541 6.06 0 2.586.517 4.613 1.551 6.08 1.034 1.468 2.446 2.202 4.235 2.202 1.804 0 3.222-.73 4.257-2.19 1.034-1.461 1.551-3.492 1.551-6.092 0-2.586-.513-4.605-1.54-6.06-1.028-1.453-2.45-2.18-4.268-2.18zm0-4.864c3.44 0 6.27 1.23 8.492 3.69 2.223 2.46 3.334 5.598 3.334 9.414 0 3.844-1.104 6.99-3.313 9.436-2.208 2.446-5.046 3.669-8.513 3.669-3.424 0-6.255-1.234-8.491-3.701-2.237-2.467-3.355-5.602-3.355-9.404 0-3.83 1.108-6.971 3.323-9.424 2.216-2.454 5.057-3.68 8.523-3.68zM87.461 98.17v4.298h2.16c.908 0 1.555.175 1.94.524.384.35.576.93.576 1.74 0 .825-.196 1.42-.587 1.783-.392.363-1.035.545-1.93.545h-7.254c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.783 0-.74.189-1.303.566-1.687.378-.385.93-.577 1.657-.577h.356V86.828h-.356c-.713 0-1.262-.2-1.646-.598-.385-.398-.577-.968-.577-1.709 0-.81.203-1.401.608-1.772.406-.37 1.063-.555 1.971-.555h8.66c3.424 0 6.014.657 7.768 1.97 1.754 1.315 2.631 3.25 2.631 5.809 0 2.697-.873 4.738-2.62 6.122-1.748 1.384-4.34 2.076-7.78 2.076h-3.564zm0-11.343v6.625h2.977c1.65 0 2.89-.28 3.722-.839.832-.559 1.248-1.397 1.248-2.516 0-1.048-.43-1.855-1.29-2.421-.86-.566-2.086-.85-3.68-.85h-2.977zm27.267 20.568l-1.636 1.636a12.37 12.37 0 011.772-.44c.58-.098 1.15-.147 1.709-.147 1.104 0 2.268.164 3.491.492 1.223.329 1.967.493 2.233.493.447 0 1.03-.15 1.75-.45.72-.301 1.206-.452 1.458-.452.517 0 .947.2 1.29.598.342.398.513.898.513 1.5 0 .796-.472 1.474-1.415 2.033-.944.56-2.1.839-3.47.839-.937 0-2.139-.22-3.607-.66-1.467-.441-2.53-.661-3.187-.661-.992 0-2.11.272-3.354.817-1.244.546-2.013.818-2.307.818a2.14 2.14 0 01-1.53-.597c-.42-.399-.63-.878-.63-1.437 0-.391.134-.807.4-1.247.265-.44.733-1.01 1.404-1.709l2.118-2.139c-2.335-.852-4.194-2.386-5.578-4.602-1.384-2.215-2.075-4.763-2.075-7.642 0-3.802 1.104-6.909 3.312-9.32 2.209-2.411 5.053-3.617 8.534-3.617 3.467 0 6.304 1.209 8.513 3.627 2.208 2.418 3.312 5.522 3.312 9.31 0 3.774-1.097 6.884-3.291 9.33-2.195 2.446-4.977 3.67-8.345 3.67a22.5 22.5 0 01-1.384-.043zm1.195-21.03c-1.803 0-3.218.727-4.246 2.18-1.027 1.455-1.54 3.474-1.54 6.06 0 2.586.516 4.613 1.55 6.08 1.035 1.468 2.447 2.202 4.236 2.202 1.803 0 3.222-.73 4.256-2.19 1.035-1.461 1.552-3.492 1.552-6.092 0-2.586-.514-4.605-1.541-6.06-1.028-1.453-2.45-2.18-4.267-2.18z\"/></svg>"
        },
        "$:/core/images/mono-line": {
            "title": "$:/core/images/mono-line",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-line tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.437 84.523h.908c1.922 0 3.381.489 4.378 1.468.997.979 1.495 2.411 1.495 4.298 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388h-16.07c-2.456 0-4.2-.454-5.232-1.361-1.032-.908-1.548-2.43-1.548-4.565 0-2.065.516-3.542 1.548-4.432 1.032-.89 2.776-1.334 5.232-1.334h1.869l-2.19-6.247H20.983l-2.296 6.247h1.87c2.42 0 4.155.453 5.205 1.361 1.05.908 1.575 2.376 1.575 4.405 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388H6.781c-2.456 0-4.2-.463-5.233-1.388C.516 93.9 0 92.389 0 90.289c0-1.887.498-3.32 1.495-4.298.997-.979 2.456-1.468 4.378-1.468h.908l14.308-39.83h-4.271c-2.42 0-4.156-.462-5.206-1.387-1.05-.926-1.575-2.42-1.575-4.485 0-2.1.525-3.613 1.575-4.538 1.05-.926 2.785-1.388 5.206-1.388h20.021c3.168 0 5.392 1.708 6.674 5.125v.16l16.924 46.343zm-27.976-39.83L24.72 67.225h15.483l-7.742-22.53zM89.506 68.56v16.284h8.008c5.66 0 9.646-.623 11.96-1.869 2.313-1.245 3.47-3.328 3.47-6.246 0-2.955-1.103-5.055-3.31-6.3-2.207-1.246-6.069-1.869-11.586-1.869h-8.542zm27.229-5.926c3.88 1.423 6.727 3.372 8.542 5.846 1.815 2.474 2.723 5.633 2.723 9.477 0 3.239-.783 6.193-2.35 8.862-1.565 2.67-3.808 4.859-6.726 6.567-1.709.997-3.622 1.718-5.74 2.163-2.118.445-5.116.667-8.996.667h-27.87c-2.349 0-4.03-.463-5.045-1.388-1.014-.926-1.521-2.438-1.521-4.538 0-1.887.48-3.32 1.441-4.298.961-.979 2.367-1.468 4.218-1.468h.907v-39.83h-.907c-1.851 0-3.257-.498-4.218-1.494-.961-.997-1.441-2.456-1.441-4.378 0-2.065.516-3.568 1.548-4.512 1.032-.943 2.705-1.414 5.018-1.414h24.56c7.51 0 13.214 1.459 17.111 4.377 3.898 2.92 5.847 7.19 5.847 12.814 0 2.776-.597 5.223-1.789 7.341-1.192 2.118-2.963 3.853-5.312 5.206zm-27.23-18.26v13.455h7.208c4.378 0 7.466-.516 9.264-1.549 1.797-1.032 2.696-2.776 2.696-5.232 0-2.313-.81-4.004-2.43-5.072-1.619-1.068-4.244-1.602-7.874-1.602h-8.863z\"/></svg>"
        },
        "$:/core/images/new-button": {
            "title": "$:/core/images/new-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 72H8.007C3.591 72 0 68.418 0 64c0-4.41 3.585-8 8.007-8H56V8.007C56 3.591 59.582 0 64 0c4.41 0 8 3.585 8 8.007V56h47.993c4.416 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H72v47.993c0 4.416-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V72z\"/></svg>"
        },
        "$:/core/images/new-here-button": {
            "title": "$:/core/images/new-here-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-here-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.838 20.935l-3.572.938c-3.688.968-8.23 4.43-10.136 7.731L3.37 96.738c-1.905 3.3-.771 7.524 2.534 9.432l33.717 19.466c3.297 1.904 7.53.78 9.435-2.521l38.76-67.134c1.905-3.3 2.632-8.963 1.623-12.646L83.285 20.88c-1.009-3.68-4.821-5.884-8.513-4.915l-7.603 1.995.043.287c.524 3.394 2.053 7.498 4.18 11.55.418.163.829.36 1.23.59a8.864 8.864 0 014.438 8.169c.104.132.21.264.316.395l-.386.318a8.663 8.663 0 01-1.082 3.137c-2.42 4.192-7.816 5.608-12.051 3.163-4.12-2.379-5.624-7.534-3.476-11.671-2.177-4.394-3.788-8.874-4.543-12.964z\"/><path d=\"M69.554 44.76c-5.944-7.476-10.74-17.196-11.955-25.059-1.68-10.875 3.503-18.216 15.082-18.04 10.407.158 19.975 5.851 24.728 13.785 5.208 8.695 2.95 17.868-6.855 20.496l-2.037-7.601c4.232-1.134 4.999-4.248 2.24-8.853-3.37-5.626-10.465-9.848-18.146-9.965-6.392-.097-8.31 2.62-7.323 9.01.999 6.465 5.318 15.138 10.582 21.65l-.072.06c.559 1.553-4.17 6.44-5.938 4.888l-.005.004-.028-.034a1.323 1.323 0 01-.124-.135 2.618 2.618 0 01-.149-.205z\"/><rect width=\"16\" height=\"48\" x=\"96\" y=\"80\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"80\" y=\"96\" rx=\"8\"/></g></svg>"
        },
        "$:/core/images/new-image-button": {
            "title": "$:/core/images/new-image-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-image-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.362 73.627l15.826-27.41a2.626 2.626 0 00-.962-3.59l-50.01-28.872a2.626 2.626 0 00-3.588.961L30.058 36.49l10.04-5.261c3.042-1.595 6.771.114 7.55 3.46l3.607 17.702 9.88.85a5.25 5.25 0 014.571 3.77c.034.115.1.344.199.671.165.553.353 1.172.562 1.843.595 1.914 1.23 3.85 1.872 5.678.207.588.412 1.156.614 1.701.625 1.685 1.209 3.114 1.725 4.207.255.54.485.977.726 1.427.214.212.547.425 1.011.622 1.141.482 2.784.74 4.657.758.864.008 1.71-.034 2.492-.11.448-.043.753-.085.871-.104.315-.053.625-.077.927-.076zM37.47 2.649A5.257 5.257 0 0144.649.725l63.645 36.746a5.257 5.257 0 011.923 7.178L73.47 108.294a5.257 5.257 0 01-7.177 1.923L2.649 73.47a5.257 5.257 0 01-1.924-7.177L37.471 2.649zm42.837 50.49a5.25 5.25 0 105.25-9.092 5.25 5.25 0 00-5.25 9.093zM96 112h-7.993c-4.419 0-8.007-3.582-8.007-8 0-4.41 3.585-8 8.007-8H96v-7.993C96 83.588 99.582 80 104 80c4.41 0 8 3.585 8 8.007V96h7.993c4.419 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H112v7.993c0 4.419-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V112zM33.347 51.791c7.428 7.948 9.01 10.69 7.449 13.394-1.56 2.703-13.838-2.328-16.094 1.58-2.256 3.908-.907 3.258-2.437 5.908l19.73 11.39s-5.605-8.255-4.235-10.628c2.515-4.356 8.77-1.256 10.365-4.019 2.414-4.181-5.103-9.639-14.778-17.625z\"/></svg>"
        },
        "$:/core/images/new-journal-button": {
            "title": "$:/core/images/new-journal-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-journal-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.545 112.818v11.818c0 1.306 1.086 2.364 2.425 2.364h6.06c1.34 0 2.425-1.058 2.425-2.364v-11.818h12.12c1.34 0 2.425-1.058 2.425-2.363v-5.91c0-1.305-1.085-2.363-2.424-2.363h-12.121V90.364c0-1.306-1.086-2.364-2.425-2.364h-6.06c-1.34 0-2.425 1.058-2.425 2.364v11.818h-12.12c-1.34 0-2.425 1.058-2.425 2.363v5.91c0 1.305 1.085 2.363 2.424 2.363h12.121zM60.016 4.965c-4.781-2.76-10.897-1.118-13.656 3.66L5.553 79.305A9.993 9.993 0 009.21 92.963l51.04 29.468c4.78 2.76 10.897 1.118 13.655-3.66l40.808-70.681a9.993 9.993 0 00-3.658-13.656L60.016 4.965zm-3.567 27.963a6 6 0 106-10.393 6 6 0 00-6 10.393zm31.697 17.928a6 6 0 106-10.392 6 6 0 00-6 10.392z\"/><text class=\"tc-fill-background\" font-family=\"Helvetica\" font-size=\"47.172\" font-weight=\"bold\" transform=\"rotate(30 25.742 95.82)\"><tspan x=\"42\" y=\"77.485\" text-anchor=\"middle\"><<now \"DD\">></tspan></text></g></svg>"
        },
        "$:/core/images/opacity": {
            "title": "$:/core/images/opacity",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-opacity tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.362 65a51.595 51.595 0 01-1.942 6H82.584a35.867 35.867 0 002.997-6h16.78zm.472-2c.423-1.961.734-3.963.929-6H87.656a35.78 35.78 0 01-1.368 6h16.546zm-3.249 10a51.847 51.847 0 01-3.135 6H75.812a36.205 36.205 0 005.432-6h18.341zm-4.416 8c-1.424 2.116-3 4.12-4.71 6H60.46a35.843 35.843 0 0012.874-6h21.834zm-7.513-34h16.107C101.247 20.627 79.033 0 52 0 23.281 0 0 23.281 0 52c0 25.228 17.965 46.26 41.8 51h20.4a51.66 51.66 0 0015.875-6H39v-2h42.25a52.257 52.257 0 007.288-6H39v-2h4.539C27.739 83.194 16 68.968 16 52c0-19.882 16.118-36 36-36 18.186 0 33.222 13.484 35.656 31zm.22 2h16.039a52.823 52.823 0 010 6H87.877a36.483 36.483 0 000-6z\"/><path d=\"M76 128c28.719 0 52-23.281 52-52s-23.281-52-52-52-52 23.281-52 52 23.281 52 52 52zm0-16c19.882 0 36-16.118 36-36S95.882 40 76 40 40 56.118 40 76s16.118 36 36 36z\"/><path d=\"M37 58h53v4H37v-4zm3-8h53v4H40v-4zm0-8h53v4H40v-4zm-8 24h53v4H32v-4zm-2 8h53v4H30v-4zm-3 8h53v4H27v-4z\"/></g></svg>"
        },
        "$:/core/images/open-window": {
            "title": "$:/core/images/open-window",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-open-window tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M16 112h88.994c3.87 0 7.006 3.59 7.006 8 0 4.418-3.142 8-7.006 8H7.006C3.136 128 0 124.41 0 120a9.321 9.321 0 010-.01V24.01C0 19.586 3.59 16 8 16c4.418 0 8 3.584 8 8.01V112z\"/><path d=\"M96 43.196V56a8 8 0 1016 0V24c0-4.41-3.585-8-8.007-8H72.007C67.588 16 64 19.582 64 24c0 4.41 3.585 8 8.007 8H84.57l-36.3 36.299a8 8 0 00-.001 11.316c3.117 3.117 8.19 3.123 11.316-.003L96 43.196zM32 7.999C32 3.581 35.588 0 40 0h80c4.419 0 8 3.588 8 8v80c0 4.419-3.588 8-8 8H40c-4.419 0-8-3.588-8-8V8z\"/></g></svg>"
        },
        "$:/core/images/options-button": {
            "title": "$:/core/images/options-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-options-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M110.488 76a47.712 47.712 0 01-5.134 12.384l6.724 6.724c3.123 3.123 3.132 8.192.011 11.313l-5.668 5.668c-3.12 3.12-8.186 3.117-11.313-.01l-6.724-6.725c-3.82 2.258-7.98 4-12.384 5.134v9.505c0 4.417-3.578 8.007-7.992 8.007h-8.016C55.58 128 52 124.415 52 119.993v-9.505a47.712 47.712 0 01-12.384-5.134l-6.724 6.725c-3.123 3.122-8.192 3.131-11.313.01l-5.668-5.668c-3.12-3.12-3.116-8.186.01-11.313l6.725-6.724c-2.257-3.82-4-7.98-5.134-12.384H8.007C3.591 76 0 72.422 0 68.01v-8.017C0 55.58 3.585 52 8.007 52h9.505a47.712 47.712 0 015.134-12.383l-6.724-6.725c-3.123-3.122-3.132-8.191-.011-11.312l5.668-5.669c3.12-3.12 8.186-3.116 11.313.01l6.724 6.725c3.82-2.257 7.98-4 12.384-5.134V8.007C52 3.591 55.578 0 59.992 0h8.016C72.42 0 76 3.585 76 8.007v9.505a47.712 47.712 0 0112.384 5.134l6.724-6.724c3.123-3.123 8.192-3.132 11.313-.01l5.668 5.668c3.12 3.12 3.116 8.186-.01 11.312l-6.725 6.725c2.257 3.82 4 7.979 5.134 12.383h9.505c4.416 0 8.007 3.578 8.007 7.992v8.017c0 4.411-3.585 7.991-8.007 7.991h-9.505zM64 96c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/></svg>"
        },
        "$:/core/images/paint": {
            "title": "$:/core/images/paint",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-paint tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M83.527 76.19C90.43 69.287 91.892 59 87.91 50.665l37.903-37.902c2.919-2.92 2.913-7.659 0-10.572a7.474 7.474 0 00-10.572 0L77.338 40.093c-8.335-3.982-18.622-2.521-25.526 4.383l31.715 31.715zm-2.643 2.644L49.169 47.119S8.506 81.243 0 80.282c0 0 3.782 5.592 6.827 8.039 14.024-5.69 37.326-24.6 37.326-24.6l.661.66S19.45 90.222 9.18 92.047c1.222 1.44 4.354 4.053 6.247 5.776 5.417-1.488 34.733-28.57 34.733-28.57l.661.66-32.407 31.022 5.285 5.286L56.106 75.2l.662.66s-27.864 30.536-28.684 32.432c0 0 6.032 6.853 7.569 7.824.702-2.836 27.884-33.485 27.884-33.485l.661.66s-20.597 23.755-24.964 36.732c3.21 3.549 7.5 5.137 10.926 6.298-2.19-11.817 30.724-47.487 30.724-47.487z\"/></svg>"
        },
        "$:/core/images/palette": {
            "title": "$:/core/images/palette",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-palette tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.247 39.182a93.52 93.52 0 00-16.228-1.4C28.662 37.781 0 57.131 0 81.002c0 9.642 4.676 18.546 12.58 25.735C23.504 91.19 26.34 72.395 36.89 63.562c15.183-12.713 26.538-7.828 26.538-7.828l16.82-16.552zm26.535 9.655c13.049 7.913 21.257 19.392 21.257 32.166 0 9.35.519 17.411-11.874 25.08-10.797 6.681-3.824-6.536-11.844-10.898s-19.946 1.308-18.213 7.906c3.2 12.181 19.422 11.455 6.314 16.658-13.107 5.202-18.202 4.476-28.403 4.476-7.821 0-15.315-.947-22.243-2.68 9.844-4.197 27.88-12.539 33.354-19.456C82.788 92.409 87.37 80 83.324 72.484c-.194-.359 11.215-11.668 23.458-23.647zM1.134 123.867l-.66.002c33.479-14.94 22.161-64.226 58.818-64.226.317 1.418.644 2.944 1.062 4.494-25.907-4.166-23.567 48.031-59.22 59.73zm.713-.007c38.872-.506 78.152-22.347 78.152-44.813-9.27 0-14.073-3.48-16.816-7.942-16.597-7.003-30.365 45.715-61.336 52.755zm65.351-64.008c-4.45 4.115 4.886 16.433 11.318 11.318l45.27-45.27c11.317-11.318 0-22.635-11.318-11.318-11.317 11.318-33.518 34.405-45.27 45.27z\"/></svg>"
        },
        "$:/core/images/permalink-button": {
            "title": "$:/core/images/permalink-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permalink-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.483 48l-7.387 32h-25.58l7.388-32h25.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L100.598 32h3.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-7.096l-7.387 32H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H85.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L69.402 96h-25.58L38.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L27.402 96h-3.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h7.096l7.387-32H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h18.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L58.598 32h25.58z\"/></svg>"
        },
        "$:/core/images/permaview-button": {
            "title": "$:/core/images/permaview-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permaview-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.483 48l-1.846 8h-5.58l1.847-8h5.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L101.598 32h2.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-6.096l-1.847 8h7.944c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H92.364l-1.846 8H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H86.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L70.402 96h-5.58L59.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L48.402 96h-5.58L37.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L26.402 96h-2.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h6.096l1.847-8h-7.944C19.59 72 16 68.418 16 64c0-4.41 3.581-8 8-8h11.637l1.846-8H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h17.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L57.598 32h5.58L68.8 7.642c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L79.598 32h5.58zM53.904 48l-1.847 8h5.58l1.846-8h-5.579zm22.039 24l-1.847 8h-5.58l1.847-8h5.58zm-27.58 0l-1.846 8h5.579l1.847-8h-5.58z\"/></svg>"
        },
        "$:/core/images/picture": {
            "title": "$:/core/images/picture",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-picture tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112 68.233v-48.23A4.001 4.001 0 00107.997 16H20.003A4.001 4.001 0 0016 20.003v38.31l9.241-14.593c2.8-4.422 9.023-5.008 12.6-1.186l18.247 20.613 13.687-6.407a8 8 0 018.903 1.492 264.97 264.97 0 002.92 2.739 249.44 249.44 0 006.798 6.066 166.5 166.5 0 002.106 1.778c2.108 1.747 3.967 3.188 5.482 4.237.748.518 1.383.92 2.044 1.33.444.117 1.046.144 1.809.05 1.873-.233 4.238-1.144 6.723-2.547a36.016 36.016 0 003.205-2.044c.558-.4.93-.686 1.07-.802.376-.31.765-.577 1.165-.806zM0 8.007A8.01 8.01 0 018.007 0h111.986A8.01 8.01 0 01128 8.007v111.986a8.01 8.01 0 01-8.007 8.007H8.007A8.01 8.01 0 010 119.993V8.007zM95 42a8 8 0 100-16 8 8 0 000 16zM32 76c15.859 4.83 20.035 7.244 20.035 12S32 95.471 32 102.347c0 6.876 1.285 4.99 1.285 9.653H68s-13.685-6.625-13.685-10.8c0-7.665 10.615-8.34 10.615-13.2 0-7.357-14.078-8.833-32.93-12z\"/></svg>"
        },
        "$:/core/images/plugin-generic-language": {
            "title": "$:/core/images/plugin-generic-language",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"
        },
        "$:/core/images/plugin-generic-plugin": {
            "title": "$:/core/images/plugin-generic-plugin",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"
        },
        "$:/core/images/plugin-generic-theme": {
            "title": "$:/core/images/plugin-generic-theme",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z\"/></svg>"
        },
        "$:/core/images/preview-closed": {
            "title": "$:/core/images/preview-closed",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-closed tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M.088 64a7.144 7.144 0 001.378 5.458C16.246 88.818 39.17 100.414 64 100.414c24.83 0 47.753-11.596 62.534-30.956A7.144 7.144 0 00127.912 64C110.582 78.416 88.304 87.086 64 87.086 39.696 87.086 17.418 78.416.088 64z\"/><rect width=\"4\" height=\"16\" x=\"62\" y=\"96\" rx=\"4\"/><rect width=\"4\" height=\"16\" x=\"78\" y=\"93\" rx=\"4\" transform=\"rotate(-5 80 101)\"/><rect width=\"4\" height=\"16\" x=\"46\" y=\"93\" rx=\"4\" transform=\"rotate(5 48 101)\"/><rect width=\"4\" height=\"16\" x=\"30\" y=\"88\" rx=\"4\" transform=\"rotate(10 32 96)\"/><rect width=\"4\" height=\"16\" x=\"94\" y=\"88\" rx=\"4\" transform=\"rotate(-10 96 96)\"/><rect width=\"4\" height=\"16\" x=\"110\" y=\"80\" rx=\"4\" transform=\"rotate(-20 112 88)\"/><rect width=\"4\" height=\"16\" x=\"14\" y=\"80\" rx=\"4\" transform=\"rotate(20 16 88)\"/></g></svg>"
        },
        "$:/core/images/preview-open": {
            "title": "$:/core/images/preview-open",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-open tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.11 99.588c-24.83 0-47.754-11.596-62.534-30.957a7.148 7.148 0 010-8.675C16.356 40.596 39.28 29 64.11 29c24.83 0 47.753 11.596 62.534 30.956a7.148 7.148 0 010 8.675c-14.78 19.36-37.703 30.957-62.534 30.957zm46.104-32.007c1.44-1.524 1.44-3.638 0-5.162C99.326 50.9 82.439 44 64.147 44S28.968 50.9 18.08 62.42c-1.44 1.523-1.44 3.637 0 5.16C28.968 79.1 45.855 86 64.147 86s35.179-6.9 46.067-18.42z\"/><path d=\"M63.5 88C76.479 88 87 77.479 87 64.5S76.479 41 63.5 41 40 51.521 40 64.5 50.521 88 63.5 88z\"/></g></svg>"
        },
        "$:/core/images/print-button": {
            "title": "$:/core/images/print-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-print-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M112 71V30.5h-.032c-.035-2-.816-3.99-2.343-5.516L86.998 2.357A7.978 7.978 0 0081 .02V0H24a8 8 0 00-8 8v63h8V8h57v14.5c0 4.422 3.582 8 8 8h15V71h8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/><path d=\"M0 80.005C0 71.165 7.156 64 16 64h96c8.836 0 16 7.155 16 16.005v31.99c0 8.84-7.156 16.005-16 16.005H16c-8.836 0-16-7.155-16-16.005v-31.99zM104 96a8 8 0 100-16 8 8 0 000 16z\"/></g></svg>"
        },
        "$:/core/images/quote": {
            "title": "$:/core/images/quote",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-quote tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M51.219 117.713V62.199H27.427c0-8.891 1.683-16.401 5.047-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.36 3.184-20.728 6.669-6.368 3.484-11.835 7.87-16.401 13.157C9.524 27.113 5.98 33.241 3.456 40.21.933 47.18-.21 54.63.03 62.56v55.153H51.22zm76.781 0V62.199h-23.791c0-8.891 1.682-16.401 5.046-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.359 3.184-20.727 6.669-6.369 3.484-11.836 7.87-16.402 13.157-4.566 5.287-8.11 11.415-10.634 18.384-2.523 6.97-3.665 14.42-3.424 22.35v55.153H128z\"/></svg>"
        },
        "$:/core/images/refresh-button": {
            "title": "$:/core/images/refresh-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-refresh-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M106.369 39.433c10.16 20.879 6.57 46.764-10.771 64.106-21.87 21.87-57.327 21.87-79.196 0-21.87-21.87-21.87-57.326 0-79.196a8 8 0 1111.314 11.314c-15.621 15.62-15.621 40.947 0 56.568 15.62 15.621 40.947 15.621 56.568 0C97.72 78.79 99.6 58.175 89.924 42.73l-6.44 12.264a8 8 0 11-14.166-7.437L84.435 18.76a8 8 0 0110.838-3.345l28.873 15.345a8 8 0 11-7.51 14.129l-10.267-5.457zm-8.222-12.368c-.167-.19-.336-.38-.506-.57l.96-.296-.454.866z\"/></svg>"
        },
        "$:/core/images/right-arrow": {
            "title": "$:/core/images/right-arrow",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-right-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M99.069 64.173c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></svg>"
        },
        "$:/core/images/rotate-left": {
            "title": "$:/core/images/rotate-left",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-rotate-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"32\" height=\"80\" rx=\"8\"/><rect width=\"80\" height=\"32\" x=\"48\" y=\"96\" rx=\"8\"/><path d=\"M61.32 36.65c19.743 2.45 35.023 19.287 35.023 39.693a4 4 0 01-8 0c0-15.663-11.254-28.698-26.117-31.46l3.916 3.916a4 4 0 11-5.657 5.657L49.172 43.142a4 4 0 010-5.657l11.313-11.313a4 4 0 115.657 5.656l-4.821 4.822z\"/></g></svg>"
        },
        "$:/core/images/save-button": {
            "title": "$:/core/images/save-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z\"/></svg>"
        },
        "$:/core/images/size": {
            "title": "$:/core/images/size",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-size tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M92.343 26l-9.171 9.172a4 4 0 105.656 5.656l16-16a4 4 0 000-5.656l-16-16a4 4 0 10-5.656 5.656L92.343 18H22a4 4 0 00-4 4v70.343l-9.172-9.171a4 4 0 10-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656L26 92.343V22l-4 4h70.343zM112 52v64l4-4H52a4 4 0 100 8h64a4 4 0 004-4V52a4 4 0 10-8 0z\"/></svg>"
        },
        "$:/core/images/spiral": {
            "title": "$:/core/images/spiral",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-spiral tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.534 68.348c3.39 0 6.097-2.62 6.476-5.968l-4.755-.538 4.75.583c.377-3.07-1.194-6.054-3.89-7.78-2.757-1.773-6.34-2.01-9.566-.7-3.46 1.403-6.14 4.392-7.35 8.148l-.01.026c-1.3 4.08-.72 8.64 1.58 12.52 2.5 4.2 6.77 7.2 11.76 8.27 5.37 1.15 11.11-.05 15.83-3.31 5.04-3.51 8.46-9.02 9.45-15.3 1.05-6.7-.72-13.63-4.92-19.19l.02.02c-4.42-5.93-11.2-9.82-18.78-10.78-7.96-1.01-16.13 1.31-22.59 6.43-6.81 5.39-11.18 13.41-12.11 22.26-.98 9.27 1.87 18.65 7.93 26.02 6.32 7.69 15.6 12.56 25.74 13.48 10.54.96 21.15-2.42 29.45-9.4l.01-.01c8.58-7.25 13.94-17.78 14.86-29.21.94-11.84-2.96-23.69-10.86-32.9-8.19-9.5-19.95-15.36-32.69-16.27-13.16-.94-26.24 3.49-36.34 12.34l.01-.01c-10.41 9.08-16.78 22.1-17.68 36.15-.93 14.44 4.03 28.77 13.79 39.78 10.03 11.32 24.28 18.2 39.6 19.09 15.73.92 31.31-4.56 43.24-15.234 12.23-10.954 19.61-26.44 20.5-43.074a4.785 4.785 0 00-4.52-5.03 4.778 4.778 0 00-5.03 4.52c-.75 14.1-7 27.2-17.33 36.45-10.03 8.98-23.11 13.58-36.3 12.81-12.79-.75-24.67-6.48-33-15.89-8.07-9.11-12.17-20.94-11.41-32.827.74-11.52 5.942-22.15 14.43-29.54l.01-.01c8.18-7.17 18.74-10.75 29.35-9.998 10.21.726 19.6 5.41 26.11 12.96 6.24 7.273 9.32 16.61 8.573 25.894-.718 8.9-4.88 17.064-11.504 22.66l.01-.007c-6.36 5.342-14.44 7.92-22.425 7.19-7.604-.68-14.52-4.314-19.21-10.027-4.44-5.4-6.517-12.23-5.806-18.94.67-6.3 3.76-11.977 8.54-15.766 4.46-3.54 10.05-5.128 15.44-4.44 5.03.63 9.46 3.18 12.32 7.01l.02.024c2.65 3.5 3.75 7.814 3.1 11.92-.59 3.71-2.58 6.925-5.45 8.924-2.56 1.767-5.61 2.403-8.38 1.81-2.42-.516-4.42-1.92-5.53-3.79-.93-1.56-1.15-3.3-.69-4.75l-4.56-1.446L59.325 65c.36-1.12 1.068-1.905 1.84-2.22.25-.103.48-.14.668-.13.06.006.11.015.14.025.01 0 .01 0-.01-.01a1.047 1.047 0 01-.264-.332c-.15-.29-.23-.678-.18-1.11l-.005.04c.15-1.332 1.38-2.523 3.035-2.523-2.65 0-4.79 2.144-4.79 4.787s2.14 4.785 4.78 4.785z\"/></svg>"
        },
        "$:/core/images/stamp": {
            "title": "$:/core/images/stamp",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-stamp tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M49.733 64H16.01C11.584 64 8 67.583 8 72.003V97h112V72.003A8 8 0 00111.99 64H78.267A22.813 22.813 0 0175.5 53.077c0-6.475 2.687-12.324 7.009-16.497A22.818 22.818 0 0087 22.952C87 10.276 76.703 0 64 0S41 10.276 41 22.952c0 5.103 1.669 9.817 4.491 13.628 4.322 4.173 7.009 10.022 7.009 16.497 0 3.954-1.002 7.675-2.767 10.923zM8 104h112v8H8v-8z\"/></svg>"
        },
        "$:/core/images/star-filled": {
            "title": "$:/core/images/star-filled",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-star-filled tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M61.836 96.823l37.327 27.287c2.72 1.99 6.379-.69 5.343-3.912L90.29 75.988l-1.26 3.91 37.285-27.345c2.718-1.993 1.32-6.327-2.041-6.33l-46.113-.036 3.3 2.416L67.176 4.416c-1.04-3.221-5.563-3.221-6.604 0L46.29 48.603l3.3-2.416-46.113.036c-3.362.003-4.759 4.337-2.04 6.33L38.72 79.898l-1.26-3.91-14.216 44.21c-1.036 3.223 2.622 5.901 5.343 3.912l37.326-27.287h-4.078z\"/></svg>"
        },
        "$:/core/images/storyview-classic": {
            "title": "$:/core/images/storyview-classic",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-classic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm0 48C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0 32C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
        },
        "$:/core/images/storyview-pop": {
            "title": "$:/core/images/storyview-pop",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-pop tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm-7.99 40C11.587 56 8 59.578 8 63.992v16.016C8 84.422 11.584 88 16.01 88h95.98c4.424 0 8.01-3.578 8.01-7.992V63.992c0-4.414-3.584-7.992-8.01-7.992H16.01zM24 96C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0-32C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
        },
        "$:/core/images/storyview-zoomin": {
            "title": "$:/core/images/storyview-zoomin",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-zoomin tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16A8 8 0 0016 24.009V71.99C16 76.414 19.588 80 24 80h80a8 8 0 008-8.009V24.01c0-4.423-3.588-8.009-8-8.009H24z\"/></svg>"
        },
        "$:/core/images/strikethrough": {
            "title": "$:/core/images/strikethrough",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-strikethrough tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M92.794 38.726h15.422c-.229-6.74-1.514-12.538-3.856-17.393-2.342-4.855-5.54-8.881-9.596-12.08-4.055-3.199-8.767-5.54-14.136-7.025C75.258.743 69.433 0 63.15 0a62.76 62.76 0 00-16.364 2.142C41.474 3.57 36.733 5.74 32.564 8.653c-4.17 2.913-7.511 6.626-10.025 11.138-2.513 4.512-3.77 9.853-3.77 16.022 0 5.597 1.115 10.252 3.342 13.965 2.228 3.712 5.198 6.74 8.91 9.081 3.713 2.342 7.911 4.227 12.595 5.655a194.641 194.641 0 0014.308 3.77c4.855 1.085 9.624 2.142 14.308 3.17 4.683 1.028 8.881 2.37 12.594 4.027 3.713 1.656 6.683 3.798 8.91 6.425 2.228 2.628 3.342 6.055 3.342 10.281 0 4.456-.914 8.111-2.742 10.967a19.953 19.953 0 01-7.197 6.768c-2.97 1.657-6.311 2.828-10.024 3.513a60.771 60.771 0 01-11.052 1.028c-4.57 0-9.025-.571-13.366-1.713-4.34-1.143-8.139-2.913-11.394-5.312-3.256-2.4-5.884-5.455-7.883-9.168-1.999-3.712-2.998-8.139-2.998-13.28H15c0 7.426 1.342 13.852 4.027 19.278 2.684 5.426 6.34 9.881 10.966 13.365 4.627 3.484 9.996 6.083 16.107 7.797 6.112 1.713 12.595 2.57 19.449 2.57 5.597 0 11.223-.657 16.878-1.97 5.655-1.314 10.767-3.428 15.336-6.34 4.57-2.914 8.31-6.683 11.224-11.31 2.913-4.626 4.37-10.195 4.37-16.707 0-6.054-1.115-11.08-3.342-15.079-2.228-3.998-5.198-7.31-8.91-9.938-3.713-2.627-7.911-4.712-12.595-6.254a170.83 170.83 0 00-14.308-4.027 549.669 549.669 0 00-14.308-3.17c-4.683-.971-8.881-2.2-12.594-3.684-3.713-1.485-6.683-3.399-8.91-5.74-2.228-2.342-3.342-5.398-3.342-9.168 0-3.998.771-7.34 2.313-10.024 1.543-2.685 3.599-4.826 6.17-6.426 2.57-1.599 5.51-2.741 8.824-3.427a49.767 49.767 0 0110.11-1.028c8.453 0 15.393 1.97 20.819 5.912 5.426 3.94 8.596 10.31 9.51 19.106z\"/><path d=\"M5 54h118v16H5z\"/></g></svg>"
        },
        "$:/core/images/subscript": {
            "title": "$:/core/images/subscript",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-subscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 128.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
        },
        "$:/core/images/superscript": {
            "title": "$:/core/images/superscript",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-superscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 63.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
        },
        "$:/core/images/tag-button": {
            "title": "$:/core/images/tag-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tag-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M18.164 47.66l.004 4.105c.003 3.823 2.19 9.097 4.885 11.792l61.85 61.85c2.697 2.697 7.068 2.69 9.769-.01L125.767 94.3a6.903 6.903 0 00.01-9.77L63.928 22.683c-2.697-2.697-7.976-4.88-11.796-4.881l-27.076-.007a6.902 6.902 0 00-6.91 6.91l.008 9.96.287.033c3.73.411 8.489-.044 13.365-1.153a9.702 9.702 0 0111.14-3.662l.291-.13.128.285a9.7 9.7 0 013.3 2.17c3.796 3.796 3.801 9.945.012 13.734-3.618 3.618-9.386 3.777-13.204.482-5.365 1.122-10.674 1.596-15.309 1.237z\"/><path d=\"M47.633 39.532l.023.051c-9.689 4.356-21.584 6.799-30.396 5.828C5.273 44.089-1.028 36.43 2.443 24.078 5.562 12.976 14.3 4.361 24.047 1.548c10.68-3.083 19.749 1.968 19.749 13.225h-8.623c0-4.859-3.078-6.573-8.735-4.94-6.91 1.995-13.392 8.383-15.694 16.577-1.915 6.818.417 9.653 7.46 10.43 7.126.785 17.531-1.352 25.917-5.121l.027.06.036-.017c1.76-.758 6.266 6.549 3.524 7.74a2.8 2.8 0 01-.075.03z\"/></g></svg>"
        },
        "$:/core/images/theme-button": {
            "title": "$:/core/images/theme-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-theme-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.854 66.945a122.626 122.626 0 01-3.9-4.819c-11.064-14.548-16.645-6.888-22.96 0-6.315 6.888 1.664 12.47-4.33 17.335-5.993 4.866-5.623 6.552-15.737-2.35-10.115-8.9-10.815-11.351-6.172-16.43 4.644-5.08 8.524 2.918 18.01-6.108 9.485-9.026 1.517-17.026 1.517-17.026S42.03-2.824 68.42.157c26.39 2.982-9.984-3.86-19.031 27.801-3.874 13.556.72 10.362 8.066 16.087 1.707 1.33 6.428 4.732 12.671 9.318-6.129 5.879-11.157 10.669-14.273 13.582zm11.641 12.947c16.013 17.036 37.742 37.726 45.117 40.42 10.432 3.813 15.388-3.141 15.388-14.79 0-7.151-23.83-26.542-43.924-41.769-7.408 7.156-13.376 12.953-16.58 16.139z\"/><path d=\"M11.069 109.828L46.31 74.587a3.56 3.56 0 115.037-5.032l15.098 15.098a3.56 3.56 0 11-5.032 5.037l-35.24 35.241c-4.171 4.17-10.933 4.17-15.104 0-4.17-4.17-4.17-10.933 0-15.103zM124.344 6.622l5.034 5.034-7.49 12.524-7.613 2.58L61.413 79.62l-5.034-5.034 52.861-52.862 2.58-7.614 12.524-7.49z\"/></g></svg>"
        },
        "$:/core/images/timestamp-off": {
            "title": "$:/core/images/timestamp-off",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-off tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M58.25 35.88c-18.777 0-33.998 15.224-33.998 33.998 0 18.773 15.22 34.002 33.998 34.002 18.784 0 34.002-15.23 34.002-34.002 0-18.774-15.218-33.998-34.002-33.998zm-3.03 50.123H44.196v-34H55.22v34zm16.976 0H61.17v-34h11.025v34z\"/></g></svg>"
        },
        "$:/core/images/timestamp-on": {
            "title": "$:/core/images/timestamp-on",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-on tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M13.41 27.178a5.005 5.005 0 01-7.045-.613 5.008 5.008 0 01.616-7.047l9.95-8.348a5 5 0 016.429 7.661l-9.95 8.348zm89.573 0a5.005 5.005 0 007.045-.613 5.008 5.008 0 00-.616-7.047l-9.95-8.348a5 5 0 00-6.428 7.661l9.95 8.348zM65.097 71.072c0 3.826-3.09 6.928-6.897 6.928-3.804.006-6.9-3.102-6.903-6.928 0 0 4.76-39.072 6.903-39.072s6.897 39.072 6.897 39.072z\"/></g></svg>"
        },
        "$:/core/images/tip": {
            "title": "$:/core/images/tip",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tip tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128.242c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64 0 35.346 28.654 64 64 64zm11.936-36.789c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349C54.33 94.05 58.824 95.82 64 95.82c5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.456c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zM64.3 24.242c11.618 0 23.699 7.82 23.699 24.2S75.92 71.754 75.92 83.576c0 5.873-5.868 9.26-11.92 9.26s-12.027-3.006-12.027-9.26C51.973 71.147 40 65.47 40 48.442s12.683-24.2 24.301-24.2z\"/></svg>"
        },
        "$:/core/images/transcludify": {
            "title": "$:/core/images/transcludify",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-transcludify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M0 59.482c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.651-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02C1.36 67.377.591 67.288 0 67.288v-7.806zm24.66 0c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.65-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02c-.946-.177-1.715-.266-2.306-.266v-7.806zm43.965-3.538L80.6 52.041l2.306 7.097-12.063 3.903 7.628 10.378-6.12 4.435-7.63-10.467-7.45 10.201-5.943-4.524 7.628-10.023-12.152-4.17 2.306-7.096 12.064 4.17V43.347h7.451v12.596zm34.425 11.344c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806zm24.66 0c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806z\"/></svg>"
        },
        "$:/core/images/twitter": {
            "title": "$:/core/images/twitter",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-twitter tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.626 115.803A73.376 73.376 0 012 104.235c2.022.238 4.08.36 6.166.36 12.111 0 23.258-4.117 32.105-11.023-11.312-.208-20.859-7.653-24.148-17.883a25.98 25.98 0 0011.674-.441C15.971 72.881 7.061 62.474 7.061 49.997c0-.108 0-.216.002-.323a25.824 25.824 0 0011.709 3.22c-6.936-4.617-11.5-12.5-11.5-21.433 0-4.719 1.274-9.142 3.5-12.945 12.75 15.579 31.797 25.83 53.281 26.904-.44-1.884-.67-3.85-.67-5.868 0-14.22 11.575-25.75 25.852-25.75a25.865 25.865 0 0118.869 8.132 51.892 51.892 0 0016.415-6.248c-1.93 6.012-6.029 11.059-11.366 14.246A51.844 51.844 0 00128 25.878a52.428 52.428 0 01-12.9 13.33c.05 1.104.075 2.214.075 3.33 0 34.028-26 73.265-73.549 73.265\"/></svg>"
        },
        "$:/core/images/underline": {
            "title": "$:/core/images/underline",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-underline tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M7 117.421h114.248V128H7v-10.579zm97.871-18.525V0h-16.26v55.856c0 4.463-.605 8.576-1.816 12.338-1.212 3.762-3.03 7.046-5.452 9.851-2.423 2.806-5.452 4.974-9.086 6.504-3.635 1.53-7.939 2.296-12.912 2.296-6.25 0-11.159-1.786-14.73-5.356-3.57-3.571-5.356-8.417-5.356-14.538V0H23v65.038c0 5.356.542 10.234 1.626 14.633 1.084 4.4 2.965 8.194 5.643 11.382 2.678 3.188 6.185 5.643 10.52 7.365 4.337 1.721 9.756 2.582 16.26 2.582 7.27 0 13.582-1.435 18.938-4.304 5.356-2.87 9.755-7.365 13.199-13.486h.382v15.686h15.303z\"/></svg>"
        },
        "$:/core/images/unfold-all-button": {
            "title": "$:/core/images/unfold-all-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M63.945 60.624c-2.05 0-4.101-.78-5.666-2.345L35.662 35.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 41.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 58.279a7.986 7.986 0 01-5.663 2.346zM64.004 124.565c-2.05 0-4.102-.78-5.666-2.345L35.721 99.603c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 105.255l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.662 122.22a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
        },
        "$:/core/images/unfold-button": {
            "title": "$:/core/images/unfold-button",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M63.945 63.624c-2.05 0-4.101-.78-5.666-2.345L35.662 38.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 44.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 61.279a7.986 7.986 0 01-5.663 2.346zM64.004 105.682c-2.05.001-4.102-.78-5.666-2.344L35.721 80.721c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 86.373l16.966-16.966c3.124-3.125 8.194-3.13 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319l-22.617 22.617a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
        },
        "$:/core/images/unlocked-padlock": {
            "title": "$:/core/images/unlocked-padlock",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unlocked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M48.627 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h6.136c-10.455-12.651-27.364-35.788-4.3-55.142 24.636-20.672 45.835 4.353 55.777 16.201 9.943 11.85-2.676 22.437-12.457 9.892-9.78-12.545-21.167-24.146-33.207-14.043-12.041 10.104-1.757 22.36 8.813 34.958 2.467 2.94 3.641 5.732 3.865 8.134zm19.105 28.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
        },
        "$:/core/images/up-arrow": {
            "title": "$:/core/images/up-arrow",
            "created": "20150316000544368",
            "modified": "20150316000831867",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-up-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M63.892.281c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.104 3.092-11.196 0L63.894 19.393 13.513 69.774a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98A7.892 7.892 0 0163.893.28z\"/></svg>"
        },
        "$:/core/images/video": {
            "title": "$:/core/images/video",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-video tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 12c-34.91 0-55.273 2.917-58.182 5.833C2.91 20.75 0 41.167 0 64.5c0 23.333 2.91 43.75 5.818 46.667C8.728 114.083 29.091 117 64 117c34.91 0 55.273-2.917 58.182-5.833C125.09 108.25 128 87.833 128 64.5c0-23.333-2.91-43.75-5.818-46.667C119.272 14.917 98.909 12 64 12zm-9.084 32.618c-3.813-2.542-6.905-.879-6.905 3.698v31.368c0 4.585 3.099 6.235 6.905 3.698l22.168-14.779c3.813-2.542 3.806-6.669 0-9.206L54.916 44.618z\"/></svg>"
        },
        "$:/core/images/warning": {
            "title": "$:/core/images/warning",
            "tags": "$:/tags/Image",
            "text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-warning tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z\"/></svg>"
        },
        "$:/language/Buttons/AdvancedSearch/Caption": {
            "title": "$:/language/Buttons/AdvancedSearch/Caption",
            "text": "advanced search"
        },
        "$:/language/Buttons/AdvancedSearch/Hint": {
            "title": "$:/language/Buttons/AdvancedSearch/Hint",
            "text": "Advanced search"
        },
        "$:/language/Buttons/Cancel/Caption": {
            "title": "$:/language/Buttons/Cancel/Caption",
            "text": "cancel"
        },
        "$:/language/Buttons/Cancel/Hint": {
            "title": "$:/language/Buttons/Cancel/Hint",
            "text": "Discard changes to this tiddler"
        },
        "$:/language/Buttons/Clone/Caption": {
            "title": "$:/language/Buttons/Clone/Caption",
            "text": "clone"
        },
        "$:/language/Buttons/Clone/Hint": {
            "title": "$:/language/Buttons/Clone/Hint",
            "text": "Clone this tiddler"
        },
        "$:/language/Buttons/Close/Caption": {
            "title": "$:/language/Buttons/Close/Caption",
            "text": "close"
        },
        "$:/language/Buttons/Close/Hint": {
            "title": "$:/language/Buttons/Close/Hint",
            "text": "Close this tiddler"
        },
        "$:/language/Buttons/CloseAll/Caption": {
            "title": "$:/language/Buttons/CloseAll/Caption",
            "text": "close all"
        },
        "$:/language/Buttons/CloseAll/Hint": {
            "title": "$:/language/Buttons/CloseAll/Hint",
            "text": "Close all tiddlers"
        },
        "$:/language/Buttons/CloseOthers/Caption": {
            "title": "$:/language/Buttons/CloseOthers/Caption",
            "text": "close others"
        },
        "$:/language/Buttons/CloseOthers/Hint": {
            "title": "$:/language/Buttons/CloseOthers/Hint",
            "text": "Close other tiddlers"
        },
        "$:/language/Buttons/ControlPanel/Caption": {
            "title": "$:/language/Buttons/ControlPanel/Caption",
            "text": "control panel"
        },
        "$:/language/Buttons/ControlPanel/Hint": {
            "title": "$:/language/Buttons/ControlPanel/Hint",
            "text": "Open control panel"
        },
        "$:/language/Buttons/CopyToClipboard/Caption": {
            "title": "$:/language/Buttons/CopyToClipboard/Caption",
            "text": "copy to clipboard"
        },
        "$:/language/Buttons/CopyToClipboard/Hint": {
            "title": "$:/language/Buttons/CopyToClipboard/Hint",
            "text": "Copy this text to the clipboard"
        },
        "$:/language/Buttons/Delete/Caption": {
            "title": "$:/language/Buttons/Delete/Caption",
            "text": "delete"
        },
        "$:/language/Buttons/Delete/Hint": {
            "title": "$:/language/Buttons/Delete/Hint",
            "text": "Delete this tiddler"
        },
        "$:/language/Buttons/Edit/Caption": {
            "title": "$:/language/Buttons/Edit/Caption",
            "text": "edit"
        },
        "$:/language/Buttons/Edit/Hint": {
            "title": "$:/language/Buttons/Edit/Hint",
            "text": "Edit this tiddler"
        },
        "$:/language/Buttons/Encryption/Caption": {
            "title": "$:/language/Buttons/Encryption/Caption",
            "text": "encryption"
        },
        "$:/language/Buttons/Encryption/Hint": {
            "title": "$:/language/Buttons/Encryption/Hint",
            "text": "Set or clear a password for saving this wiki"
        },
        "$:/language/Buttons/Encryption/ClearPassword/Caption": {
            "title": "$:/language/Buttons/Encryption/ClearPassword/Caption",
            "text": "clear password"
        },
        "$:/language/Buttons/Encryption/ClearPassword/Hint": {
            "title": "$:/language/Buttons/Encryption/ClearPassword/Hint",
            "text": "Clear the password and save this wiki without encryption"
        },
        "$:/language/Buttons/Encryption/SetPassword/Caption": {
            "title": "$:/language/Buttons/Encryption/SetPassword/Caption",
            "text": "set password"
        },
        "$:/language/Buttons/Encryption/SetPassword/Hint": {
            "title": "$:/language/Buttons/Encryption/SetPassword/Hint",
            "text": "Set a password for saving this wiki with encryption"
        },
        "$:/language/Buttons/ExportPage/Caption": {
            "title": "$:/language/Buttons/ExportPage/Caption",
            "text": "export all"
        },
        "$:/language/Buttons/ExportPage/Hint": {
            "title": "$:/language/Buttons/ExportPage/Hint",
            "text": "Export all tiddlers"
        },
        "$:/language/Buttons/ExportTiddler/Caption": {
            "title": "$:/language/Buttons/ExportTiddler/Caption",
            "text": "export tiddler"
        },
        "$:/language/Buttons/ExportTiddler/Hint": {
            "title": "$:/language/Buttons/ExportTiddler/Hint",
            "text": "Export tiddler"
        },
        "$:/language/Buttons/ExportTiddlers/Caption": {
            "title": "$:/language/Buttons/ExportTiddlers/Caption",
            "text": "export tiddlers"
        },
        "$:/language/Buttons/ExportTiddlers/Hint": {
            "title": "$:/language/Buttons/ExportTiddlers/Hint",
            "text": "Export tiddlers"
        },
        "$:/language/Buttons/SidebarSearch/Hint": {
            "title": "$:/language/Buttons/SidebarSearch/Hint",
            "text": "Select the sidebar search field"
        },
        "$:/language/Buttons/Fold/Caption": {
            "title": "$:/language/Buttons/Fold/Caption",
            "text": "fold tiddler"
        },
        "$:/language/Buttons/Fold/Hint": {
            "title": "$:/language/Buttons/Fold/Hint",
            "text": "Fold the body of this tiddler"
        },
        "$:/language/Buttons/Fold/FoldBar/Caption": {
            "title": "$:/language/Buttons/Fold/FoldBar/Caption",
            "text": "fold-bar"
        },
        "$:/language/Buttons/Fold/FoldBar/Hint": {
            "title": "$:/language/Buttons/Fold/FoldBar/Hint",
            "text": "Optional bars to fold and unfold tiddlers"
        },
        "$:/language/Buttons/Unfold/Caption": {
            "title": "$:/language/Buttons/Unfold/Caption",
            "text": "unfold tiddler"
        },
        "$:/language/Buttons/Unfold/Hint": {
            "title": "$:/language/Buttons/Unfold/Hint",
            "text": "Unfold the body of this tiddler"
        },
        "$:/language/Buttons/FoldOthers/Caption": {
            "title": "$:/language/Buttons/FoldOthers/Caption",
            "text": "fold other tiddlers"
        },
        "$:/language/Buttons/FoldOthers/Hint": {
            "title": "$:/language/Buttons/FoldOthers/Hint",
            "text": "Fold the bodies of other opened tiddlers"
        },
        "$:/language/Buttons/FoldAll/Caption": {
            "title": "$:/language/Buttons/FoldAll/Caption",
            "text": "fold all tiddlers"
        },
        "$:/language/Buttons/FoldAll/Hint": {
            "title": "$:/language/Buttons/FoldAll/Hint",
            "text": "Fold the bodies of all opened tiddlers"
        },
        "$:/language/Buttons/UnfoldAll/Caption": {
            "title": "$:/language/Buttons/UnfoldAll/Caption",
            "text": "unfold all tiddlers"
        },
        "$:/language/Buttons/UnfoldAll/Hint": {
            "title": "$:/language/Buttons/UnfoldAll/Hint",
            "text": "Unfold the bodies of all opened tiddlers"
        },
        "$:/language/Buttons/FullScreen/Caption": {
            "title": "$:/language/Buttons/FullScreen/Caption",
            "text": "full-screen"
        },
        "$:/language/Buttons/FullScreen/Hint": {
            "title": "$:/language/Buttons/FullScreen/Hint",
            "text": "Enter or leave full-screen mode"
        },
        "$:/language/Buttons/Help/Caption": {
            "title": "$:/language/Buttons/Help/Caption",
            "text": "help"
        },
        "$:/language/Buttons/Help/Hint": {
            "title": "$:/language/Buttons/Help/Hint",
            "text": "Show help panel"
        },
        "$:/language/Buttons/Import/Caption": {
            "title": "$:/language/Buttons/Import/Caption",
            "text": "import"
        },
        "$:/language/Buttons/Import/Hint": {
            "title": "$:/language/Buttons/Import/Hint",
            "text": "Import many types of file including text, image, TiddlyWiki or JSON"
        },
        "$:/language/Buttons/Info/Caption": {
            "title": "$:/language/Buttons/Info/Caption",
            "text": "info"
        },
        "$:/language/Buttons/Info/Hint": {
            "title": "$:/language/Buttons/Info/Hint",
            "text": "Show information for this tiddler"
        },
        "$:/language/Buttons/Home/Caption": {
            "title": "$:/language/Buttons/Home/Caption",
            "text": "home"
        },
        "$:/language/Buttons/Home/Hint": {
            "title": "$:/language/Buttons/Home/Hint",
            "text": "Open the default tiddlers"
        },
        "$:/language/Buttons/Language/Caption": {
            "title": "$:/language/Buttons/Language/Caption",
            "text": "language"
        },
        "$:/language/Buttons/Language/Hint": {
            "title": "$:/language/Buttons/Language/Hint",
            "text": "Choose the user interface language"
        },
        "$:/language/Buttons/Manager/Caption": {
            "title": "$:/language/Buttons/Manager/Caption",
            "text": "tiddler manager"
        },
        "$:/language/Buttons/Manager/Hint": {
            "title": "$:/language/Buttons/Manager/Hint",
            "text": "Open tiddler manager"
        },
        "$:/language/Buttons/More/Caption": {
            "title": "$:/language/Buttons/More/Caption",
            "text": "more"
        },
        "$:/language/Buttons/More/Hint": {
            "title": "$:/language/Buttons/More/Hint",
            "text": "More actions"
        },
        "$:/language/Buttons/NewHere/Caption": {
            "title": "$:/language/Buttons/NewHere/Caption",
            "text": "new here"
        },
        "$:/language/Buttons/NewHere/Hint": {
            "title": "$:/language/Buttons/NewHere/Hint",
            "text": "Create a new tiddler tagged with this one"
        },
        "$:/language/Buttons/NewJournal/Caption": {
            "title": "$:/language/Buttons/NewJournal/Caption",
            "text": "new journal"
        },
        "$:/language/Buttons/NewJournal/Hint": {
            "title": "$:/language/Buttons/NewJournal/Hint",
            "text": "Create a new journal tiddler"
        },
        "$:/language/Buttons/NewJournalHere/Caption": {
            "title": "$:/language/Buttons/NewJournalHere/Caption",
            "text": "new journal here"
        },
        "$:/language/Buttons/NewJournalHere/Hint": {
            "title": "$:/language/Buttons/NewJournalHere/Hint",
            "text": "Create a new journal tiddler tagged with this one"
        },
        "$:/language/Buttons/NewImage/Caption": {
            "title": "$:/language/Buttons/NewImage/Caption",
            "text": "new image"
        },
        "$:/language/Buttons/NewImage/Hint": {
            "title": "$:/language/Buttons/NewImage/Hint",
            "text": "Create a new image tiddler"
        },
        "$:/language/Buttons/NewMarkdown/Caption": {
            "title": "$:/language/Buttons/NewMarkdown/Caption",
            "text": "new Markdown tiddler"
        },
        "$:/language/Buttons/NewMarkdown/Hint": {
            "title": "$:/language/Buttons/NewMarkdown/Hint",
            "text": "Create a new Markdown tiddler"
        },
        "$:/language/Buttons/NewTiddler/Caption": {
            "title": "$:/language/Buttons/NewTiddler/Caption",
            "text": "new tiddler"
        },
        "$:/language/Buttons/NewTiddler/Hint": {
            "title": "$:/language/Buttons/NewTiddler/Hint",
            "text": "Create a new tiddler"
        },
        "$:/language/Buttons/OpenWindow/Caption": {
            "title": "$:/language/Buttons/OpenWindow/Caption",
            "text": "open in new window"
        },
        "$:/language/Buttons/OpenWindow/Hint": {
            "title": "$:/language/Buttons/OpenWindow/Hint",
            "text": "Open tiddler in new window"
        },
        "$:/language/Buttons/Palette/Caption": {
            "title": "$:/language/Buttons/Palette/Caption",
            "text": "palette"
        },
        "$:/language/Buttons/Palette/Hint": {
            "title": "$:/language/Buttons/Palette/Hint",
            "text": "Choose the colour palette"
        },
        "$:/language/Buttons/Permalink/Caption": {
            "title": "$:/language/Buttons/Permalink/Caption",
            "text": "permalink"
        },
        "$:/language/Buttons/Permalink/Hint": {
            "title": "$:/language/Buttons/Permalink/Hint",
            "text": "Set browser address bar to a direct link to this tiddler"
        },
        "$:/language/Buttons/Permaview/Caption": {
            "title": "$:/language/Buttons/Permaview/Caption",
            "text": "permaview"
        },
        "$:/language/Buttons/Permaview/Hint": {
            "title": "$:/language/Buttons/Permaview/Hint",
            "text": "Set browser address bar to a direct link to all the tiddlers in this story"
        },
        "$:/language/Buttons/Print/Caption": {
            "title": "$:/language/Buttons/Print/Caption",
            "text": "print page"
        },
        "$:/language/Buttons/Print/Hint": {
            "title": "$:/language/Buttons/Print/Hint",
            "text": "Print the current page"
        },
        "$:/language/Buttons/Refresh/Caption": {
            "title": "$:/language/Buttons/Refresh/Caption",
            "text": "refresh"
        },
        "$:/language/Buttons/Refresh/Hint": {
            "title": "$:/language/Buttons/Refresh/Hint",
            "text": "Perform a full refresh of the wiki"
        },
        "$:/language/Buttons/Save/Caption": {
            "title": "$:/language/Buttons/Save/Caption",
            "text": "ok"
        },
        "$:/language/Buttons/Save/Hint": {
            "title": "$:/language/Buttons/Save/Hint",
            "text": "Confirm changes to this tiddler"
        },
        "$:/language/Buttons/SaveWiki/Caption": {
            "title": "$:/language/Buttons/SaveWiki/Caption",
            "text": "save changes"
        },
        "$:/language/Buttons/SaveWiki/Hint": {
            "title": "$:/language/Buttons/SaveWiki/Hint",
            "text": "Save changes"
        },
        "$:/language/Buttons/StoryView/Caption": {
            "title": "$:/language/Buttons/StoryView/Caption",
            "text": "storyview"
        },
        "$:/language/Buttons/StoryView/Hint": {
            "title": "$:/language/Buttons/StoryView/Hint",
            "text": "Choose the story visualisation"
        },
        "$:/language/Buttons/HideSideBar/Caption": {
            "title": "$:/language/Buttons/HideSideBar/Caption",
            "text": "hide sidebar"
        },
        "$:/language/Buttons/HideSideBar/Hint": {
            "title": "$:/language/Buttons/HideSideBar/Hint",
            "text": "Hide sidebar"
        },
        "$:/language/Buttons/ShowSideBar/Caption": {
            "title": "$:/language/Buttons/ShowSideBar/Caption",
            "text": "show sidebar"
        },
        "$:/language/Buttons/ShowSideBar/Hint": {
            "title": "$:/language/Buttons/ShowSideBar/Hint",
            "text": "Show sidebar"
        },
        "$:/language/Buttons/TagManager/Caption": {
            "title": "$:/language/Buttons/TagManager/Caption",
            "text": "tag manager"
        },
        "$:/language/Buttons/TagManager/Hint": {
            "title": "$:/language/Buttons/TagManager/Hint",
            "text": "Open tag manager"
        },
        "$:/language/Buttons/Timestamp/Caption": {
            "title": "$:/language/Buttons/Timestamp/Caption",
            "text": "timestamps"
        },
        "$:/language/Buttons/Timestamp/Hint": {
            "title": "$:/language/Buttons/Timestamp/Hint",
            "text": "Choose whether modifications update timestamps"
        },
        "$:/language/Buttons/Timestamp/On/Caption": {
            "title": "$:/language/Buttons/Timestamp/On/Caption",
            "text": "timestamps are on"
        },
        "$:/language/Buttons/Timestamp/On/Hint": {
            "title": "$:/language/Buttons/Timestamp/On/Hint",
            "text": "Update timestamps when tiddlers are modified"
        },
        "$:/language/Buttons/Timestamp/Off/Caption": {
            "title": "$:/language/Buttons/Timestamp/Off/Caption",
            "text": "timestamps are off"
        },
        "$:/language/Buttons/Timestamp/Off/Hint": {
            "title": "$:/language/Buttons/Timestamp/Off/Hint",
            "text": "Don't update timestamps when tiddlers are modified"
        },
        "$:/language/Buttons/Theme/Caption": {
            "title": "$:/language/Buttons/Theme/Caption",
            "text": "theme"
        },
        "$:/language/Buttons/Theme/Hint": {
            "title": "$:/language/Buttons/Theme/Hint",
            "text": "Choose the display theme"
        },
        "$:/language/Buttons/Bold/Caption": {
            "title": "$:/language/Buttons/Bold/Caption",
            "text": "bold"
        },
        "$:/language/Buttons/Bold/Hint": {
            "title": "$:/language/Buttons/Bold/Hint",
            "text": "Apply bold formatting to selection"
        },
        "$:/language/Buttons/Clear/Caption": {
            "title": "$:/language/Buttons/Clear/Caption",
            "text": "clear"
        },
        "$:/language/Buttons/Clear/Hint": {
            "title": "$:/language/Buttons/Clear/Hint",
            "text": "Clear image to solid colour"
        },
        "$:/language/Buttons/EditorHeight/Caption": {
            "title": "$:/language/Buttons/EditorHeight/Caption",
            "text": "editor height"
        },
        "$:/language/Buttons/EditorHeight/Caption/Auto": {
            "title": "$:/language/Buttons/EditorHeight/Caption/Auto",
            "text": "Automatically adjust height to fit content"
        },
        "$:/language/Buttons/EditorHeight/Caption/Fixed": {
            "title": "$:/language/Buttons/EditorHeight/Caption/Fixed",
            "text": "Fixed height:"
        },
        "$:/language/Buttons/EditorHeight/Hint": {
            "title": "$:/language/Buttons/EditorHeight/Hint",
            "text": "Choose the height of the text editor"
        },
        "$:/language/Buttons/Excise/Caption": {
            "title": "$:/language/Buttons/Excise/Caption",
            "text": "excise"
        },
        "$:/language/Buttons/Excise/Caption/Excise": {
            "title": "$:/language/Buttons/Excise/Caption/Excise",
            "text": "Perform excision"
        },
        "$:/language/Buttons/Excise/Caption/MacroName": {
            "title": "$:/language/Buttons/Excise/Caption/MacroName",
            "text": "Macro name:"
        },
        "$:/language/Buttons/Excise/Caption/NewTitle": {
            "title": "$:/language/Buttons/Excise/Caption/NewTitle",
            "text": "Title of new tiddler:"
        },
        "$:/language/Buttons/Excise/Caption/Replace": {
            "title": "$:/language/Buttons/Excise/Caption/Replace",
            "text": "Replace excised text with:"
        },
        "$:/language/Buttons/Excise/Caption/Replace/Macro": {
            "title": "$:/language/Buttons/Excise/Caption/Replace/Macro",
            "text": "macro"
        },
        "$:/language/Buttons/Excise/Caption/Replace/Link": {
            "title": "$:/language/Buttons/Excise/Caption/Replace/Link",
            "text": "link"
        },
        "$:/language/Buttons/Excise/Caption/Replace/Transclusion": {
            "title": "$:/language/Buttons/Excise/Caption/Replace/Transclusion",
            "text": "transclusion"
        },
        "$:/language/Buttons/Excise/Caption/Tag": {
            "title": "$:/language/Buttons/Excise/Caption/Tag",
            "text": "Tag new tiddler with the title of this tiddler"
        },
        "$:/language/Buttons/Excise/Caption/TiddlerExists": {
            "title": "$:/language/Buttons/Excise/Caption/TiddlerExists",
            "text": "Warning: tiddler already exists"
        },
        "$:/language/Buttons/Excise/Hint": {
            "title": "$:/language/Buttons/Excise/Hint",
            "text": "Excise the selected text into a new tiddler"
        },
        "$:/language/Buttons/Heading1/Caption": {
            "title": "$:/language/Buttons/Heading1/Caption",
            "text": "heading 1"
        },
        "$:/language/Buttons/Heading1/Hint": {
            "title": "$:/language/Buttons/Heading1/Hint",
            "text": "Apply heading level 1 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading2/Caption": {
            "title": "$:/language/Buttons/Heading2/Caption",
            "text": "heading 2"
        },
        "$:/language/Buttons/Heading2/Hint": {
            "title": "$:/language/Buttons/Heading2/Hint",
            "text": "Apply heading level 2 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading3/Caption": {
            "title": "$:/language/Buttons/Heading3/Caption",
            "text": "heading 3"
        },
        "$:/language/Buttons/Heading3/Hint": {
            "title": "$:/language/Buttons/Heading3/Hint",
            "text": "Apply heading level 3 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading4/Caption": {
            "title": "$:/language/Buttons/Heading4/Caption",
            "text": "heading 4"
        },
        "$:/language/Buttons/Heading4/Hint": {
            "title": "$:/language/Buttons/Heading4/Hint",
            "text": "Apply heading level 4 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading5/Caption": {
            "title": "$:/language/Buttons/Heading5/Caption",
            "text": "heading 5"
        },
        "$:/language/Buttons/Heading5/Hint": {
            "title": "$:/language/Buttons/Heading5/Hint",
            "text": "Apply heading level 5 formatting to lines containing selection"
        },
        "$:/language/Buttons/Heading6/Caption": {
            "title": "$:/language/Buttons/Heading6/Caption",
            "text": "heading 6"
        },
        "$:/language/Buttons/Heading6/Hint": {
            "title": "$:/language/Buttons/Heading6/Hint",
            "text": "Apply heading level 6 formatting to lines containing selection"
        },
        "$:/language/Buttons/Italic/Caption": {
            "title": "$:/language/Buttons/Italic/Caption",
            "text": "italic"
        },
        "$:/language/Buttons/Italic/Hint": {
            "title": "$:/language/Buttons/Italic/Hint",
            "text": "Apply italic formatting to selection"
        },
        "$:/language/Buttons/LineWidth/Caption": {
            "title": "$:/language/Buttons/LineWidth/Caption",
            "text": "line width"
        },
        "$:/language/Buttons/LineWidth/Hint": {
            "title": "$:/language/Buttons/LineWidth/Hint",
            "text": "Set line width for painting"
        },
        "$:/language/Buttons/Link/Caption": {
            "title": "$:/language/Buttons/Link/Caption",
            "text": "link"
        },
        "$:/language/Buttons/Link/Hint": {
            "title": "$:/language/Buttons/Link/Hint",
            "text": "Create wikitext link"
        },
        "$:/language/Buttons/Linkify/Caption": {
            "title": "$:/language/Buttons/Linkify/Caption",
            "text": "wikilink"
        },
        "$:/language/Buttons/Linkify/Hint": {
            "title": "$:/language/Buttons/Linkify/Hint",
            "text": "Wrap selection in square brackets"
        },
        "$:/language/Buttons/ListBullet/Caption": {
            "title": "$:/language/Buttons/ListBullet/Caption",
            "text": "bulleted list"
        },
        "$:/language/Buttons/ListBullet/Hint": {
            "title": "$:/language/Buttons/ListBullet/Hint",
            "text": "Apply bulleted list formatting to lines containing selection"
        },
        "$:/language/Buttons/ListNumber/Caption": {
            "title": "$:/language/Buttons/ListNumber/Caption",
            "text": "numbered list"
        },
        "$:/language/Buttons/ListNumber/Hint": {
            "title": "$:/language/Buttons/ListNumber/Hint",
            "text": "Apply numbered list formatting to lines containing selection"
        },
        "$:/language/Buttons/MonoBlock/Caption": {
            "title": "$:/language/Buttons/MonoBlock/Caption",
            "text": "monospaced block"
        },
        "$:/language/Buttons/MonoBlock/Hint": {
            "title": "$:/language/Buttons/MonoBlock/Hint",
            "text": "Apply monospaced block formatting to lines containing selection"
        },
        "$:/language/Buttons/MonoLine/Caption": {
            "title": "$:/language/Buttons/MonoLine/Caption",
            "text": "monospaced"
        },
        "$:/language/Buttons/MonoLine/Hint": {
            "title": "$:/language/Buttons/MonoLine/Hint",
            "text": "Apply monospaced character formatting to selection"
        },
        "$:/language/Buttons/Opacity/Caption": {
            "title": "$:/language/Buttons/Opacity/Caption",
            "text": "opacity"
        },
        "$:/language/Buttons/Opacity/Hint": {
            "title": "$:/language/Buttons/Opacity/Hint",
            "text": "Set painting opacity"
        },
        "$:/language/Buttons/Paint/Caption": {
            "title": "$:/language/Buttons/Paint/Caption",
            "text": "paint colour"
        },
        "$:/language/Buttons/Paint/Hint": {
            "title": "$:/language/Buttons/Paint/Hint",
            "text": "Set painting colour"
        },
        "$:/language/Buttons/Picture/Caption": {
            "title": "$:/language/Buttons/Picture/Caption",
            "text": "picture"
        },
        "$:/language/Buttons/Picture/Hint": {
            "title": "$:/language/Buttons/Picture/Hint",
            "text": "Insert picture"
        },
        "$:/language/Buttons/Preview/Caption": {
            "title": "$:/language/Buttons/Preview/Caption",
            "text": "preview"
        },
        "$:/language/Buttons/Preview/Hint": {
            "title": "$:/language/Buttons/Preview/Hint",
            "text": "Show preview pane"
        },
        "$:/language/Buttons/PreviewType/Caption": {
            "title": "$:/language/Buttons/PreviewType/Caption",
            "text": "preview type"
        },
        "$:/language/Buttons/PreviewType/Hint": {
            "title": "$:/language/Buttons/PreviewType/Hint",
            "text": "Choose preview type"
        },
        "$:/language/Buttons/Quote/Caption": {
            "title": "$:/language/Buttons/Quote/Caption",
            "text": "quote"
        },
        "$:/language/Buttons/Quote/Hint": {
            "title": "$:/language/Buttons/Quote/Hint",
            "text": "Apply quoted text formatting to lines containing selection"
        },
        "$:/language/Buttons/RotateLeft/Caption": {
            "title": "$:/language/Buttons/RotateLeft/Caption",
            "text": "rotate left"
        },
        "$:/language/Buttons/RotateLeft/Hint": {
            "title": "$:/language/Buttons/RotateLeft/Hint",
            "text": "Rotate image left by 90 degrees"
        },
        "$:/language/Buttons/Size/Caption": {
            "title": "$:/language/Buttons/Size/Caption",
            "text": "image size"
        },
        "$:/language/Buttons/Size/Caption/Height": {
            "title": "$:/language/Buttons/Size/Caption/Height",
            "text": "Height:"
        },
        "$:/language/Buttons/Size/Caption/Resize": {
            "title": "$:/language/Buttons/Size/Caption/Resize",
            "text": "Resize image"
        },
        "$:/language/Buttons/Size/Caption/Width": {
            "title": "$:/language/Buttons/Size/Caption/Width",
            "text": "Width:"
        },
        "$:/language/Buttons/Size/Hint": {
            "title": "$:/language/Buttons/Size/Hint",
            "text": "Set image size"
        },
        "$:/language/Buttons/Stamp/Caption": {
            "title": "$:/language/Buttons/Stamp/Caption",
            "text": "stamp"
        },
        "$:/language/Buttons/Stamp/Caption/New": {
            "title": "$:/language/Buttons/Stamp/Caption/New",
            "text": "Add your own"
        },
        "$:/language/Buttons/Stamp/Hint": {
            "title": "$:/language/Buttons/Stamp/Hint",
            "text": "Insert a preconfigured snippet of text"
        },
        "$:/language/Buttons/Stamp/New/Title": {
            "title": "$:/language/Buttons/Stamp/New/Title",
            "text": "Name as shown in menu"
        },
        "$:/language/Buttons/Stamp/New/Text": {
            "title": "$:/language/Buttons/Stamp/New/Text",
            "text": "Text of snippet. (Remember to add a descriptive title in the caption field)."
        },
        "$:/language/Buttons/Strikethrough/Caption": {
            "title": "$:/language/Buttons/Strikethrough/Caption",
            "text": "strikethrough"
        },
        "$:/language/Buttons/Strikethrough/Hint": {
            "title": "$:/language/Buttons/Strikethrough/Hint",
            "text": "Apply strikethrough formatting to selection"
        },
        "$:/language/Buttons/Subscript/Caption": {
            "title": "$:/language/Buttons/Subscript/Caption",
            "text": "subscript"
        },
        "$:/language/Buttons/Subscript/Hint": {
            "title": "$:/language/Buttons/Subscript/Hint",
            "text": "Apply subscript formatting to selection"
        },
        "$:/language/Buttons/Superscript/Caption": {
            "title": "$:/language/Buttons/Superscript/Caption",
            "text": "superscript"
        },
        "$:/language/Buttons/Superscript/Hint": {
            "title": "$:/language/Buttons/Superscript/Hint",
            "text": "Apply superscript formatting to selection"
        },
        "$:/language/Buttons/ToggleSidebar/Hint": {
            "title": "$:/language/Buttons/ToggleSidebar/Hint",
            "text": "Toggle the sidebar visibility"
        },
        "$:/language/Buttons/Transcludify/Caption": {
            "title": "$:/language/Buttons/Transcludify/Caption",
            "text": "transclusion"
        },
        "$:/language/Buttons/Transcludify/Hint": {
            "title": "$:/language/Buttons/Transcludify/Hint",
            "text": "Wrap selection in curly brackets"
        },
        "$:/language/Buttons/Underline/Caption": {
            "title": "$:/language/Buttons/Underline/Caption",
            "text": "underline"
        },
        "$:/language/Buttons/Underline/Hint": {
            "title": "$:/language/Buttons/Underline/Hint",
            "text": "Apply underline formatting to selection"
        },
        "$:/language/ControlPanel/Advanced/Caption": {
            "title": "$:/language/ControlPanel/Advanced/Caption",
            "text": "Advanced"
        },
        "$:/language/ControlPanel/Advanced/Hint": {
            "title": "$:/language/ControlPanel/Advanced/Hint",
            "text": "Internal information about this TiddlyWiki"
        },
        "$:/language/ControlPanel/Appearance/Caption": {
            "title": "$:/language/ControlPanel/Appearance/Caption",
            "text": "Appearance"
        },
        "$:/language/ControlPanel/Appearance/Hint": {
            "title": "$:/language/ControlPanel/Appearance/Hint",
            "text": "Ways to customise the appearance of your TiddlyWiki."
        },
        "$:/language/ControlPanel/Basics/AnimDuration/Prompt": {
            "title": "$:/language/ControlPanel/Basics/AnimDuration/Prompt",
            "text": "Animation duration"
        },
        "$:/language/ControlPanel/Basics/AutoFocus/Prompt": {
            "title": "$:/language/ControlPanel/Basics/AutoFocus/Prompt",
            "text": "Default focus field for new tiddlers"
        },
        "$:/language/ControlPanel/Basics/Caption": {
            "title": "$:/language/ControlPanel/Basics/Caption",
            "text": "Basics"
        },
        "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint": {
            "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint",
            "text": "Use &#91;&#91;double square brackets&#93;&#93; for titles with spaces. Or you can choose to <$button set=\"$:/DefaultTiddlers\" setTo=\"[list[$:/StoryList]]\">retain story ordering</$button>"
        },
        "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt",
            "text": "Default tiddlers"
        },
        "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint": {
            "title": "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint",
            "text": "Choose which tiddlers are displayed at startup"
        },
        "$:/language/ControlPanel/Basics/Language/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Language/Prompt",
            "text": "Hello! Current language:"
        },
        "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt",
            "text": "Title of new journal tiddlers"
        },
        "$:/language/ControlPanel/Basics/NewJournal/Text/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewJournal/Text/Prompt",
            "text": "Text for new journal tiddlers"
        },
        "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt",
            "text": "Tags for new journal tiddlers"
        },
        "$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt",
            "text": "Title of new tiddlers"
        },
        "$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt": {
            "title": "$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt",
            "text": "Tags for new tiddlers"
        },
        "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt",
            "text": "Number of overridden shadow tiddlers"
        },
        "$:/language/ControlPanel/Basics/RemoveTags": {
            "title": "$:/language/ControlPanel/Basics/RemoveTags",
            "text": "Update to current format"
        },
        "$:/language/ControlPanel/Basics/RemoveTags/Hint": {
            "title": "$:/language/ControlPanel/Basics/RemoveTags/Hint",
            "text": "Update the tags configuration to the latest format"
        },
        "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt",
            "text": "Number of shadow tiddlers"
        },
        "$:/language/ControlPanel/Basics/Subtitle/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Subtitle/Prompt",
            "text": "Subtitle"
        },
        "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt",
            "text": "Number of system tiddlers"
        },
        "$:/language/ControlPanel/Basics/Tags/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Tags/Prompt",
            "text": "Number of tags"
        },
        "$:/language/ControlPanel/Basics/Tiddlers/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Tiddlers/Prompt",
            "text": "Number of tiddlers"
        },
        "$:/language/ControlPanel/Basics/Title/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Title/Prompt",
            "text": "Title of this ~TiddlyWiki"
        },
        "$:/language/ControlPanel/Basics/Username/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Username/Prompt",
            "text": "Username for signing edits"
        },
        "$:/language/ControlPanel/Basics/Version/Prompt": {
            "title": "$:/language/ControlPanel/Basics/Version/Prompt",
            "text": "~TiddlyWiki version"
        },
        "$:/language/ControlPanel/EditorTypes/Caption": {
            "title": "$:/language/ControlPanel/EditorTypes/Caption",
            "text": "Editor Types"
        },
        "$:/language/ControlPanel/EditorTypes/Editor/Caption": {
            "title": "$:/language/ControlPanel/EditorTypes/Editor/Caption",
            "text": "Editor"
        },
        "$:/language/ControlPanel/EditorTypes/Hint": {
            "title": "$:/language/ControlPanel/EditorTypes/Hint",
            "text": "These tiddlers determine which editor is used to edit specific tiddler types."
        },
        "$:/language/ControlPanel/EditorTypes/Type/Caption": {
            "title": "$:/language/ControlPanel/EditorTypes/Type/Caption",
            "text": "Type"
        },
        "$:/language/ControlPanel/Info/Caption": {
            "title": "$:/language/ControlPanel/Info/Caption",
            "text": "Info"
        },
        "$:/language/ControlPanel/Info/Hint": {
            "title": "$:/language/ControlPanel/Info/Hint",
            "text": "Information about this TiddlyWiki"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt",
            "text": "Type shortcut here"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption",
            "text": "add shortcut"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Caption": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Caption",
            "text": "Keyboard Shortcuts"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Hint": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Hint",
            "text": "Manage keyboard shortcut assignments"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption",
            "text": "No keyboard shortcuts assigned"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint",
            "text": "remove keyboard shortcut"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/All": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/All",
            "text": "All platforms"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac",
            "text": "Macintosh platform only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac",
            "text": "Non-Macintosh platforms only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux",
            "text": "Linux platform only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux",
            "text": "Non-Linux platforms only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows",
            "text": "Windows platform only"
        },
        "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows": {
            "title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows",
            "text": "Non-Windows platforms only"
        },
        "$:/language/ControlPanel/LayoutSwitcher/Caption": {
            "title": "$:/language/ControlPanel/LayoutSwitcher/Caption",
            "text": "Layout"
        },
        "$:/language/ControlPanel/LoadedModules/Caption": {
            "title": "$:/language/ControlPanel/LoadedModules/Caption",
            "text": "Loaded Modules"
        },
        "$:/language/ControlPanel/LoadedModules/Hint": {
            "title": "$:/language/ControlPanel/LoadedModules/Hint",
            "text": "These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process."
        },
        "$:/language/ControlPanel/Palette/Caption": {
            "title": "$:/language/ControlPanel/Palette/Caption",
            "text": "Palette"
        },
        "$:/language/ControlPanel/Palette/Editor/Clone/Caption": {
            "title": "$:/language/ControlPanel/Palette/Editor/Clone/Caption",
            "text": "clone"
        },
        "$:/language/ControlPanel/Palette/Editor/Clone/Prompt": {
            "title": "$:/language/ControlPanel/Palette/Editor/Clone/Prompt",
            "text": "It is recommended that you clone this shadow palette before editing it"
        },
        "$:/language/ControlPanel/Palette/Editor/Delete/Hint": {
            "title": "$:/language/ControlPanel/Palette/Editor/Delete/Hint",
            "text": "delete this entry from the current palette"
        },
        "$:/language/ControlPanel/Palette/Editor/Names/External/Show": {
            "title": "$:/language/ControlPanel/Palette/Editor/Names/External/Show",
            "text": "Show color names that are not part of the current palette"
        },
        "$:/language/ControlPanel/Palette/Editor/Prompt/Modified": {
            "title": "$:/language/ControlPanel/Palette/Editor/Prompt/Modified",
            "text": "This shadow palette has been modified"
        },
        "$:/language/ControlPanel/Palette/Editor/Prompt": {
            "title": "$:/language/ControlPanel/Palette/Editor/Prompt",
            "text": "Editing"
        },
        "$:/language/ControlPanel/Palette/Editor/Reset/Caption": {
            "title": "$:/language/ControlPanel/Palette/Editor/Reset/Caption",
            "text": "reset"
        },
        "$:/language/ControlPanel/Palette/HideEditor/Caption": {
            "title": "$:/language/ControlPanel/Palette/HideEditor/Caption",
            "text": "hide editor"
        },
        "$:/language/ControlPanel/Palette/Prompt": {
            "title": "$:/language/ControlPanel/Palette/Prompt",
            "text": "Current palette:"
        },
        "$:/language/ControlPanel/Palette/ShowEditor/Caption": {
            "title": "$:/language/ControlPanel/Palette/ShowEditor/Caption",
            "text": "show editor"
        },
        "$:/language/ControlPanel/Parsing/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Caption",
            "text": "Parsing"
        },
        "$:/language/ControlPanel/Parsing/Hint": {
            "title": "$:/language/ControlPanel/Parsing/Hint",
            "text": "Here you can globally disable/enable wiki parser rules. For changes to take effect, save and reload your wiki. Disabling certain parser rules can prevent <$text text=\"TiddlyWiki\"/> from functioning correctly. Use [[safe mode|https://tiddlywiki.com/#SafeMode]] to restore normal operation."
        },
        "$:/language/ControlPanel/Parsing/Block/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Block/Caption",
            "text": "Block Parse Rules"
        },
        "$:/language/ControlPanel/Parsing/Inline/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Inline/Caption",
            "text": "Inline Parse Rules"
        },
        "$:/language/ControlPanel/Parsing/Pragma/Caption": {
            "title": "$:/language/ControlPanel/Parsing/Pragma/Caption",
            "text": "Pragma Parse Rules"
        },
        "$:/language/ControlPanel/Plugins/Add/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Add/Caption",
            "text": "Get more plugins"
        },
        "$:/language/ControlPanel/Plugins/Add/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Add/Hint",
            "text": "Install plugins from the official library"
        },
        "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint": {
            "title": "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint",
            "text": "This plugin is already installed at version <$text text=<<installedVersion>>/>"
        },
        "$:/language/ControlPanel/Plugins/AlsoRequires": {
            "title": "$:/language/ControlPanel/Plugins/AlsoRequires",
            "text": "Also requires:"
        },
        "$:/language/ControlPanel/Plugins/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Caption",
            "text": "Plugins"
        },
        "$:/language/ControlPanel/Plugins/Disable/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Disable/Caption",
            "text": "disable"
        },
        "$:/language/ControlPanel/Plugins/Disable/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Disable/Hint",
            "text": "Disable this plugin when reloading page"
        },
        "$:/language/ControlPanel/Plugins/Disabled/Status": {
            "title": "$:/language/ControlPanel/Plugins/Disabled/Status",
            "text": "(disabled)"
        },
        "$:/language/ControlPanel/Plugins/Downgrade/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Downgrade/Caption",
            "text": "downgrade"
        },
        "$:/language/ControlPanel/Plugins/Empty/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Empty/Hint",
            "text": "None"
        },
        "$:/language/ControlPanel/Plugins/Enable/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Enable/Caption",
            "text": "enable"
        },
        "$:/language/ControlPanel/Plugins/Enable/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Enable/Hint",
            "text": "Enable this plugin when reloading page"
        },
        "$:/language/ControlPanel/Plugins/Install/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Install/Caption",
            "text": "install"
        },
        "$:/language/ControlPanel/Plugins/Installed/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Installed/Hint",
            "text": "Currently installed plugins:"
        },
        "$:/language/ControlPanel/Plugins/Languages/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Languages/Caption",
            "text": "Languages"
        },
        "$:/language/ControlPanel/Plugins/Languages/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Languages/Hint",
            "text": "Language pack plugins"
        },
        "$:/language/ControlPanel/Plugins/NoInfoFound/Hint": {
            "title": "$:/language/ControlPanel/Plugins/NoInfoFound/Hint",
            "text": "No ''\"<$text text=<<currentTab>>/>\"'' found"
        },
        "$:/language/ControlPanel/Plugins/NotInstalled/Hint": {
            "title": "$:/language/ControlPanel/Plugins/NotInstalled/Hint",
            "text": "This plugin is not currently installed"
        },
        "$:/language/ControlPanel/Plugins/OpenPluginLibrary": {
            "title": "$:/language/ControlPanel/Plugins/OpenPluginLibrary",
            "text": "open plugin library"
        },
        "$:/language/ControlPanel/Plugins/ClosePluginLibrary": {
            "title": "$:/language/ControlPanel/Plugins/ClosePluginLibrary",
            "text": "close plugin library"
        },
        "$:/language/ControlPanel/Plugins/PluginWillRequireReload": {
            "title": "$:/language/ControlPanel/Plugins/PluginWillRequireReload",
            "text": "(requires reload)"
        },
        "$:/language/ControlPanel/Plugins/Plugins/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Plugins/Caption",
            "text": "Plugins"
        },
        "$:/language/ControlPanel/Plugins/Plugins/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Plugins/Hint",
            "text": "Plugins"
        },
        "$:/language/ControlPanel/Plugins/Reinstall/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Reinstall/Caption",
            "text": "reinstall"
        },
        "$:/language/ControlPanel/Plugins/Themes/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Themes/Caption",
            "text": "Themes"
        },
        "$:/language/ControlPanel/Plugins/Themes/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Themes/Hint",
            "text": "Theme plugins"
        },
        "$:/language/ControlPanel/Plugins/Update/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Update/Caption",
            "text": "update"
        },
        "$:/language/ControlPanel/Plugins/Updates/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Updates/Caption",
            "text": "Updates"
        },
        "$:/language/ControlPanel/Plugins/Updates/Hint": {
            "title": "$:/language/ControlPanel/Plugins/Updates/Hint",
            "text": "Available updates to installed plugins"
        },
        "$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption": {
            "title": "$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption",
            "text": "Update <<update-count>> plugins"
        },
        "$:/language/ControlPanel/Plugins/SubPluginPrompt": {
            "title": "$:/language/ControlPanel/Plugins/SubPluginPrompt",
            "text": "With <<count>> sub-plugins available"
        },
        "$:/language/ControlPanel/Saving/Caption": {
            "title": "$:/language/ControlPanel/Saving/Caption",
            "text": "Saving"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description",
            "text": "Permit automatic saving for the download saver"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint",
            "text": "Enable Autosave for Download Saver"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/Caption": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/Caption",
            "text": "Download Saver"
        },
        "$:/language/ControlPanel/Saving/DownloadSaver/Hint": {
            "title": "$:/language/ControlPanel/Saving/DownloadSaver/Hint",
            "text": "These settings apply to the HTML5-compatible download saver"
        },
        "$:/language/ControlPanel/Saving/General/Caption": {
            "title": "$:/language/ControlPanel/Saving/General/Caption",
            "text": "General"
        },
        "$:/language/ControlPanel/Saving/General/Hint": {
            "title": "$:/language/ControlPanel/Saving/General/Hint",
            "text": "These settings apply to all the loaded savers"
        },
        "$:/language/ControlPanel/Saving/Hint": {
            "title": "$:/language/ControlPanel/Saving/Hint",
            "text": "Settings used for saving the entire TiddlyWiki as a single file via a saver module"
        },
        "$:/language/ControlPanel/Saving/GitService/Branch": {
            "title": "$:/language/ControlPanel/Saving/GitService/Branch",
            "text": "Target branch for saving"
        },
        "$:/language/ControlPanel/Saving/GitService/CommitMessage": {
            "title": "$:/language/ControlPanel/Saving/GitService/CommitMessage",
            "text": "Saved by TiddlyWiki"
        },
        "$:/language/ControlPanel/Saving/GitService/Description": {
            "title": "$:/language/ControlPanel/Saving/GitService/Description",
            "text": "These settings are only used when saving to <<service-name>>"
        },
        "$:/language/ControlPanel/Saving/GitService/Filename": {
            "title": "$:/language/ControlPanel/Saving/GitService/Filename",
            "text": "Filename of target file (e.g. `index.html`)"
        },
        "$:/language/ControlPanel/Saving/GitService/Path": {
            "title": "$:/language/ControlPanel/Saving/GitService/Path",
            "text": "Path to target file (e.g. `/wiki/`)"
        },
        "$:/language/ControlPanel/Saving/GitService/Repo": {
            "title": "$:/language/ControlPanel/Saving/GitService/Repo",
            "text": "Target repository (e.g. `Jermolene/TiddlyWiki5`)"
        },
        "$:/language/ControlPanel/Saving/GitService/ServerURL": {
            "title": "$:/language/ControlPanel/Saving/GitService/ServerURL",
            "text": "Server API URL"
        },
        "$:/language/ControlPanel/Saving/GitService/UserName": {
            "title": "$:/language/ControlPanel/Saving/GitService/UserName",
            "text": "Username"
        },
        "$:/language/ControlPanel/Saving/GitService/GitHub/Caption": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitHub/Caption",
            "text": "~GitHub Saver"
        },
        "$:/language/ControlPanel/Saving/GitService/GitHub/Password": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitHub/Password",
            "text": "Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details)"
        },
        "$:/language/ControlPanel/Saving/GitService/GitLab/Caption": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitLab/Caption",
            "text": "~GitLab Saver"
        },
        "$:/language/ControlPanel/Saving/GitService/GitLab/Password": {
            "title": "$:/language/ControlPanel/Saving/GitService/GitLab/Password",
            "text": "Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details)"
        },
        "$:/language/ControlPanel/Saving/GitService/Gitea/Caption": {
            "title": "$:/language/ControlPanel/Saving/GitService/Gitea/Caption",
            "text": "Gitea Saver"
        },
        "$:/language/ControlPanel/Saving/GitService/Gitea/Password": {
            "title": "$:/language/ControlPanel/Saving/GitService/Gitea/Password",
            "text": "Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`)"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading",
            "text": "Advanced Settings"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir",
            "text": "Backup Directory"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel",
            "text": "~TiddlySpot Control Panel"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Backups": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Backups",
            "text": "Backups"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Caption": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Caption",
            "text": "~TiddlySpot Saver"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Description": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Description",
            "text": "These settings are only used when saving to http://tiddlyspot.com or a compatible remote server"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Filename": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Filename",
            "text": "Upload Filename"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Heading": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Heading",
            "text": "~TiddlySpot"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Hint": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Hint",
            "text": "//The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.//"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/Password": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/Password",
            "text": "Password"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly",
            "text": "The ~TiddlySpot service is currently only available in read-only form. Please see http://tiddlyspot.com/ for the latest details. The ~TiddlySpot saver can still be used to save to compatible servers."
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL",
            "text": "Server URL"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir",
            "text": "Upload Directory"
        },
        "$:/language/ControlPanel/Saving/TiddlySpot/UserName": {
            "title": "$:/language/ControlPanel/Saving/TiddlySpot/UserName",
            "text": "Wiki Name"
        },
        "$:/language/ControlPanel/Settings/AutoSave/Caption": {
            "title": "$:/language/ControlPanel/Settings/AutoSave/Caption",
            "text": "Autosave"
        },
        "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description": {
            "title": "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description",
            "text": "Do not save changes automatically"
        },
        "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description": {
            "title": "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description",
            "text": "Save changes automatically"
        },
        "$:/language/ControlPanel/Settings/AutoSave/Hint": {
            "title": "$:/language/ControlPanel/Settings/AutoSave/Hint",
            "text": "Attempt to automatically save changes during editing when using a supporting saver"
        },
        "$:/language/ControlPanel/Settings/CamelCase/Caption": {
            "title": "$:/language/ControlPanel/Settings/CamelCase/Caption",
            "text": "Camel Case Wiki Links"
        },
        "$:/language/ControlPanel/Settings/CamelCase/Hint": {
            "title": "$:/language/ControlPanel/Settings/CamelCase/Hint",
            "text": "You can globally disable automatic linking of ~CamelCase phrases. Requires reload to take effect"
        },
        "$:/language/ControlPanel/Settings/CamelCase/Description": {
            "title": "$:/language/ControlPanel/Settings/CamelCase/Description",
            "text": "Enable automatic ~CamelCase linking"
        },
        "$:/language/ControlPanel/Settings/Caption": {
            "title": "$:/language/ControlPanel/Settings/Caption",
            "text": "Settings"
        },
        "$:/language/ControlPanel/Settings/EditorToolbar/Caption": {
            "title": "$:/language/ControlPanel/Settings/EditorToolbar/Caption",
            "text": "Editor Toolbar"
        },
        "$:/language/ControlPanel/Settings/EditorToolbar/Hint": {
            "title": "$:/language/ControlPanel/Settings/EditorToolbar/Hint",
            "text": "Enable or disable the editor toolbar:"
        },
        "$:/language/ControlPanel/Settings/EditorToolbar/Description": {
            "title": "$:/language/ControlPanel/Settings/EditorToolbar/Description",
            "text": "Show editor toolbar"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Caption": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Caption",
            "text": "Tiddler Info Panel Mode"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Hint": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Hint",
            "text": "Control when the tiddler info panel closes:"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description",
            "text": "Tiddler info panel closes automatically"
        },
        "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description": {
            "title": "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description",
            "text": "Tiddler info panel stays open until explicitly closed"
        },
        "$:/language/ControlPanel/Settings/Hint": {
            "title": "$:/language/ControlPanel/Settings/Hint",
            "text": "These settings let you customise the behaviour of TiddlyWiki."
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption",
            "text": "Navigation Address Bar"
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint",
            "text": "Behaviour of the browser address bar when navigating to a tiddler:"
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description",
            "text": "Do not update the address bar"
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description",
            "text": "Include the target tiddler"
        },
        "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description",
            "text": "Include the target tiddler and the current story sequence"
        },
        "$:/language/ControlPanel/Settings/NavigationHistory/Caption": {
            "title": "$:/language/ControlPanel/Settings/NavigationHistory/Caption",
            "text": "Navigation History"
        },
        "$:/language/ControlPanel/Settings/NavigationHistory/Hint": {
            "title": "$:/language/ControlPanel/Settings/NavigationHistory/Hint",
            "text": "Update browser history when navigating to a tiddler:"
        },
        "$:/language/ControlPanel/Settings/NavigationHistory/No/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationHistory/No/Description",
            "text": "Do not update history"
        },
        "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description",
            "text": "Update history"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption",
            "text": "Permalink/permaview Mode"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint",
            "text": "Choose how permalink/permaview is handled:"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description",
            "text": "Copy permalink/permaview URL to clipboard"
        },
        "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description": {
            "title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description",
            "text": "Update address bar with permalink/permaview URL"
        },
        "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption": {
            "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption",
            "text": "Performance Instrumentation"
        },
        "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint": {
            "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint",
            "text": "Displays performance statistics in the browser developer console. Requires reload to take effect"
        },
        "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description": {
            "title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description",
            "text": "Enable performance instrumentation"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption",
            "text": "Toolbar Button Style"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint",
            "text": "Choose the style for toolbar buttons:"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless",
            "text": "Borderless"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed",
            "text": "Boxed"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded",
            "text": "Rounded"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtons/Caption": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Caption",
            "text": "Toolbar Buttons"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtons/Hint": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Hint",
            "text": "Default toolbar button appearance:"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description",
            "text": "Include icon"
        },
        "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description": {
            "title": "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description",
            "text": "Include text"
        },
        "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption": {
            "title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption",
            "text": "Default Sidebar Tab"
        },
        "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint": {
            "title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint",
            "text": "Specify which sidebar tab is displayed by default"
        },
        "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption": {
            "title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption",
            "text": "Default More Sidebar Tab"
        },
        "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint": {
            "title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint",
            "text": "Specify which More sidebar tab is displayed by default"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption",
            "text": "Tiddler Opening Behaviour"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint",
            "text": "Navigation from //within// the story river"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint",
            "text": "Navigation from //outside// the story river"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove",
            "text": "Open above the current tiddler"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow",
            "text": "Open below the current tiddler"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop",
            "text": "Open at the top of the story river"
        },
        "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom": {
            "title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom",
            "text": "Open at the bottom of the story river"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/Caption": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/Caption",
            "text": "Tiddler Titles"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/Hint": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/Hint",
            "text": "Optionally display tiddler titles as links"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/No/Description": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/No/Description",
            "text": "Do not display tiddler titles as links"
        },
        "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description": {
            "title": "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description",
            "text": "Display tiddler titles as links"
        },
        "$:/language/ControlPanel/Settings/MissingLinks/Caption": {
            "title": "$:/language/ControlPanel/Settings/MissingLinks/Caption",
            "text": "Wiki Links"
        },
        "$:/language/ControlPanel/Settings/MissingLinks/Hint": {
            "title": "$:/language/ControlPanel/Settings/MissingLinks/Hint",
            "text": "Choose whether to link to tiddlers that do not exist yet"
        },
        "$:/language/ControlPanel/Settings/MissingLinks/Description": {
            "title": "$:/language/ControlPanel/Settings/MissingLinks/Description",
            "text": "Enable links to missing tiddlers"
        },
        "$:/language/ControlPanel/StoryView/Caption": {
            "title": "$:/language/ControlPanel/StoryView/Caption",
            "text": "Story View"
        },
        "$:/language/ControlPanel/StoryView/Prompt": {
            "title": "$:/language/ControlPanel/StoryView/Prompt",
            "text": "Current view:"
        },
        "$:/language/ControlPanel/Stylesheets/Caption": {
            "title": "$:/language/ControlPanel/Stylesheets/Caption",
            "text": "Stylesheets"
        },
        "$:/language/ControlPanel/Stylesheets/Expand/Caption": {
            "title": "$:/language/ControlPanel/Stylesheets/Expand/Caption",
            "text": "Expand All"
        },
        "$:/language/ControlPanel/Stylesheets/Hint": {
            "title": "$:/language/ControlPanel/Stylesheets/Hint",
            "text": "This is the rendered CSS of the current stylesheet tiddlers tagged with <<tag \"$:/tags/Stylesheet\">>"
        },
        "$:/language/ControlPanel/Stylesheets/Restore/Caption": {
            "title": "$:/language/ControlPanel/Stylesheets/Restore/Caption",
            "text": "Restore"
        },
        "$:/language/ControlPanel/Theme/Caption": {
            "title": "$:/language/ControlPanel/Theme/Caption",
            "text": "Theme"
        },
        "$:/language/ControlPanel/Theme/Prompt": {
            "title": "$:/language/ControlPanel/Theme/Prompt",
            "text": "Current theme:"
        },
        "$:/language/ControlPanel/TiddlerFields/Caption": {
            "title": "$:/language/ControlPanel/TiddlerFields/Caption",
            "text": "Tiddler Fields"
        },
        "$:/language/ControlPanel/TiddlerFields/Hint": {
            "title": "$:/language/ControlPanel/TiddlerFields/Hint",
            "text": "This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers)."
        },
        "$:/language/ControlPanel/Toolbars/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/Caption",
            "text": "Toolbars"
        },
        "$:/language/ControlPanel/Toolbars/EditToolbar/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/EditToolbar/Caption",
            "text": "Edit Toolbar"
        },
        "$:/language/ControlPanel/Toolbars/EditToolbar/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/EditToolbar/Hint",
            "text": "Choose which buttons are displayed for tiddlers in edit mode. Drag and drop to change the ordering"
        },
        "$:/language/ControlPanel/Toolbars/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/Hint",
            "text": "Select which toolbar buttons are displayed"
        },
        "$:/language/ControlPanel/Toolbars/PageControls/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/PageControls/Caption",
            "text": "Page Toolbar"
        },
        "$:/language/ControlPanel/Toolbars/PageControls/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/PageControls/Hint",
            "text": "Choose which buttons are displayed on the main page toolbar. Drag and drop to change the ordering"
        },
        "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption",
            "text": "Editor Toolbar"
        },
        "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint",
            "text": "Choose which buttons are displayed in the editor toolbar. Note that some buttons will only appear when editing tiddlers of a certain type. Drag and drop to change the ordering"
        },
        "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption": {
            "title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption",
            "text": "View Toolbar"
        },
        "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint": {
            "title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint",
            "text": "Choose which buttons are displayed for tiddlers in view mode. Drag and drop to change the ordering"
        },
        "$:/language/ControlPanel/Tools/Download/Full/Caption": {
            "title": "$:/language/ControlPanel/Tools/Download/Full/Caption",
            "text": "Download full wiki"
        },
        "$:/language/Date/DaySuffix/1": {
            "title": "$:/language/Date/DaySuffix/1",
            "text": "st"
        },
        "$:/language/Date/DaySuffix/2": {
            "title": "$:/language/Date/DaySuffix/2",
            "text": "nd"
        },
        "$:/language/Date/DaySuffix/3": {
            "title": "$:/language/Date/DaySuffix/3",
            "text": "rd"
        },
        "$:/language/Date/DaySuffix/4": {
            "title": "$:/language/Date/DaySuffix/4",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/5": {
            "title": "$:/language/Date/DaySuffix/5",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/6": {
            "title": "$:/language/Date/DaySuffix/6",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/7": {
            "title": "$:/language/Date/DaySuffix/7",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/8": {
            "title": "$:/language/Date/DaySuffix/8",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/9": {
            "title": "$:/language/Date/DaySuffix/9",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/10": {
            "title": "$:/language/Date/DaySuffix/10",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/11": {
            "title": "$:/language/Date/DaySuffix/11",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/12": {
            "title": "$:/language/Date/DaySuffix/12",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/13": {
            "title": "$:/language/Date/DaySuffix/13",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/14": {
            "title": "$:/language/Date/DaySuffix/14",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/15": {
            "title": "$:/language/Date/DaySuffix/15",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/16": {
            "title": "$:/language/Date/DaySuffix/16",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/17": {
            "title": "$:/language/Date/DaySuffix/17",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/18": {
            "title": "$:/language/Date/DaySuffix/18",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/19": {
            "title": "$:/language/Date/DaySuffix/19",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/20": {
            "title": "$:/language/Date/DaySuffix/20",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/21": {
            "title": "$:/language/Date/DaySuffix/21",
            "text": "st"
        },
        "$:/language/Date/DaySuffix/22": {
            "title": "$:/language/Date/DaySuffix/22",
            "text": "nd"
        },
        "$:/language/Date/DaySuffix/23": {
            "title": "$:/language/Date/DaySuffix/23",
            "text": "rd"
        },
        "$:/language/Date/DaySuffix/24": {
            "title": "$:/language/Date/DaySuffix/24",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/25": {
            "title": "$:/language/Date/DaySuffix/25",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/26": {
            "title": "$:/language/Date/DaySuffix/26",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/27": {
            "title": "$:/language/Date/DaySuffix/27",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/28": {
            "title": "$:/language/Date/DaySuffix/28",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/29": {
            "title": "$:/language/Date/DaySuffix/29",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/30": {
            "title": "$:/language/Date/DaySuffix/30",
            "text": "th"
        },
        "$:/language/Date/DaySuffix/31": {
            "title": "$:/language/Date/DaySuffix/31",
            "text": "st"
        },
        "$:/language/Date/Long/Day/0": {
            "title": "$:/language/Date/Long/Day/0",
            "text": "Sunday"
        },
        "$:/language/Date/Long/Day/1": {
            "title": "$:/language/Date/Long/Day/1",
            "text": "Monday"
        },
        "$:/language/Date/Long/Day/2": {
            "title": "$:/language/Date/Long/Day/2",
            "text": "Tuesday"
        },
        "$:/language/Date/Long/Day/3": {
            "title": "$:/language/Date/Long/Day/3",
            "text": "Wednesday"
        },
        "$:/language/Date/Long/Day/4": {
            "title": "$:/language/Date/Long/Day/4",
            "text": "Thursday"
        },
        "$:/language/Date/Long/Day/5": {
            "title": "$:/language/Date/Long/Day/5",
            "text": "Friday"
        },
        "$:/language/Date/Long/Day/6": {
            "title": "$:/language/Date/Long/Day/6",
            "text": "Saturday"
        },
        "$:/language/Date/Long/Month/1": {
            "title": "$:/language/Date/Long/Month/1",
            "text": "January"
        },
        "$:/language/Date/Long/Month/2": {
            "title": "$:/language/Date/Long/Month/2",
            "text": "February"
        },
        "$:/language/Date/Long/Month/3": {
            "title": "$:/language/Date/Long/Month/3",
            "text": "March"
        },
        "$:/language/Date/Long/Month/4": {
            "title": "$:/language/Date/Long/Month/4",
            "text": "April"
        },
        "$:/language/Date/Long/Month/5": {
            "title": "$:/language/Date/Long/Month/5",
            "text": "May"
        },
        "$:/language/Date/Long/Month/6": {
            "title": "$:/language/Date/Long/Month/6",
            "text": "June"
        },
        "$:/language/Date/Long/Month/7": {
            "title": "$:/language/Date/Long/Month/7",
            "text": "July"
        },
        "$:/language/Date/Long/Month/8": {
            "title": "$:/language/Date/Long/Month/8",
            "text": "August"
        },
        "$:/language/Date/Long/Month/9": {
            "title": "$:/language/Date/Long/Month/9",
            "text": "September"
        },
        "$:/language/Date/Long/Month/10": {
            "title": "$:/language/Date/Long/Month/10",
            "text": "October"
        },
        "$:/language/Date/Long/Month/11": {
            "title": "$:/language/Date/Long/Month/11",
            "text": "November"
        },
        "$:/language/Date/Long/Month/12": {
            "title": "$:/language/Date/Long/Month/12",
            "text": "December"
        },
        "$:/language/Date/Period/am": {
            "title": "$:/language/Date/Period/am",
            "text": "am"
        },
        "$:/language/Date/Period/pm": {
            "title": "$:/language/Date/Period/pm",
            "text": "pm"
        },
        "$:/language/Date/Short/Day/0": {
            "title": "$:/language/Date/Short/Day/0",
            "text": "Sun"
        },
        "$:/language/Date/Short/Day/1": {
            "title": "$:/language/Date/Short/Day/1",
            "text": "Mon"
        },
        "$:/language/Date/Short/Day/2": {
            "title": "$:/language/Date/Short/Day/2",
            "text": "Tue"
        },
        "$:/language/Date/Short/Day/3": {
            "title": "$:/language/Date/Short/Day/3",
            "text": "Wed"
        },
        "$:/language/Date/Short/Day/4": {
            "title": "$:/language/Date/Short/Day/4",
            "text": "Thu"
        },
        "$:/language/Date/Short/Day/5": {
            "title": "$:/language/Date/Short/Day/5",
            "text": "Fri"
        },
        "$:/language/Date/Short/Day/6": {
            "title": "$:/language/Date/Short/Day/6",
            "text": "Sat"
        },
        "$:/language/Date/Short/Month/1": {
            "title": "$:/language/Date/Short/Month/1",
            "text": "Jan"
        },
        "$:/language/Date/Short/Month/2": {
            "title": "$:/language/Date/Short/Month/2",
            "text": "Feb"
        },
        "$:/language/Date/Short/Month/3": {
            "title": "$:/language/Date/Short/Month/3",
            "text": "Mar"
        },
        "$:/language/Date/Short/Month/4": {
            "title": "$:/language/Date/Short/Month/4",
            "text": "Apr"
        },
        "$:/language/Date/Short/Month/5": {
            "title": "$:/language/Date/Short/Month/5",
            "text": "May"
        },
        "$:/language/Date/Short/Month/6": {
            "title": "$:/language/Date/Short/Month/6",
            "text": "Jun"
        },
        "$:/language/Date/Short/Month/7": {
            "title": "$:/language/Date/Short/Month/7",
            "text": "Jul"
        },
        "$:/language/Date/Short/Month/8": {
            "title": "$:/language/Date/Short/Month/8",
            "text": "Aug"
        },
        "$:/language/Date/Short/Month/9": {
            "title": "$:/language/Date/Short/Month/9",
            "text": "Sep"
        },
        "$:/language/Date/Short/Month/10": {
            "title": "$:/language/Date/Short/Month/10",
            "text": "Oct"
        },
        "$:/language/Date/Short/Month/11": {
            "title": "$:/language/Date/Short/Month/11",
            "text": "Nov"
        },
        "$:/language/Date/Short/Month/12": {
            "title": "$:/language/Date/Short/Month/12",
            "text": "Dec"
        },
        "$:/language/RelativeDate/Future/Days": {
            "title": "$:/language/RelativeDate/Future/Days",
            "text": "<<period>> days from now"
        },
        "$:/language/RelativeDate/Future/Hours": {
            "title": "$:/language/RelativeDate/Future/Hours",
            "text": "<<period>> hours from now"
        },
        "$:/language/RelativeDate/Future/Minutes": {
            "title": "$:/language/RelativeDate/Future/Minutes",
            "text": "<<period>> minutes from now"
        },
        "$:/language/RelativeDate/Future/Months": {
            "title": "$:/language/RelativeDate/Future/Months",
            "text": "<<period>> months from now"
        },
        "$:/language/RelativeDate/Future/Second": {
            "title": "$:/language/RelativeDate/Future/Second",
            "text": "1 second from now"
        },
        "$:/language/RelativeDate/Future/Seconds": {
            "title": "$:/language/RelativeDate/Future/Seconds",
            "text": "<<period>> seconds from now"
        },
        "$:/language/RelativeDate/Future/Years": {
            "title": "$:/language/RelativeDate/Future/Years",
            "text": "<<period>> years from now"
        },
        "$:/language/RelativeDate/Past/Days": {
            "title": "$:/language/RelativeDate/Past/Days",
            "text": "<<period>> days ago"
        },
        "$:/language/RelativeDate/Past/Hours": {
            "title": "$:/language/RelativeDate/Past/Hours",
            "text": "<<period>> hours ago"
        },
        "$:/language/RelativeDate/Past/Minutes": {
            "title": "$:/language/RelativeDate/Past/Minutes",
            "text": "<<period>> minutes ago"
        },
        "$:/language/RelativeDate/Past/Months": {
            "title": "$:/language/RelativeDate/Past/Months",
            "text": "<<period>> months ago"
        },
        "$:/language/RelativeDate/Past/Second": {
            "title": "$:/language/RelativeDate/Past/Second",
            "text": "1 second ago"
        },
        "$:/language/RelativeDate/Past/Seconds": {
            "title": "$:/language/RelativeDate/Past/Seconds",
            "text": "<<period>> seconds ago"
        },
        "$:/language/RelativeDate/Past/Years": {
            "title": "$:/language/RelativeDate/Past/Years",
            "text": "<<period>> years ago"
        },
        "$:/language/Docs/ModuleTypes/allfilteroperator": {
            "title": "$:/language/Docs/ModuleTypes/allfilteroperator",
            "text": "A sub-operator for the ''all'' filter operator."
        },
        "$:/language/Docs/ModuleTypes/animation": {
            "title": "$:/language/Docs/ModuleTypes/animation",
            "text": "Animations that may be used with the RevealWidget."
        },
        "$:/language/Docs/ModuleTypes/authenticator": {
            "title": "$:/language/Docs/ModuleTypes/authenticator",
            "text": "Defines how requests are authenticated by the built-in HTTP server."
        },
        "$:/language/Docs/ModuleTypes/bitmapeditoroperation": {
            "title": "$:/language/Docs/ModuleTypes/bitmapeditoroperation",
            "text": "A bitmap editor toolbar operation."
        },
        "$:/language/Docs/ModuleTypes/command": {
            "title": "$:/language/Docs/ModuleTypes/command",
            "text": "Commands that can be executed under Node.js."
        },
        "$:/language/Docs/ModuleTypes/config": {
            "title": "$:/language/Docs/ModuleTypes/config",
            "text": "Data to be inserted into `$tw.config`."
        },
        "$:/language/Docs/ModuleTypes/filteroperator": {
            "title": "$:/language/Docs/ModuleTypes/filteroperator",
            "text": "Individual filter operator methods."
        },
        "$:/language/Docs/ModuleTypes/global": {
            "title": "$:/language/Docs/ModuleTypes/global",
            "text": "Global data to be inserted into `$tw`."
        },
        "$:/language/Docs/ModuleTypes/info": {
            "title": "$:/language/Docs/ModuleTypes/info",
            "text": "Publishes system information via the [[$:/temp/info-plugin]] pseudo-plugin."
        },
        "$:/language/Docs/ModuleTypes/isfilteroperator": {
            "title": "$:/language/Docs/ModuleTypes/isfilteroperator",
            "text": "Operands for the ''is'' filter operator."
        },
        "$:/language/Docs/ModuleTypes/library": {
            "title": "$:/language/Docs/ModuleTypes/library",
            "text": "Generic module type for general purpose JavaScript modules."
        },
        "$:/language/Docs/ModuleTypes/macro": {
            "title": "$:/language/Docs/ModuleTypes/macro",
            "text": "JavaScript macro definitions."
        },
        "$:/language/Docs/ModuleTypes/parser": {
            "title": "$:/language/Docs/ModuleTypes/parser",
            "text": "Parsers for different content types."
        },
        "$:/language/Docs/ModuleTypes/route": {
            "title": "$:/language/Docs/ModuleTypes/route",
            "text": "Defines how individual URL patterns are handled by the built-in HTTP server."
        },
        "$:/language/Docs/ModuleTypes/saver": {
            "title": "$:/language/Docs/ModuleTypes/saver",
            "text": "Savers handle different methods for saving files from the browser."
        },
        "$:/language/Docs/ModuleTypes/startup": {
            "title": "$:/language/Docs/ModuleTypes/startup",
            "text": "Startup functions."
        },
        "$:/language/Docs/ModuleTypes/storyview": {
            "title": "$:/language/Docs/ModuleTypes/storyview",
            "text": "Story views customise the animation and behaviour of list widgets."
        },
        "$:/language/Docs/ModuleTypes/texteditoroperation": {
            "title": "$:/language/Docs/ModuleTypes/texteditoroperation",
            "text": "A text editor toolbar operation."
        },
        "$:/language/Docs/ModuleTypes/tiddlerdeserializer": {
            "title": "$:/language/Docs/ModuleTypes/tiddlerdeserializer",
            "text": "Converts different content types into tiddlers."
        },
        "$:/language/Docs/ModuleTypes/tiddlerfield": {
            "title": "$:/language/Docs/ModuleTypes/tiddlerfield",
            "text": "Defines the behaviour of an individual tiddler field."
        },
        "$:/language/Docs/ModuleTypes/tiddlermethod": {
            "title": "$:/language/Docs/ModuleTypes/tiddlermethod",
            "text": "Adds methods to the `$tw.Tiddler` prototype."
        },
        "$:/language/Docs/ModuleTypes/upgrader": {
            "title": "$:/language/Docs/ModuleTypes/upgrader",
            "text": "Applies upgrade processing to tiddlers during an upgrade/import."
        },
        "$:/language/Docs/ModuleTypes/utils": {
            "title": "$:/language/Docs/ModuleTypes/utils",
            "text": "Adds methods to `$tw.utils`."
        },
        "$:/language/Docs/ModuleTypes/utils-node": {
            "title": "$:/language/Docs/ModuleTypes/utils-node",
            "text": "Adds Node.js-specific methods to `$tw.utils`."
        },
        "$:/language/Docs/ModuleTypes/widget": {
            "title": "$:/language/Docs/ModuleTypes/widget",
            "text": "Widgets encapsulate DOM rendering and refreshing."
        },
        "$:/language/Docs/ModuleTypes/wikimethod": {
            "title": "$:/language/Docs/ModuleTypes/wikimethod",
            "text": "Adds methods to `$tw.Wiki`."
        },
        "$:/language/Docs/ModuleTypes/wikirule": {
            "title": "$:/language/Docs/ModuleTypes/wikirule",
            "text": "Individual parser rules for the main WikiText parser."
        },
        "$:/language/Docs/PaletteColours/alert-background": {
            "title": "$:/language/Docs/PaletteColours/alert-background",
            "text": "Alert background"
        },
        "$:/language/Docs/PaletteColours/alert-border": {
            "title": "$:/language/Docs/PaletteColours/alert-border",
            "text": "Alert border"
        },
        "$:/language/Docs/PaletteColours/alert-highlight": {
            "title": "$:/language/Docs/PaletteColours/alert-highlight",
            "text": "Alert highlight"
        },
        "$:/language/Docs/PaletteColours/alert-muted-foreground": {
            "title": "$:/language/Docs/PaletteColours/alert-muted-foreground",
            "text": "Alert muted foreground"
        },
        "$:/language/Docs/PaletteColours/background": {
            "title": "$:/language/Docs/PaletteColours/background",
            "text": "General background"
        },
        "$:/language/Docs/PaletteColours/blockquote-bar": {
            "title": "$:/language/Docs/PaletteColours/blockquote-bar",
            "text": "Blockquote bar"
        },
        "$:/language/Docs/PaletteColours/button-background": {
            "title": "$:/language/Docs/PaletteColours/button-background",
            "text": "Default button background"
        },
        "$:/language/Docs/PaletteColours/button-border": {
            "title": "$:/language/Docs/PaletteColours/button-border",
            "text": "Default button border"
        },
        "$:/language/Docs/PaletteColours/button-foreground": {
            "title": "$:/language/Docs/PaletteColours/button-foreground",
            "text": "Default button foreground"
        },
        "$:/language/Docs/PaletteColours/dirty-indicator": {
            "title": "$:/language/Docs/PaletteColours/dirty-indicator",
            "text": "Unsaved changes indicator"
        },
        "$:/language/Docs/PaletteColours/code-background": {
            "title": "$:/language/Docs/PaletteColours/code-background",
            "text": "Code background"
        },
        "$:/language/Docs/PaletteColours/code-border": {
            "title": "$:/language/Docs/PaletteColours/code-border",
            "text": "Code border"
        },
        "$:/language/Docs/PaletteColours/code-foreground": {
            "title": "$:/language/Docs/PaletteColours/code-foreground",
            "text": "Code foreground"
        },
        "$:/language/Docs/PaletteColours/download-background": {
            "title": "$:/language/Docs/PaletteColours/download-background",
            "text": "Download button background"
        },
        "$:/language/Docs/PaletteColours/download-foreground": {
            "title": "$:/language/Docs/PaletteColours/download-foreground",
            "text": "Download button foreground"
        },
        "$:/language/Docs/PaletteColours/dragger-background": {
            "title": "$:/language/Docs/PaletteColours/dragger-background",
            "text": "Dragger background"
        },
        "$:/language/Docs/PaletteColours/dragger-foreground": {
            "title": "$:/language/Docs/PaletteColours/dragger-foreground",
            "text": "Dragger foreground"
        },
        "$:/language/Docs/PaletteColours/dropdown-background": {
            "title": "$:/language/Docs/PaletteColours/dropdown-background",
            "text": "Dropdown background"
        },
        "$:/language/Docs/PaletteColours/dropdown-border": {
            "title": "$:/language/Docs/PaletteColours/dropdown-border",
            "text": "Dropdown border"
        },
        "$:/language/Docs/PaletteColours/dropdown-tab-background-selected": {
            "title": "$:/language/Docs/PaletteColours/dropdown-tab-background-selected",
            "text": "Dropdown tab background for selected tabs"
        },
        "$:/language/Docs/PaletteColours/dropdown-tab-background": {
            "title": "$:/language/Docs/PaletteColours/dropdown-tab-background",
            "text": "Dropdown tab background"
        },
        "$:/language/Docs/PaletteColours/dropzone-background": {
            "title": "$:/language/Docs/PaletteColours/dropzone-background",
            "text": "Dropzone background"
        },
        "$:/language/Docs/PaletteColours/external-link-background-hover": {
            "title": "$:/language/Docs/PaletteColours/external-link-background-hover",
            "text": "External link background hover"
        },
        "$:/language/Docs/PaletteColours/external-link-background-visited": {
            "title": "$:/language/Docs/PaletteColours/external-link-background-visited",
            "text": "External link background visited"
        },
        "$:/language/Docs/PaletteColours/external-link-background": {
            "title": "$:/language/Docs/PaletteColours/external-link-background",
            "text": "External link background"
        },
        "$:/language/Docs/PaletteColours/external-link-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/external-link-foreground-hover",
            "text": "External link foreground hover"
        },
        "$:/language/Docs/PaletteColours/external-link-foreground-visited": {
            "title": "$:/language/Docs/PaletteColours/external-link-foreground-visited",
            "text": "External link foreground visited"
        },
        "$:/language/Docs/PaletteColours/external-link-foreground": {
            "title": "$:/language/Docs/PaletteColours/external-link-foreground",
            "text": "External link foreground"
        },
        "$:/language/Docs/PaletteColours/foreground": {
            "title": "$:/language/Docs/PaletteColours/foreground",
            "text": "General foreground"
        },
        "$:/language/Docs/PaletteColours/menubar-background": {
            "title": "$:/language/Docs/PaletteColours/menubar-background",
            "text": "Menu bar background"
        },
        "$:/language/Docs/PaletteColours/menubar-foreground": {
            "title": "$:/language/Docs/PaletteColours/menubar-foreground",
            "text": "Menu bar foreground"
        },
        "$:/language/Docs/PaletteColours/message-background": {
            "title": "$:/language/Docs/PaletteColours/message-background",
            "text": "Message box background"
        },
        "$:/language/Docs/PaletteColours/message-border": {
            "title": "$:/language/Docs/PaletteColours/message-border",
            "text": "Message box border"
        },
        "$:/language/Docs/PaletteColours/message-foreground": {
            "title": "$:/language/Docs/PaletteColours/message-foreground",
            "text": "Message box foreground"
        },
        "$:/language/Docs/PaletteColours/modal-backdrop": {
            "title": "$:/language/Docs/PaletteColours/modal-backdrop",
            "text": "Modal backdrop"
        },
        "$:/language/Docs/PaletteColours/modal-background": {
            "title": "$:/language/Docs/PaletteColours/modal-background",
            "text": "Modal background"
        },
        "$:/language/Docs/PaletteColours/modal-border": {
            "title": "$:/language/Docs/PaletteColours/modal-border",
            "text": "Modal border"
        },
        "$:/language/Docs/PaletteColours/modal-footer-background": {
            "title": "$:/language/Docs/PaletteColours/modal-footer-background",
            "text": "Modal footer background"
        },
        "$:/language/Docs/PaletteColours/modal-footer-border": {
            "title": "$:/language/Docs/PaletteColours/modal-footer-border",
            "text": "Modal footer border"
        },
        "$:/language/Docs/PaletteColours/modal-header-border": {
            "title": "$:/language/Docs/PaletteColours/modal-header-border",
            "text": "Modal header border"
        },
        "$:/language/Docs/PaletteColours/muted-foreground": {
            "title": "$:/language/Docs/PaletteColours/muted-foreground",
            "text": "General muted foreground"
        },
        "$:/language/Docs/PaletteColours/notification-background": {
            "title": "$:/language/Docs/PaletteColours/notification-background",
            "text": "Notification background"
        },
        "$:/language/Docs/PaletteColours/notification-border": {
            "title": "$:/language/Docs/PaletteColours/notification-border",
            "text": "Notification border"
        },
        "$:/language/Docs/PaletteColours/page-background": {
            "title": "$:/language/Docs/PaletteColours/page-background",
            "text": "Page background"
        },
        "$:/language/Docs/PaletteColours/pre-background": {
            "title": "$:/language/Docs/PaletteColours/pre-background",
            "text": "Preformatted code background"
        },
        "$:/language/Docs/PaletteColours/pre-border": {
            "title": "$:/language/Docs/PaletteColours/pre-border",
            "text": "Preformatted code border"
        },
        "$:/language/Docs/PaletteColours/primary": {
            "title": "$:/language/Docs/PaletteColours/primary",
            "text": "General primary"
        },
        "$:/language/Docs/PaletteColours/select-tag-background": {
            "title": "$:/language/Docs/PaletteColours/select-tag-background",
            "text": "`<select>` element background"
        },
        "$:/language/Docs/PaletteColours/select-tag-foreground": {
            "title": "$:/language/Docs/PaletteColours/select-tag-foreground",
            "text": "`<select>` element text"
        },
        "$:/language/Docs/PaletteColours/sidebar-button-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-button-foreground",
            "text": "Sidebar button foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover",
            "text": "Sidebar controls foreground hover"
        },
        "$:/language/Docs/PaletteColours/sidebar-controls-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground",
            "text": "Sidebar controls foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-foreground-shadow": {
            "title": "$:/language/Docs/PaletteColours/sidebar-foreground-shadow",
            "text": "Sidebar foreground shadow"
        },
        "$:/language/Docs/PaletteColours/sidebar-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-foreground",
            "text": "Sidebar foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover",
            "text": "Sidebar muted foreground hover"
        },
        "$:/language/Docs/PaletteColours/sidebar-muted-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground",
            "text": "Sidebar muted foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-background-selected": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-background-selected",
            "text": "Sidebar tab background for selected tabs"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-background": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-background",
            "text": "Sidebar tab background"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-border-selected": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-border-selected",
            "text": "Sidebar tab border for selected tabs"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-border": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-border",
            "text": "Sidebar tab border"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-divider": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-divider",
            "text": "Sidebar tab divider"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected",
            "text": "Sidebar tab foreground for selected tabs"
        },
        "$:/language/Docs/PaletteColours/sidebar-tab-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground",
            "text": "Sidebar tab foreground"
        },
        "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover",
            "text": "Sidebar tiddler link foreground hover"
        },
        "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground": {
            "title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground",
            "text": "Sidebar tiddler link foreground"
        },
        "$:/language/Docs/PaletteColours/site-title-foreground": {
            "title": "$:/language/Docs/PaletteColours/site-title-foreground",
            "text": "Site title foreground"
        },
        "$:/language/Docs/PaletteColours/static-alert-foreground": {
            "title": "$:/language/Docs/PaletteColours/static-alert-foreground",
            "text": "Static alert foreground"
        },
        "$:/language/Docs/PaletteColours/tab-background-selected": {
            "title": "$:/language/Docs/PaletteColours/tab-background-selected",
            "text": "Tab background for selected tabs"
        },
        "$:/language/Docs/PaletteColours/tab-background": {
            "title": "$:/language/Docs/PaletteColours/tab-background",
            "text": "Tab background"
        },
        "$:/language/Docs/PaletteColours/tab-border-selected": {
            "title": "$:/language/Docs/PaletteColours/tab-border-selected",
            "text": "Tab border for selected tabs"
        },
        "$:/language/Docs/PaletteColours/tab-border": {
            "title": "$:/language/Docs/PaletteColours/tab-border",
            "text": "Tab border"
        },
        "$:/language/Docs/PaletteColours/tab-divider": {
            "title": "$:/language/Docs/PaletteColours/tab-divider",
            "text": "Tab divider"
        },
        "$:/language/Docs/PaletteColours/tab-foreground-selected": {
            "title": "$:/language/Docs/PaletteColours/tab-foreground-selected",
            "text": "Tab foreground for selected tabs"
        },
        "$:/language/Docs/PaletteColours/tab-foreground": {
            "title": "$:/language/Docs/PaletteColours/tab-foreground",
            "text": "Tab foreground"
        },
        "$:/language/Docs/PaletteColours/table-border": {
            "title": "$:/language/Docs/PaletteColours/table-border",
            "text": "Table border"
        },
        "$:/language/Docs/PaletteColours/table-footer-background": {
            "title": "$:/language/Docs/PaletteColours/table-footer-background",
            "text": "Table footer background"
        },
        "$:/language/Docs/PaletteColours/table-header-background": {
            "title": "$:/language/Docs/PaletteColours/table-header-background",
            "text": "Table header background"
        },
        "$:/language/Docs/PaletteColours/tag-background": {
            "title": "$:/language/Docs/PaletteColours/tag-background",
            "text": "Tag background"
        },
        "$:/language/Docs/PaletteColours/tag-foreground": {
            "title": "$:/language/Docs/PaletteColours/tag-foreground",
            "text": "Tag foreground"
        },
        "$:/language/Docs/PaletteColours/tiddler-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-background",
            "text": "Tiddler background"
        },
        "$:/language/Docs/PaletteColours/tiddler-border": {
            "title": "$:/language/Docs/PaletteColours/tiddler-border",
            "text": "Tiddler border"
        },
        "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover": {
            "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover",
            "text": "Tiddler controls foreground hover"
        },
        "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected": {
            "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected",
            "text": "Tiddler controls foreground for selected controls"
        },
        "$:/language/Docs/PaletteColours/tiddler-controls-foreground": {
            "title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground",
            "text": "Tiddler controls foreground"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-background",
            "text": "Tiddler editor background"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-border-image": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-border-image",
            "text": "Tiddler editor border image"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-border": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-border",
            "text": "Tiddler editor border"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-fields-even": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-even",
            "text": "Tiddler editor background for even fields"
        },
        "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd": {
            "title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd",
            "text": "Tiddler editor background for odd fields"
        },
        "$:/language/Docs/PaletteColours/tiddler-info-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-info-background",
            "text": "Tiddler info panel background"
        },
        "$:/language/Docs/PaletteColours/tiddler-info-border": {
            "title": "$:/language/Docs/PaletteColours/tiddler-info-border",
            "text": "Tiddler info panel border"
        },
        "$:/language/Docs/PaletteColours/tiddler-info-tab-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-info-tab-background",
            "text": "Tiddler info panel tab background"
        },
        "$:/language/Docs/PaletteColours/tiddler-link-background": {
            "title": "$:/language/Docs/PaletteColours/tiddler-link-background",
            "text": "Tiddler link background"
        },
        "$:/language/Docs/PaletteColours/tiddler-link-foreground": {
            "title": "$:/language/Docs/PaletteColours/tiddler-link-foreground",
            "text": "Tiddler link foreground"
        },
        "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground": {
            "title": "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground",
            "text": "Tiddler subtitle foreground"
        },
        "$:/language/Docs/PaletteColours/tiddler-title-foreground": {
            "title": "$:/language/Docs/PaletteColours/tiddler-title-foreground",
            "text": "Tiddler title foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-new-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-new-button",
            "text": "Toolbar 'new tiddler' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-options-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-options-button",
            "text": "Toolbar 'options' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-save-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-save-button",
            "text": "Toolbar 'save' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-info-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-info-button",
            "text": "Toolbar 'info' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-edit-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-edit-button",
            "text": "Toolbar 'edit' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-close-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-close-button",
            "text": "Toolbar 'close' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-delete-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-delete-button",
            "text": "Toolbar 'delete' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-cancel-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-cancel-button",
            "text": "Toolbar 'cancel' button foreground"
        },
        "$:/language/Docs/PaletteColours/toolbar-done-button": {
            "title": "$:/language/Docs/PaletteColours/toolbar-done-button",
            "text": "Toolbar 'done' button foreground"
        },
        "$:/language/Docs/PaletteColours/untagged-background": {
            "title": "$:/language/Docs/PaletteColours/untagged-background",
            "text": "Untagged pill background"
        },
        "$:/language/Docs/PaletteColours/very-muted-foreground": {
            "title": "$:/language/Docs/PaletteColours/very-muted-foreground",
            "text": "Very muted foreground"
        },
        "$:/language/EditTemplate/Body/External/Hint": {
            "title": "$:/language/EditTemplate/Body/External/Hint",
            "text": "This tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself"
        },
        "$:/language/EditTemplate/Body/Placeholder": {
            "title": "$:/language/EditTemplate/Body/Placeholder",
            "text": "Type the text for this tiddler"
        },
        "$:/language/EditTemplate/Body/Preview/Type/Output": {
            "title": "$:/language/EditTemplate/Body/Preview/Type/Output",
            "text": "output"
        },
        "$:/language/EditTemplate/Field/Remove/Caption": {
            "title": "$:/language/EditTemplate/Field/Remove/Caption",
            "text": "remove field"
        },
        "$:/language/EditTemplate/Field/Remove/Hint": {
            "title": "$:/language/EditTemplate/Field/Remove/Hint",
            "text": "Remove field"
        },
        "$:/language/EditTemplate/Field/Dropdown/Caption": {
            "title": "$:/language/EditTemplate/Field/Dropdown/Caption",
            "text": "field list"
        },
        "$:/language/EditTemplate/Field/Dropdown/Hint": {
            "title": "$:/language/EditTemplate/Field/Dropdown/Hint",
            "text": "Show field list"
        },
        "$:/language/EditTemplate/Fields/Add/Button": {
            "title": "$:/language/EditTemplate/Fields/Add/Button",
            "text": "add"
        },
        "$:/language/EditTemplate/Fields/Add/Button/Hint": {
            "title": "$:/language/EditTemplate/Fields/Add/Button/Hint",
            "text": "Add the new field to the tiddler"
        },
        "$:/language/EditTemplate/Fields/Add/Name/Placeholder": {
            "title": "$:/language/EditTemplate/Fields/Add/Name/Placeholder",
            "text": "field name"
        },
        "$:/language/EditTemplate/Fields/Add/Prompt": {
            "title": "$:/language/EditTemplate/Fields/Add/Prompt",
            "text": "Add a new field:"
        },
        "$:/language/EditTemplate/Fields/Add/Value/Placeholder": {
            "title": "$:/language/EditTemplate/Fields/Add/Value/Placeholder",
            "text": "field value"
        },
        "$:/language/EditTemplate/Fields/Add/Dropdown/System": {
            "title": "$:/language/EditTemplate/Fields/Add/Dropdown/System",
            "text": "System fields"
        },
        "$:/language/EditTemplate/Fields/Add/Dropdown/User": {
            "title": "$:/language/EditTemplate/Fields/Add/Dropdown/User",
            "text": "User fields"
        },
        "$:/language/EditTemplate/Shadow/Warning": {
            "title": "$:/language/EditTemplate/Shadow/Warning",
            "text": "This is a shadow tiddler. Any changes you make will override the default version from the plugin <<pluginLink>>"
        },
        "$:/language/EditTemplate/Shadow/OverriddenWarning": {
            "title": "$:/language/EditTemplate/Shadow/OverriddenWarning",
            "text": "This is a modified shadow tiddler. You can revert to the default version in the plugin <<pluginLink>> by deleting this tiddler"
        },
        "$:/language/EditTemplate/Tags/Add/Button": {
            "title": "$:/language/EditTemplate/Tags/Add/Button",
            "text": "add"
        },
        "$:/language/EditTemplate/Tags/Add/Button/Hint": {
            "title": "$:/language/EditTemplate/Tags/Add/Button/Hint",
            "text": "add tag"
        },
        "$:/language/EditTemplate/Tags/Add/Placeholder": {
            "title": "$:/language/EditTemplate/Tags/Add/Placeholder",
            "text": "tag name"
        },
        "$:/language/EditTemplate/Tags/ClearInput/Caption": {
            "title": "$:/language/EditTemplate/Tags/ClearInput/Caption",
            "text": "clear input"
        },
        "$:/language/EditTemplate/Tags/ClearInput/Hint": {
            "title": "$:/language/EditTemplate/Tags/ClearInput/Hint",
            "text": "Clear tag input"
        },
        "$:/language/EditTemplate/Tags/Dropdown/Caption": {
            "title": "$:/language/EditTemplate/Tags/Dropdown/Caption",
            "text": "tag list"
        },
        "$:/language/EditTemplate/Tags/Dropdown/Hint": {
            "title": "$:/language/EditTemplate/Tags/Dropdown/Hint",
            "text": "Show tag list"
        },
        "$:/language/EditTemplate/Title/BadCharacterWarning": {
            "title": "$:/language/EditTemplate/Title/BadCharacterWarning",
            "text": "Warning: avoid using any of the characters <<bad-chars>> in tiddler titles"
        },
        "$:/language/EditTemplate/Title/Exists/Prompt": {
            "title": "$:/language/EditTemplate/Title/Exists/Prompt",
            "text": "Target tiddler already exists"
        },
        "$:/language/EditTemplate/Title/Relink/Prompt": {
            "title": "$:/language/EditTemplate/Title/Relink/Prompt",
            "text": "Update ''<$text text=<<fromTitle>>/>'' to ''<$text text=<<toTitle>>/>'' in the //tags// and //list// fields of other tiddlers"
        },
        "$:/language/EditTemplate/Title/References/Prompt": {
            "title": "$:/language/EditTemplate/Title/References/Prompt",
            "text": "The following references to this tiddler will not be automatically updated:"
        },
        "$:/language/EditTemplate/Type/Dropdown/Caption": {
            "title": "$:/language/EditTemplate/Type/Dropdown/Caption",
            "text": "content type list"
        },
        "$:/language/EditTemplate/Type/Dropdown/Hint": {
            "title": "$:/language/EditTemplate/Type/Dropdown/Hint",
            "text": "Show content type list"
        },
        "$:/language/EditTemplate/Type/Delete/Caption": {
            "title": "$:/language/EditTemplate/Type/Delete/Caption",
            "text": "delete content type"
        },
        "$:/language/EditTemplate/Type/Delete/Hint": {
            "title": "$:/language/EditTemplate/Type/Delete/Hint",
            "text": "Delete content type"
        },
        "$:/language/EditTemplate/Type/Placeholder": {
            "title": "$:/language/EditTemplate/Type/Placeholder",
            "text": "content type"
        },
        "$:/language/EditTemplate/Type/Prompt": {
            "title": "$:/language/EditTemplate/Type/Prompt",
            "text": "Type:"
        },
        "$:/language/Exporters/StaticRiver": {
            "title": "$:/language/Exporters/StaticRiver",
            "text": "Static HTML"
        },
        "$:/language/Exporters/JsonFile": {
            "title": "$:/language/Exporters/JsonFile",
            "text": "JSON file"
        },
        "$:/language/Exporters/CsvFile": {
            "title": "$:/language/Exporters/CsvFile",
            "text": "CSV file"
        },
        "$:/language/Exporters/TidFile": {
            "title": "$:/language/Exporters/TidFile",
            "text": "\".tid\" file"
        },
        "$:/language/Docs/Fields/_canonical_uri": {
            "title": "$:/language/Docs/Fields/_canonical_uri",
            "text": "The full URI of an external image tiddler"
        },
        "$:/language/Docs/Fields/bag": {
            "title": "$:/language/Docs/Fields/bag",
            "text": "The name of the bag from which a tiddler came"
        },
        "$:/language/Docs/Fields/caption": {
            "title": "$:/language/Docs/Fields/caption",
            "text": "The text to be displayed on a tab or button"
        },
        "$:/language/Docs/Fields/color": {
            "title": "$:/language/Docs/Fields/color",
            "text": "The CSS color value associated with a tiddler"
        },
        "$:/language/Docs/Fields/component": {
            "title": "$:/language/Docs/Fields/component",
            "text": "The name of the component responsible for an [[alert tiddler|AlertMechanism]]"
        },
        "$:/language/Docs/Fields/current-tiddler": {
            "title": "$:/language/Docs/Fields/current-tiddler",
            "text": "Used to cache the top tiddler in a [[history list|HistoryMechanism]]"
        },
        "$:/language/Docs/Fields/created": {
            "title": "$:/language/Docs/Fields/created",
            "text": "The date a tiddler was created"
        },
        "$:/language/Docs/Fields/creator": {
            "title": "$:/language/Docs/Fields/creator",
            "text": "The name of the person who created a tiddler"
        },
        "$:/language/Docs/Fields/dependents": {
            "title": "$:/language/Docs/Fields/dependents",
            "text": "For a plugin, lists the dependent plugin titles"
        },
        "$:/language/Docs/Fields/description": {
            "title": "$:/language/Docs/Fields/description",
            "text": "The descriptive text for a plugin, or a modal dialogue"
        },
        "$:/language/Docs/Fields/draft.of": {
            "title": "$:/language/Docs/Fields/draft.of",
            "text": "For draft tiddlers, contains the title of the tiddler of which this is a draft"
        },
        "$:/language/Docs/Fields/draft.title": {
            "title": "$:/language/Docs/Fields/draft.title",
            "text": "For draft tiddlers, contains the proposed new title of the tiddler"
        },
        "$:/language/Docs/Fields/footer": {
            "title": "$:/language/Docs/Fields/footer",
            "text": "The footer text for a wizard"
        },
        "$:/language/Docs/Fields/hide-body": {
            "title": "$:/language/Docs/Fields/hide-body",
            "text": "The view template will hide bodies of tiddlers if set to: ''yes''"
        },
        "$:/language/Docs/Fields/icon": {
            "title": "$:/language/Docs/Fields/icon",
            "text": "The title of the tiddler containing the icon associated with a tiddler"
        },
        "$:/language/Docs/Fields/library": {
            "title": "$:/language/Docs/Fields/library",
            "text": "Indicates that a tiddler should be saved as a JavaScript library if set to: ''yes''"
        },
        "$:/language/Docs/Fields/list": {
            "title": "$:/language/Docs/Fields/list",
            "text": "An ordered list of tiddler titles associated with a tiddler"
        },
        "$:/language/Docs/Fields/list-before": {
            "title": "$:/language/Docs/Fields/list-before",
            "text": "If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty"
        },
        "$:/language/Docs/Fields/list-after": {
            "title": "$:/language/Docs/Fields/list-after",
            "text": "If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles, or at the end of the list if this field is present but empty"
        },
        "$:/language/Docs/Fields/modified": {
            "title": "$:/language/Docs/Fields/modified",
            "text": "The date and time at which a tiddler was last modified"
        },
        "$:/language/Docs/Fields/modifier": {
            "title": "$:/language/Docs/Fields/modifier",
            "text": "The tiddler title associated with the person who last modified a tiddler"
        },
        "$:/language/Docs/Fields/name": {
            "title": "$:/language/Docs/Fields/name",
            "text": "The human readable name associated with a plugin tiddler"
        },
        "$:/language/Docs/Fields/plugin-priority": {
            "title": "$:/language/Docs/Fields/plugin-priority",
            "text": "A numerical value indicating the priority of a plugin tiddler"
        },
        "$:/language/Docs/Fields/plugin-type": {
            "title": "$:/language/Docs/Fields/plugin-type",
            "text": "The type of plugin in a plugin tiddler"
        },
        "$:/language/Docs/Fields/revision": {
            "title": "$:/language/Docs/Fields/revision",
            "text": "The revision of the tiddler held at the server"
        },
        "$:/language/Docs/Fields/released": {
            "title": "$:/language/Docs/Fields/released",
            "text": "Date of a TiddlyWiki release"
        },
        "$:/language/Docs/Fields/source": {
            "title": "$:/language/Docs/Fields/source",
            "text": "The source URL associated with a tiddler"
        },
        "$:/language/Docs/Fields/subtitle": {
            "title": "$:/language/Docs/Fields/subtitle",
            "text": "The subtitle text for a wizard"
        },
        "$:/language/Docs/Fields/tags": {
            "title": "$:/language/Docs/Fields/tags",
            "text": "A list of tags associated with a tiddler"
        },
        "$:/language/Docs/Fields/text": {
            "title": "$:/language/Docs/Fields/text",
            "text": "The body text of a tiddler"
        },
        "$:/language/Docs/Fields/throttle.refresh": {
            "title": "$:/language/Docs/Fields/throttle.refresh",
            "text": "If present, throttles refreshes of this tiddler"
        },
        "$:/language/Docs/Fields/title": {
            "title": "$:/language/Docs/Fields/title",
            "text": "The unique name of a tiddler"
        },
        "$:/language/Docs/Fields/toc-link": {
            "title": "$:/language/Docs/Fields/toc-link",
            "text": "Suppresses the tiddler's link in a Table of Contents tree if set to: ''no''"
        },
        "$:/language/Docs/Fields/type": {
            "title": "$:/language/Docs/Fields/type",
            "text": "The content type of a tiddler"
        },
        "$:/language/Docs/Fields/version": {
            "title": "$:/language/Docs/Fields/version",
            "text": "Version information for a plugin"
        },
        "$:/language/Docs/Fields/_is_skinny": {
            "title": "$:/language/Docs/Fields/_is_skinny",
            "text": "If present, indicates that the tiddler text field must be loaded from the server"
        },
        "$:/language/Filters/AllTiddlers": {
            "title": "$:/language/Filters/AllTiddlers",
            "text": "All tiddlers except system tiddlers"
        },
        "$:/language/Filters/RecentSystemTiddlers": {
            "title": "$:/language/Filters/RecentSystemTiddlers",
            "text": "Recently modified tiddlers, including system tiddlers"
        },
        "$:/language/Filters/RecentTiddlers": {
            "title": "$:/language/Filters/RecentTiddlers",
            "text": "Recently modified tiddlers"
        },
        "$:/language/Filters/AllTags": {
            "title": "$:/language/Filters/AllTags",
            "text": "All tags except system tags"
        },
        "$:/language/Filters/Missing": {
            "title": "$:/language/Filters/Missing",
            "text": "Missing tiddlers"
        },
        "$:/language/Filters/Drafts": {
            "title": "$:/language/Filters/Drafts",
            "text": "Draft tiddlers"
        },
        "$:/language/Filters/Orphans": {
            "title": "$:/language/Filters/Orphans",
            "text": "Orphan tiddlers"
        },
        "$:/language/Filters/SystemTiddlers": {
            "title": "$:/language/Filters/SystemTiddlers",
            "text": "System tiddlers"
        },
        "$:/language/Filters/ShadowTiddlers": {
            "title": "$:/language/Filters/ShadowTiddlers",
            "text": "Shadow tiddlers"
        },
        "$:/language/Filters/OverriddenShadowTiddlers": {
            "title": "$:/language/Filters/OverriddenShadowTiddlers",
            "text": "Overridden shadow tiddlers"
        },
        "$:/language/Filters/SessionTiddlers": {
            "title": "$:/language/Filters/SessionTiddlers",
            "text": "Tiddlers modified since the wiki was loaded"
        },
        "$:/language/Filters/SystemTags": {
            "title": "$:/language/Filters/SystemTags",
            "text": "System tags"
        },
        "$:/language/Filters/StoryList": {
            "title": "$:/language/Filters/StoryList",
            "text": "Tiddlers in the story river, excluding <$text text=\"$:/AdvancedSearch\"/>"
        },
        "$:/language/Filters/TypedTiddlers": {
            "title": "$:/language/Filters/TypedTiddlers",
            "text": "Non wiki-text tiddlers"
        },
        "GettingStarted": {
            "title": "GettingStarted",
            "text": "\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nBefore you start storing important information in ~TiddlyWiki it is vital to make sure that you can reliably save changes. See https://tiddlywiki.com/#GettingStarted for details\n\n!! Set up this ~TiddlyWiki\n\n<div class=\"tc-control-panel\">\n\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n</div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n"
        },
        "$:/language/Help/build": {
            "title": "$:/language/Help/build",
            "description": "Automatically run configured commands",
            "text": "Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\n\n```\n--build <target> [<target> ...]\n```\n\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\n\n"
        },
        "$:/language/Help/clearpassword": {
            "title": "$:/language/Help/clearpassword",
            "description": "Clear a password for subsequent crypto operations",
            "text": "Clear the password for subsequent crypto operations\n\n```\n--clearpassword\n```\n"
        },
        "$:/language/Help/default": {
            "title": "$:/language/Help/default",
            "text": "\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n```\nusage: tiddlywiki [<wikifolder>] [--<command> [<args>...]...]\n```\n\nAvailable commands:\n\n<ul>\n<$list filter=\"[commands[]sort[title]]\" variable=\"command\">\n<li><$link to=<<commandTitle>>><$macrocall $name=\"command\" $type=\"text/plain\" $output=\"text/plain\"/></$link>: <$transclude tiddler=<<commandTitle>> field=\"description\"/></li>\n</$list>\n</ul>\n\nTo get detailed help on a command:\n\n```\ntiddlywiki --help <command>\n```\n"
        },
        "$:/language/Help/deletetiddlers": {
            "title": "$:/language/Help/deletetiddlers",
            "description": "Deletes a group of tiddlers",
            "text": "<<.from-version \"5.1.20\">> Deletes a group of tiddlers identified by a filter.\n\n```\n--deletetiddlers <filter>\n```\n"
        },
        "$:/language/Help/editions": {
            "title": "$:/language/Help/editions",
            "description": "Lists the available editions of TiddlyWiki",
            "text": "Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\n\n```\n--editions\n```\n"
        },
        "$:/language/Help/fetch": {
            "title": "$:/language/Help/fetch",
            "description": "Fetch tiddlers from wiki by URL",
            "text": "Fetch one or more files over HTTP/HTTPS, and import the tiddlers matching a filter, optionally transforming the incoming titles.\n\n```\n--fetch file <url> <import-filter> <transform-filter>\n--fetch files <url-filter> <import-filter> <transform-filter>\n--fetch raw-file <url> <transform-filter>\n--fetch raw-files <url-filter> <transform-filter>\n```\n\nThe \"file\" and \"files\" variants fetch the specified files and attempt to import the tiddlers within them (the same processing as if the files were dragged into the browser window). The \"raw-file\" and \"raw-files\" variants fetch the specified files and then store the raw file data in tiddlers, without applying the import logic.\n\nWith the \"file\" and \"raw-file\" variants only a single file is fetched and the first parameter is the URL of the file to read.\n\nWith the \"files\" and \"raw-files\" variants, multiple files are fetched and the first parameter is a filter yielding a list of URLs of the files to read. For example, given a set of tiddlers tagged \"remote-server\" that have a field \"url\" the filter `[tag[remote-server]get[url]]` will retrieve all the available URLs.\n\nFor the \"file\" and \"files\" variants, the `<import-filter>` parameter specifies a filter determining which tiddlers are imported. It defaults to `[all[tiddlers]]` if not provided.\n\nFor all variants, the `<transform-filter>` parameter specifies an optional filter that transforms the titles of the imported tiddlers. For example, `[addprefix[$:/myimports/]]` would add the prefix `$:/myimports/` to each title.\n\nPreceding the `--fetch` command with `--verbose` will output progress information during the import.\n\nNote that TiddlyWiki will not fetch an older version of an already loaded plugin.\n\nThe following example retrieves all the non-system tiddlers from https://tiddlywiki.com and saves them to a JSON file:\n\n```\ntiddlywiki --verbose --fetch file \"https://tiddlywiki.com/\" \"[!is[system]]\" \"\" --rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[!is[system]]\"\n```\n\nThe following example retrieves the \"favicon\" file from tiddlywiki.com and saves it in a file called \"output.ico\". Note that the intermediate tiddler \"Icon Tiddler\" is quoted in the \"--fetch\" command because it is being used as a transformation filter to replace the default title, while there are no quotes for the \"--savetiddler\" command because it is being used directly as a title.\n\n```\ntiddlywiki --verbose --fetch raw-file \"https://tiddlywiki.com/favicon.ico\" \"[[Icon Tiddler]]\" --savetiddler \"Icon Tiddler\" output.ico\n```\n\n"
        },
        "$:/language/Help/help": {
            "title": "$:/language/Help/help",
            "description": "Display help for TiddlyWiki commands",
            "text": "Displays help text for a command:\n\n```\n--help [<command>]\n```\n\nIf the command name is omitted then a list of available commands is displayed.\n"
        },
        "$:/language/Help/import": {
            "title": "$:/language/Help/import",
            "description": "Import tiddlers from a file",
            "text": "Import tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The deserializer must be explicitly specified, unlike the `load` command which infers the deserializer from the file extension.\n\n```\n--import <filepath> <deserializer> [<title>] [<encoding>]\n```\n\nThe deserializers in the core include:\n\n* application/javascript\n* application/json\n* application/x-tiddler\n* application/x-tiddler-html-div\n* application/x-tiddlers\n* text/html\n* text/plain\n\nThe title of the imported tiddler defaults to the filename.\n\nThe encoding defaults to \"utf8\", but can be \"base64\" for importing binary files.\n\nNote that TiddlyWiki will not import an older version of an already loaded plugin.\n"
        },
        "$:/language/Help/init": {
            "title": "$:/language/Help/init",
            "description": "Initialise a new wiki folder",
            "text": "Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\n\n```\n--init <edition> [<edition> ...]\n```\n\nFor example:\n\n```\ntiddlywiki ./MyWikiFolder --init empty\n```\n\nNote:\n\n* The wiki folder directory will be created if necessary\n* The \"edition\" defaults to ''empty''\n* The init command will fail if the wiki folder is not empty\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\n* When multiple editions are specified, editions initialised later will overwrite any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\n* `--editions` returns a list of available editions\n"
        },
        "$:/language/Help/listen": {
            "title": "$:/language/Help/listen",
            "description": "Provides an HTTP server interface to TiddlyWiki",
            "text": "Serves a wiki over HTTP.\n\nThe listen command uses NamedCommandParameters:\n\n```\n--listen [<name>=<value>]...\n```\n\nAll parameters are optional with safe defaults, and can be specified in any order. The recognised parameters are:\n\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''credentials'' - pathname of credentials CSV file (relative to wiki folder)\n* ''anon-username'' - the username for signing edits for anonymous users\n* ''username'' - optional username for basic authentication\n* ''password'' - optional password for basic authentication\n* ''authenticated-user-header'' - optional name of header to be used for trusted authentication\n* ''readers'' - comma separated list of principals allowed to read from this wiki\n* ''writers'' - comma separated list of principals allowed to write to this wiki\n* ''csrf-disable'' - set to \"yes\" to disable CSRF checks (defaults to \"no\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''tls-cert'' - pathname of TLS certificate file (relative to wiki folder)\n* ''tls-key'' - pathname of TLS key file (relative to wiki folder)\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n* ''gzip'' - set to \"yes\" to enable gzip compression for some http endpoints (defaults to \"no\")\n\nFor information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\n"
        },
        "$:/language/Help/load": {
            "title": "$:/language/Help/load",
            "description": "Load tiddlers from a file",
            "text": "Load tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The processing applied to incoming files is determined by the file extension. Use the alternative `import` command if you need to specify the deserializer and encoding explicitly.\n\n```\n--load <filepath> [noerror]\n--load <dirpath> [noerror]\n```\n\nBy default, the load command raises an error if no tiddlers are found. The error can be suppressed by providing the optional \"noerror\" parameter.\n\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\n\n```\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\n```\n\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\n"
        },
        "$:/language/Help/makelibrary": {
            "title": "$:/language/Help/makelibrary",
            "description": "Construct library plugin required by upgrade process",
            "text": "Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\n\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\n\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\n\n```\n--makelibrary <title>\n```\n\nThe title argument defaults to `$:/UpgradeLibrary`.\n"
        },
        "$:/language/Help/notfound": {
            "title": "$:/language/Help/notfound",
            "text": "No such help item"
        },
        "$:/language/Help/output": {
            "title": "$:/language/Help/output",
            "description": "Set the base output directory for subsequent commands",
            "text": "Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\n\n```\n--output <pathname>\n```\n\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\n\n"
        },
        "$:/language/Help/password": {
            "title": "$:/language/Help/password",
            "description": "Set a password for subsequent crypto operations",
            "text": "Set a password for subsequent crypto operations\n\n```\n--password <password>\n```\n\n''Note'': This should not be used for serving TiddlyWiki with password protection. Instead, see the password option under the [[ServerCommand]].\n"
        },
        "$:/language/Help/render": {
            "title": "$:/language/Help/render",
            "description": "Renders individual tiddlers to files",
            "text": "Render individual tiddlers identified by a filter and save the results to the specified files.\n\nOptionally, the title of a template tiddler can be specified. In this case, instead of directly rendering each tiddler, the template tiddler is rendered with the \"currentTiddler\" variable set to the title of the tiddler that is being rendered.\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [<name>] [<value>]\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename\n* ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material)\n* ''template'': Optional template through which each tiddler is rendered\n* ''name'': Name of optional variable\n* ''value'': Value of optional variable\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--render \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated\n\nExamples:\n\n* `--render \"[!is[system]]\" \"[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]\"` -- renders all non-system tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles and the extension HTML\n\n"
        },
        "$:/language/Help/rendertiddler": {
            "title": "$:/language/Help/rendertiddler",
            "description": "Render an individual tiddler as a specified ContentType",
            "text": "(Note: The `--rendertiddler` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender an individual tiddler as a specified ContentType, defaulting to `text/html` and save it to the specified filename.\n\nOptionally the title of a template tiddler can be specified, in which case the template tiddler is rendered with the \"currentTiddler\" variable set to the tiddler that is being rendered (the first parameter value).\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--rendertiddler <title> <filename> [<type>] [<template>] [<name>] [<value>]\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n\nFor example, the following command saves all tiddlers matching the filter `[tag[done]]` to a JSON file titled `output.json` by employing the core template `$:/core/templates/exporters/JsonFile`.\n\n```\n--rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[tag[done]]\"\n```\n"
        },
        "$:/language/Help/rendertiddlers": {
            "title": "$:/language/Help/rendertiddlers",
            "description": "Render tiddlers matching a filter to a specified ContentType",
            "text": "(Note: The `--rendertiddlers` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\n\n```\n--rendertiddlers '<filter>' <template> <pathname> [<type>] [<extension>] [\"noclean\"]\n```\n\nFor example:\n\n```\n--rendertiddlers '[!is[system]]' $:/core/templates/static.tiddler.html ./static text/plain\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny files in the target directory are deleted unless the ''noclean'' flag is specified. The target directory is recursively created if it is missing.\n"
        },
        "$:/language/Help/save": {
            "title": "$:/language/Help/save",
            "description": "Saves individual raw tiddlers to files",
            "text": "Saves individual tiddlers identified by a filter in their raw text or binary format to the specified files.\n\n```\n--save <tiddler-filter> <filename-filter>\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be saved\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]]`, which uses the unchanged tiddler title as the filename\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--save \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being saved, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--save` command is a more flexible replacement for both the `--savetiddler` and `--savetiddlers` commands, which are deprecated\n\nExamples:\n\n* `--save \"[!is[system]is[image]]\" \"[encodeuricomponent[]addprefix[tiddlers/]]\"` -- saves all non-system image tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles\n"
        },
        "$:/language/Help/savetiddler": {
            "title": "$:/language/Help/savetiddler",
            "description": "Saves a raw tiddler to a file",
            "text": "(Note: The `--savetiddler` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves an individual tiddler in its raw text or binary format to the specified filename.\n\n```\n--savetiddler <title> <filename>\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"
        },
        "$:/language/Help/savetiddlers": {
            "title": "$:/language/Help/savetiddlers",
            "description": "Saves a group of raw tiddlers to a directory",
            "text": "(Note: The `--savetiddlers` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves a group of tiddlers in their raw text or binary format to the specified directory.\n\n```\n--savetiddlers <filter> <pathname> [\"noclean\"]\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nThe output directory is cleared of existing files before saving the specified files. The deletion can be disabled by specifying the ''noclean'' flag.\n\nAny missing directories in the pathname are automatically created.\n"
        },
        "$:/language/Help/savewikifolder": {
            "title": "$:/language/Help/savewikifolder",
            "description": "Saves a wiki to a new wiki folder",
            "text": "<<.from-version \"5.1.20\">> Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration:\n\n```\n--savewikifolder <wikifolderpath> [<filter>]\n```\n\n* The target wiki folder must be empty or non-existent\n* The filter specifies which tiddlers should be included. It is optional, defaulting to `[all[tiddlers]]`\n* Plugins from the official plugin library are replaced with references to those plugins in the `tiddlywiki.info` file\n* Custom plugins are unpacked into their own folder\n\nA common usage is to convert a TiddlyWiki HTML file into a wiki folder:\n\n```\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder\n```\n"
        },
        "$:/language/Help/server": {
            "title": "$:/language/Help/server",
            "description": "Provides an HTTP server interface to TiddlyWiki (deprecated in favour of the new listen command)",
            "text": "Legacy command to serve a wiki over HTTP.\n\n```\n--server <port> <root-tiddler> <root-render-type> <root-serve-type> <username> <password> <host> <path-prefix> <debug-level>\n```\n\nThe parameters are:\n\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''username'' - the default username for signing edits\n* ''password'' - optional password for basic authentication\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation should only be used on a trusted network or over HTTPS.\n\nFor example:\n\n```\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password.\n\n\n```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nUsing an address like this exposes your system to the local network. For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port. It can be useful to use an environment variable to pass the port number to the Node.js process. This example references an environment variable called \"MY_PORT_NUMBER\":\n\n```\n--server MY_PORT_NUMBER $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n"
        },
        "$:/language/Help/setfield": {
            "title": "$:/language/Help/setfield",
            "description": "Prepares external tiddlers for use",
            "text": "//Note that this command is experimental and may change or be replaced before being finalised//\n\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\n\n```\n--setfield <filter> <fieldname> <templatetitle> <rendertype>\n```\n\nThe parameters are:\n\n* ''filter'' - filter identifying the tiddlers to be affected\n* ''fieldname'' - the field to modify (defaults to \"text\")\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\n* ''rendertype'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\n"
        },
        "$:/language/Help/unpackplugin": {
            "title": "$:/language/Help/unpackplugin",
            "description": "Unpack the payload tiddlers from a plugin",
            "text": "Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\n\n```\n--unpackplugin <title>\n```\n"
        },
        "$:/language/Help/verbose": {
            "title": "$:/language/Help/verbose",
            "description": "Triggers verbose output mode",
            "text": "Triggers verbose output, useful for debugging\n\n```\n--verbose\n```\n"
        },
        "$:/language/Help/version": {
            "title": "$:/language/Help/version",
            "description": "Displays the version number of TiddlyWiki",
            "text": "Displays the version number of TiddlyWiki.\n\n```\n--version\n```\n"
        },
        "$:/language/Import/Imported/Hint": {
            "title": "$:/language/Import/Imported/Hint",
            "text": "The following tiddlers were imported:"
        },
        "$:/language/Import/Listing/Cancel/Caption": {
            "title": "$:/language/Import/Listing/Cancel/Caption",
            "text": "Cancel"
        },
        "$:/language/Import/Listing/Hint": {
            "title": "$:/language/Import/Listing/Hint",
            "text": "These tiddlers are ready to import:"
        },
        "$:/language/Import/Listing/Import/Caption": {
            "title": "$:/language/Import/Listing/Import/Caption",
            "text": "Import"
        },
        "$:/language/Import/Listing/Select/Caption": {
            "title": "$:/language/Import/Listing/Select/Caption",
            "text": "Select"
        },
        "$:/language/Import/Listing/Status/Caption": {
            "title": "$:/language/Import/Listing/Status/Caption",
            "text": "Status"
        },
        "$:/language/Import/Listing/Title/Caption": {
            "title": "$:/language/Import/Listing/Title/Caption",
            "text": "Title"
        },
        "$:/language/Import/Listing/Preview": {
            "title": "$:/language/Import/Listing/Preview",
            "text": "Preview:"
        },
        "$:/language/Import/Listing/Preview/Text": {
            "title": "$:/language/Import/Listing/Preview/Text",
            "text": "Text"
        },
        "$:/language/Import/Listing/Preview/TextRaw": {
            "title": "$:/language/Import/Listing/Preview/TextRaw",
            "text": "Text (Raw)"
        },
        "$:/language/Import/Listing/Preview/Fields": {
            "title": "$:/language/Import/Listing/Preview/Fields",
            "text": "Fields"
        },
        "$:/language/Import/Listing/Preview/Diff": {
            "title": "$:/language/Import/Listing/Preview/Diff",
            "text": "Diff"
        },
        "$:/language/Import/Listing/Preview/DiffFields": {
            "title": "$:/language/Import/Listing/Preview/DiffFields",
            "text": "Diff (Fields)"
        },
        "$:/language/Import/Listing/Rename/Tooltip": {
            "title": "$:/language/Import/Listing/Rename/Tooltip",
            "text": "Rename tiddler before importing"
        },
        "$:/language/Import/Listing/Rename/Prompt": {
            "title": "$:/language/Import/Listing/Rename/Prompt",
            "text": "Rename to:"
        },
        "$:/language/Import/Listing/Rename/ConfirmRename": {
            "title": "$:/language/Import/Listing/Rename/ConfirmRename",
            "text": "Rename tiddler"
        },
        "$:/language/Import/Listing/Rename/CancelRename": {
            "title": "$:/language/Import/Listing/Rename/CancelRename",
            "text": "Cancel"
        },
        "$:/language/Import/Listing/Rename/OverwriteWarning": {
            "title": "$:/language/Import/Listing/Rename/OverwriteWarning",
            "text": "A tiddler with this title already exists."
        },
        "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible": {
            "title": "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible",
            "text": "Blocked incompatible or obsolete plugin."
        },
        "$:/language/Import/Upgrader/Plugins/Suppressed/Version": {
            "title": "$:/language/Import/Upgrader/Plugins/Suppressed/Version",
            "text": "Blocked plugin (due to incoming <<incoming>> not being newer than existing <<existing>>)."
        },
        "$:/language/Import/Upgrader/Plugins/Upgraded": {
            "title": "$:/language/Import/Upgrader/Plugins/Upgraded",
            "text": "Upgraded plugin from <<incoming>> to <<upgraded>>."
        },
        "$:/language/Import/Upgrader/State/Suppressed": {
            "title": "$:/language/Import/Upgrader/State/Suppressed",
            "text": "Blocked temporary state tiddler."
        },
        "$:/language/Import/Upgrader/System/Suppressed": {
            "title": "$:/language/Import/Upgrader/System/Suppressed",
            "text": "Blocked system tiddler."
        },
        "$:/language/Import/Upgrader/System/Warning": {
            "title": "$:/language/Import/Upgrader/System/Warning",
            "text": "Core module tiddler."
        },
        "$:/language/Import/Upgrader/System/Alert": {
            "title": "$:/language/Import/Upgrader/System/Alert",
            "text": "You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable."
        },
        "$:/language/Import/Upgrader/ThemeTweaks/Created": {
            "title": "$:/language/Import/Upgrader/ThemeTweaks/Created",
            "text": "Migrated theme tweak from <$text text=<<from>>/>."
        },
        "$:/language/AboveStory/ClassicPlugin/Warning": {
            "title": "$:/language/AboveStory/ClassicPlugin/Warning",
            "text": "It looks like you are trying to load a plugin designed for ~TiddlyWiki Classic. Please note that [[these plugins do not work with TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]. ~TiddlyWiki Classic plugins detected:"
        },
        "$:/language/BinaryWarning/Prompt": {
            "title": "$:/language/BinaryWarning/Prompt",
            "text": "This tiddler contains binary data"
        },
        "$:/language/ClassicWarning/Hint": {
            "title": "$:/language/ClassicWarning/Hint",
            "text": "This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See https://tiddlywiki.com/static/Upgrading.html for more details."
        },
        "$:/language/ClassicWarning/Upgrade/Caption": {
            "title": "$:/language/ClassicWarning/Upgrade/Caption",
            "text": "upgrade"
        },
        "$:/language/CloseAll/Button": {
            "title": "$:/language/CloseAll/Button",
            "text": "close all"
        },
        "$:/language/ColourPicker/Recent": {
            "title": "$:/language/ColourPicker/Recent",
            "text": "Recent:"
        },
        "$:/language/ConfirmCancelTiddler": {
            "title": "$:/language/ConfirmCancelTiddler",
            "text": "Do you wish to discard changes to the tiddler \"<$text text=<<title>>/>\"?"
        },
        "$:/language/ConfirmDeleteTiddler": {
            "title": "$:/language/ConfirmDeleteTiddler",
            "text": "Do you wish to delete the tiddler \"<$text text=<<title>>/>\"?"
        },
        "$:/language/ConfirmOverwriteTiddler": {
            "title": "$:/language/ConfirmOverwriteTiddler",
            "text": "Do you wish to overwrite the tiddler \"<$text text=<<title>>/>\"?"
        },
        "$:/language/ConfirmEditShadowTiddler": {
            "title": "$:/language/ConfirmEditShadowTiddler",
            "text": "You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \"<$text text=<<title>>/>\"?"
        },
        "$:/language/ConfirmAction": {
            "title": "$:/language/ConfirmAction",
            "text": "Do you wish to proceed?"
        },
        "$:/language/Count": {
            "title": "$:/language/Count",
            "text": "count"
        },
        "$:/language/DefaultNewTiddlerTitle": {
            "title": "$:/language/DefaultNewTiddlerTitle",
            "text": "New Tiddler"
        },
        "$:/language/Diffs/CountMessage": {
            "title": "$:/language/Diffs/CountMessage",
            "text": "<<diff-count>> differences"
        },
        "$:/language/DropMessage": {
            "title": "$:/language/DropMessage",
            "text": "Drop here (or use the 'Escape' key to cancel)"
        },
        "$:/language/Encryption/Cancel": {
            "title": "$:/language/Encryption/Cancel",
            "text": "Cancel"
        },
        "$:/language/Encryption/ConfirmClearPassword": {
            "title": "$:/language/Encryption/ConfirmClearPassword",
            "text": "Do you wish to clear the password? This will remove the encryption applied when saving this wiki"
        },
        "$:/language/Encryption/PromptSetPassword": {
            "title": "$:/language/Encryption/PromptSetPassword",
            "text": "Set a new password for this TiddlyWiki"
        },
        "$:/language/Encryption/Username": {
            "title": "$:/language/Encryption/Username",
            "text": "Username"
        },
        "$:/language/Encryption/Password": {
            "title": "$:/language/Encryption/Password",
            "text": "Password"
        },
        "$:/language/Encryption/RepeatPassword": {
            "title": "$:/language/Encryption/RepeatPassword",
            "text": "Repeat password"
        },
        "$:/language/Encryption/PasswordNoMatch": {
            "title": "$:/language/Encryption/PasswordNoMatch",
            "text": "Passwords do not match"
        },
        "$:/language/Encryption/SetPassword": {
            "title": "$:/language/Encryption/SetPassword",
            "text": "Set password"
        },
        "$:/language/Error/Caption": {
            "title": "$:/language/Error/Caption",
            "text": "Error"
        },
        "$:/language/Error/EditConflict": {
            "title": "$:/language/Error/EditConflict",
            "text": "File changed on server"
        },
        "$:/language/Error/Filter": {
            "title": "$:/language/Error/Filter",
            "text": "Filter error"
        },
        "$:/language/Error/FilterSyntax": {
            "title": "$:/language/Error/FilterSyntax",
            "text": "Syntax error in filter expression"
        },
        "$:/language/Error/FilterRunPrefix": {
            "title": "$:/language/Error/FilterRunPrefix",
            "text": "Filter Error: Unknown prefix for filter run"
        },
        "$:/language/Error/IsFilterOperator": {
            "title": "$:/language/Error/IsFilterOperator",
            "text": "Filter Error: Unknown operand for the 'is' filter operator"
        },
        "$:/language/Error/FormatFilterOperator": {
            "title": "$:/language/Error/FormatFilterOperator",
            "text": "Filter Error: Unknown suffix for the 'format' filter operator"
        },
        "$:/language/Error/LoadingPluginLibrary": {
            "title": "$:/language/Error/LoadingPluginLibrary",
            "text": "Error loading plugin library"
        },
        "$:/language/Error/NetworkErrorAlert": {
            "title": "$:/language/Error/NetworkErrorAlert",
            "text": "`<h2>''Network Error''</h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.<br><br>''Any unsaved changes will be automatically synchronised when connectivity is restored''.`"
        },
        "$:/language/Error/RecursiveTransclusion": {
            "title": "$:/language/Error/RecursiveTransclusion",
            "text": "Recursive transclusion error in transclude widget"
        },
        "$:/language/Error/RetrievingSkinny": {
            "title": "$:/language/Error/RetrievingSkinny",
            "text": "Error retrieving skinny tiddler list"
        },
        "$:/language/Error/SavingToTWEdit": {
            "title": "$:/language/Error/SavingToTWEdit",
            "text": "Error saving to TWEdit"
        },
        "$:/language/Error/WhileSaving": {
            "title": "$:/language/Error/WhileSaving",
            "text": "Error while saving"
        },
        "$:/language/Error/XMLHttpRequest": {
            "title": "$:/language/Error/XMLHttpRequest",
            "text": "XMLHttpRequest error code"
        },
        "$:/language/InternalJavaScriptError/Title": {
            "title": "$:/language/InternalJavaScriptError/Title",
            "text": "Internal JavaScript Error"
        },
        "$:/language/InternalJavaScriptError/Hint": {
            "title": "$:/language/InternalJavaScriptError/Hint",
            "text": "Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser"
        },
        "$:/language/InvalidFieldName": {
            "title": "$:/language/InvalidFieldName",
            "text": "Illegal characters in field name \"<$text text=<<fieldName>>/>\". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`)"
        },
        "$:/language/LayoutSwitcher/Description": {
            "title": "$:/language/LayoutSwitcher/Description",
            "text": "Open the layout switcher"
        },
        "$:/language/LazyLoadingWarning": {
            "title": "$:/language/LazyLoadingWarning",
            "text": "<p>Trying to load external content from ''<$text text={{!!_canonical_uri}}/>''</p><p>If this message doesn't disappear, either the tiddler content type doesn't match the type of the external content, or you may be using a browser that doesn't support external content for wikis loaded as standalone files. See https://tiddlywiki.com/#ExternalText</p>"
        },
        "$:/language/LoginToTiddlySpace": {
            "title": "$:/language/LoginToTiddlySpace",
            "text": "Login to TiddlySpace"
        },
        "$:/language/Manager/Controls/FilterByTag/None": {
            "title": "$:/language/Manager/Controls/FilterByTag/None",
            "text": "(none)"
        },
        "$:/language/Manager/Controls/FilterByTag/Prompt": {
            "title": "$:/language/Manager/Controls/FilterByTag/Prompt",
            "text": "Filter by tag:"
        },
        "$:/language/Manager/Controls/Order/Prompt": {
            "title": "$:/language/Manager/Controls/Order/Prompt",
            "text": "Reverse order"
        },
        "$:/language/Manager/Controls/Search/Placeholder": {
            "title": "$:/language/Manager/Controls/Search/Placeholder",
            "text": "Search"
        },
        "$:/language/Manager/Controls/Search/Prompt": {
            "title": "$:/language/Manager/Controls/Search/Prompt",
            "text": "Search:"
        },
        "$:/language/Manager/Controls/Show/Option/Tags": {
            "title": "$:/language/Manager/Controls/Show/Option/Tags",
            "text": "tags"
        },
        "$:/language/Manager/Controls/Show/Option/Tiddlers": {
            "title": "$:/language/Manager/Controls/Show/Option/Tiddlers",
            "text": "tiddlers"
        },
        "$:/language/Manager/Controls/Show/Prompt": {
            "title": "$:/language/Manager/Controls/Show/Prompt",
            "text": "Show:"
        },
        "$:/language/Manager/Controls/Sort/Prompt": {
            "title": "$:/language/Manager/Controls/Sort/Prompt",
            "text": "Sort by:"
        },
        "$:/language/Manager/Item/Colour": {
            "title": "$:/language/Manager/Item/Colour",
            "text": "Colour"
        },
        "$:/language/Manager/Item/Fields": {
            "title": "$:/language/Manager/Item/Fields",
            "text": "Fields"
        },
        "$:/language/Manager/Item/Icon/None": {
            "title": "$:/language/Manager/Item/Icon/None",
            "text": "(none)"
        },
        "$:/language/Manager/Item/Icon": {
            "title": "$:/language/Manager/Item/Icon",
            "text": "Icon"
        },
        "$:/language/Manager/Item/RawText": {
            "title": "$:/language/Manager/Item/RawText",
            "text": "Raw text"
        },
        "$:/language/Manager/Item/Tags": {
            "title": "$:/language/Manager/Item/Tags",
            "text": "Tags"
        },
        "$:/language/Manager/Item/Tools": {
            "title": "$:/language/Manager/Item/Tools",
            "text": "Tools"
        },
        "$:/language/Manager/Item/WikifiedText": {
            "title": "$:/language/Manager/Item/WikifiedText",
            "text": "Wikified text"
        },
        "$:/language/MissingTiddler/Hint": {
            "title": "$:/language/MissingTiddler/Hint",
            "text": "Missing tiddler \"<$text text=<<currentTiddler>>/>\" -- click {{||$:/core/ui/Buttons/edit}} to create"
        },
        "$:/language/No": {
            "title": "$:/language/No",
            "text": "No"
        },
        "$:/language/OfficialPluginLibrary": {
            "title": "$:/language/OfficialPluginLibrary",
            "text": "Official ~TiddlyWiki Plugin Library"
        },
        "$:/language/OfficialPluginLibrary/Hint": {
            "title": "$:/language/OfficialPluginLibrary/Hint",
            "text": "The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team."
        },
        "$:/language/PageTemplate/Description": {
            "title": "$:/language/PageTemplate/Description",
            "text": "the default ~TiddlyWiki layout"
        },
        "$:/language/PageTemplate/Name": {
            "title": "$:/language/PageTemplate/Name",
            "text": "Default ~PageTemplate"
        },
        "$:/language/PluginReloadWarning": {
            "title": "$:/language/PluginReloadWarning",
            "text": "Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect"
        },
        "$:/language/RecentChanges/DateFormat": {
            "title": "$:/language/RecentChanges/DateFormat",
            "text": "DDth MMM YYYY"
        },
        "$:/language/Shortcuts/Input/AdvancedSearch/Hint": {
            "title": "$:/language/Shortcuts/Input/AdvancedSearch/Hint",
            "text": "Open the ~AdvancedSearch panel from within the sidebar search field"
        },
        "$:/language/Shortcuts/Input/Accept/Hint": {
            "title": "$:/language/Shortcuts/Input/Accept/Hint",
            "text": "Accept the selected item"
        },
        "$:/language/Shortcuts/Input/AcceptVariant/Hint": {
            "title": "$:/language/Shortcuts/Input/AcceptVariant/Hint",
            "text": "Accept the selected item (variant)"
        },
        "$:/language/Shortcuts/Input/Cancel/Hint": {
            "title": "$:/language/Shortcuts/Input/Cancel/Hint",
            "text": "Clear the input field"
        },
        "$:/language/Shortcuts/Input/Down/Hint": {
            "title": "$:/language/Shortcuts/Input/Down/Hint",
            "text": "Select the next item"
        },
        "$:/language/Shortcuts/Input/Tab-Left/Hint": {
            "title": "$:/language/Shortcuts/Input/Tab-Left/Hint",
            "text": "Select the previous Tab"
        },
        "$:/language/Shortcuts/Input/Tab-Right/Hint": {
            "title": "$:/language/Shortcuts/Input/Tab-Right/Hint",
            "text": "Select the next Tab"
        },
        "$:/language/Shortcuts/Input/Up/Hint": {
            "title": "$:/language/Shortcuts/Input/Up/Hint",
            "text": "Select the previous item"
        },
        "$:/language/Shortcuts/SidebarLayout/Hint": {
            "title": "$:/language/Shortcuts/SidebarLayout/Hint",
            "text": "Change the sidebar layout"
        },
        "$:/language/Switcher/Subtitle/theme": {
            "title": "$:/language/Switcher/Subtitle/theme",
            "text": "Switch Theme"
        },
        "$:/language/Switcher/Subtitle/layout": {
            "title": "$:/language/Switcher/Subtitle/layout",
            "text": "Switch Layout"
        },
        "$:/language/Switcher/Subtitle/language": {
            "title": "$:/language/Switcher/Subtitle/language",
            "text": "Switch Language"
        },
        "$:/language/Switcher/Subtitle/palette": {
            "title": "$:/language/Switcher/Subtitle/palette",
            "text": "Switch Palette"
        },
        "$:/language/SystemTiddler/Tooltip": {
            "title": "$:/language/SystemTiddler/Tooltip",
            "text": "This is a system tiddler"
        },
        "$:/language/SystemTiddlers/Include/Prompt": {
            "title": "$:/language/SystemTiddlers/Include/Prompt",
            "text": "Include system tiddlers"
        },
        "$:/language/TagManager/Colour/Heading": {
            "title": "$:/language/TagManager/Colour/Heading",
            "text": "Colour"
        },
        "$:/language/TagManager/Count/Heading": {
            "title": "$:/language/TagManager/Count/Heading",
            "text": "Count"
        },
        "$:/language/TagManager/Icon/Heading": {
            "title": "$:/language/TagManager/Icon/Heading",
            "text": "Icon"
        },
        "$:/language/TagManager/Icons/None": {
            "title": "$:/language/TagManager/Icons/None",
            "text": "None"
        },
        "$:/language/TagManager/Info/Heading": {
            "title": "$:/language/TagManager/Info/Heading",
            "text": "Info"
        },
        "$:/language/TagManager/Tag/Heading": {
            "title": "$:/language/TagManager/Tag/Heading",
            "text": "Tag"
        },
        "$:/language/Tiddler/DateFormat": {
            "title": "$:/language/Tiddler/DateFormat",
            "text": "DDth MMM YYYY at hh12:0mmam"
        },
        "$:/language/UnsavedChangesWarning": {
            "title": "$:/language/UnsavedChangesWarning",
            "text": "You have unsaved changes in TiddlyWiki"
        },
        "$:/language/Yes": {
            "title": "$:/language/Yes",
            "text": "Yes"
        },
        "$:/language/Modals/Download": {
            "title": "$:/language/Modals/Download",
            "subtitle": "Download changes",
            "footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
            "help": "https://tiddlywiki.com/static/DownloadingChanges.html",
            "text": "Your browser only supports manual saving.\n\nTo save your modified wiki, right click on the download link below and select \"Download file\" or \"Save file\", and then choose the folder and filename.\n\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\n\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\n"
        },
        "$:/language/Modals/SaveInstructions": {
            "title": "$:/language/Modals/SaveInstructions",
            "subtitle": "Save your work",
            "footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
            "help": "https://tiddlywiki.com/static/SavingChanges.html",
            "text": "Your changes to this wiki need to be saved as a ~TiddlyWiki HTML file.\n\n!!! Desktop browsers\n\n# Select ''Save As'' from the ''File'' menu\n# Choose a filename and location\n#* Some browsers also require you to explicitly specify the file saving format as ''Webpage, HTML only'' or similar\n# Close this tab\n\n!!! Smartphone browsers\n\n# Create a bookmark to this page\n#* If you've got iCloud or Google Sync set up then the bookmark will automatically sync to your desktop where you can open it and save it as above\n# Close this tab\n\n//If you open the bookmark again in Mobile Safari you will see this message again. If you want to go ahead and use the file, just click the ''close'' button below//\n"
        },
        "$:/config/NewJournal/Title": {
            "title": "$:/config/NewJournal/Title",
            "text": "DDth MMM YYYY"
        },
        "$:/config/NewJournal/Text": {
            "title": "$:/config/NewJournal/Text",
            "text": ""
        },
        "$:/config/NewJournal/Tags": {
            "title": "$:/config/NewJournal/Tags",
            "text": "Journal\n"
        },
        "$:/language/Notifications/Save/Done": {
            "title": "$:/language/Notifications/Save/Done",
            "text": "Saved wiki"
        },
        "$:/language/Notifications/Save/Starting": {
            "title": "$:/language/Notifications/Save/Starting",
            "text": "Starting to save wiki"
        },
        "$:/language/Notifications/CopiedToClipboard/Succeeded": {
            "title": "$:/language/Notifications/CopiedToClipboard/Succeeded",
            "text": "Copied to clipboard!"
        },
        "$:/language/Notifications/CopiedToClipboard/Failed": {
            "title": "$:/language/Notifications/CopiedToClipboard/Failed",
            "text": "Failed to copy to clipboard!"
        },
        "$:/language/Search/DefaultResults/Caption": {
            "title": "$:/language/Search/DefaultResults/Caption",
            "text": "List"
        },
        "$:/language/Search/Filter/Caption": {
            "title": "$:/language/Search/Filter/Caption",
            "text": "Filter"
        },
        "$:/language/Search/Filter/Hint": {
            "title": "$:/language/Search/Filter/Hint",
            "text": "Search via a [[filter expression|https://tiddlywiki.com/static/Filters.html]]"
        },
        "$:/language/Search/Filter/Matches": {
            "title": "$:/language/Search/Filter/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/Search/Matches": {
            "title": "$:/language/Search/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/Search/Matches/All": {
            "title": "$:/language/Search/Matches/All",
            "text": "All matches:"
        },
        "$:/language/Search/Matches/Title": {
            "title": "$:/language/Search/Matches/Title",
            "text": "Title matches:"
        },
        "$:/language/Search/Search": {
            "title": "$:/language/Search/Search",
            "text": "Search"
        },
        "$:/language/Search/Search/TooShort": {
            "title": "$:/language/Search/Search/TooShort",
            "text": "Search text too short"
        },
        "$:/language/Search/Shadows/Caption": {
            "title": "$:/language/Search/Shadows/Caption",
            "text": "Shadows"
        },
        "$:/language/Search/Shadows/Hint": {
            "title": "$:/language/Search/Shadows/Hint",
            "text": "Search for shadow tiddlers"
        },
        "$:/language/Search/Shadows/Matches": {
            "title": "$:/language/Search/Shadows/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/Search/Standard/Caption": {
            "title": "$:/language/Search/Standard/Caption",
            "text": "Standard"
        },
        "$:/language/Search/Standard/Hint": {
            "title": "$:/language/Search/Standard/Hint",
            "text": "Search for standard tiddlers"
        },
        "$:/language/Search/Standard/Matches": {
            "title": "$:/language/Search/Standard/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/Search/System/Caption": {
            "title": "$:/language/Search/System/Caption",
            "text": "System"
        },
        "$:/language/Search/System/Hint": {
            "title": "$:/language/Search/System/Hint",
            "text": "Search for system tiddlers"
        },
        "$:/language/Search/System/Matches": {
            "title": "$:/language/Search/System/Matches",
            "text": "//<small><<resultCount>> matches</small>//"
        },
        "$:/language/SideBar/All/Caption": {
            "title": "$:/language/SideBar/All/Caption",
            "text": "All"
        },
        "$:/language/SideBar/Contents/Caption": {
            "title": "$:/language/SideBar/Contents/Caption",
            "text": "Contents"
        },
        "$:/language/SideBar/Drafts/Caption": {
            "title": "$:/language/SideBar/Drafts/Caption",
            "text": "Drafts"
        },
        "$:/language/SideBar/Explorer/Caption": {
            "title": "$:/language/SideBar/Explorer/Caption",
            "text": "Explorer"
        },
        "$:/language/SideBar/Missing/Caption": {
            "title": "$:/language/SideBar/Missing/Caption",
            "text": "Missing"
        },
        "$:/language/SideBar/More/Caption": {
            "title": "$:/language/SideBar/More/Caption",
            "text": "More"
        },
        "$:/language/SideBar/Open/Caption": {
            "title": "$:/language/SideBar/Open/Caption",
            "text": "Open"
        },
        "$:/language/SideBar/Orphans/Caption": {
            "title": "$:/language/SideBar/Orphans/Caption",
            "text": "Orphans"
        },
        "$:/language/SideBar/Recent/Caption": {
            "title": "$:/language/SideBar/Recent/Caption",
            "text": "Recent"
        },
        "$:/language/SideBar/Shadows/Caption": {
            "title": "$:/language/SideBar/Shadows/Caption",
            "text": "Shadows"
        },
        "$:/language/SideBar/System/Caption": {
            "title": "$:/language/SideBar/System/Caption",
            "text": "System"
        },
        "$:/language/SideBar/Tags/Caption": {
            "title": "$:/language/SideBar/Tags/Caption",
            "text": "Tags"
        },
        "$:/language/SideBar/Tags/Untagged/Caption": {
            "title": "$:/language/SideBar/Tags/Untagged/Caption",
            "text": "untagged"
        },
        "$:/language/SideBar/Tools/Caption": {
            "title": "$:/language/SideBar/Tools/Caption",
            "text": "Tools"
        },
        "$:/language/SideBar/Types/Caption": {
            "title": "$:/language/SideBar/Types/Caption",
            "text": "Types"
        },
        "$:/SiteSubtitle": {
            "title": "$:/SiteSubtitle",
            "text": "a non-linear personal web notebook"
        },
        "$:/SiteTitle": {
            "title": "$:/SiteTitle",
            "text": "My ~TiddlyWiki"
        },
        "$:/language/Snippets/ListByTag": {
            "title": "$:/language/Snippets/ListByTag",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "List of tiddlers by tag",
            "text": "<<list-links \"[tag[task]sort[title]]\">>\n"
        },
        "$:/language/Snippets/MacroDefinition": {
            "title": "$:/language/Snippets/MacroDefinition",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "Macro definition",
            "text": "\\define macroName(param1:\"default value\",param2)\nText of the macro\n\\end\n"
        },
        "$:/language/Snippets/Table4x3": {
            "title": "$:/language/Snippets/Table4x3",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "Table with 4 columns by 3 rows",
            "text": "|! |!Alpha |!Beta |!Gamma |!Delta |\n|!One | | | | |\n|!Two | | | | |\n|!Three | | | | |\n"
        },
        "$:/language/Snippets/TableOfContents": {
            "title": "$:/language/Snippets/TableOfContents",
            "tags": "$:/tags/TextEditor/Snippet",
            "caption": "Table of Contents",
            "text": "<div class=\"tc-table-of-contents\">\n\n<<toc-selective-expandable 'TableOfContents'>>\n\n</div>"
        },
        "$:/language/ThemeTweaks/ThemeTweaks": {
            "title": "$:/language/ThemeTweaks/ThemeTweaks",
            "text": "Theme Tweaks"
        },
        "$:/language/ThemeTweaks/ThemeTweaks/Hint": {
            "title": "$:/language/ThemeTweaks/ThemeTweaks/Hint",
            "text": "You can tweak certain aspects of the ''Vanilla'' theme."
        },
        "$:/language/ThemeTweaks/Options": {
            "title": "$:/language/ThemeTweaks/Options",
            "text": "Options"
        },
        "$:/language/ThemeTweaks/Options/SidebarLayout": {
            "title": "$:/language/ThemeTweaks/Options/SidebarLayout",
            "text": "Sidebar layout"
        },
        "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid": {
            "title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid",
            "text": "Fixed story, fluid sidebar"
        },
        "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed": {
            "title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed",
            "text": "Fluid story, fixed sidebar"
        },
        "$:/language/ThemeTweaks/Options/StickyTitles": {
            "title": "$:/language/ThemeTweaks/Options/StickyTitles",
            "text": "Sticky titles"
        },
        "$:/language/ThemeTweaks/Options/StickyTitles/Hint": {
            "title": "$:/language/ThemeTweaks/Options/StickyTitles/Hint",
            "text": "Causes tiddler titles to \"stick\" to the top of the browser window"
        },
        "$:/language/ThemeTweaks/Options/CodeWrapping": {
            "title": "$:/language/ThemeTweaks/Options/CodeWrapping",
            "text": "Wrap long lines in code blocks"
        },
        "$:/language/ThemeTweaks/Settings": {
            "title": "$:/language/ThemeTweaks/Settings",
            "text": "Settings"
        },
        "$:/language/ThemeTweaks/Settings/FontFamily": {
            "title": "$:/language/ThemeTweaks/Settings/FontFamily",
            "text": "Font family"
        },
        "$:/language/ThemeTweaks/Settings/CodeFontFamily": {
            "title": "$:/language/ThemeTweaks/Settings/CodeFontFamily",
            "text": "Code font family"
        },
        "$:/language/ThemeTweaks/Settings/EditorFontFamily": {
            "title": "$:/language/ThemeTweaks/Settings/EditorFontFamily",
            "text": "Editor font family"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImage": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImage",
            "text": "Page background image"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment",
            "text": "Page background image attachment"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll",
            "text": "Scroll with tiddlers"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed",
            "text": "Fixed to window"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize",
            "text": "Page background image size"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto",
            "text": "Auto"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover",
            "text": "Cover"
        },
        "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain": {
            "title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain",
            "text": "Contain"
        },
        "$:/language/ThemeTweaks/Metrics": {
            "title": "$:/language/ThemeTweaks/Metrics",
            "text": "Sizes"
        },
        "$:/language/ThemeTweaks/Metrics/FontSize": {
            "title": "$:/language/ThemeTweaks/Metrics/FontSize",
            "text": "Font size"
        },
        "$:/language/ThemeTweaks/Metrics/LineHeight": {
            "title": "$:/language/ThemeTweaks/Metrics/LineHeight",
            "text": "Line height"
        },
        "$:/language/ThemeTweaks/Metrics/BodyFontSize": {
            "title": "$:/language/ThemeTweaks/Metrics/BodyFontSize",
            "text": "Font size for tiddler body"
        },
        "$:/language/ThemeTweaks/Metrics/BodyLineHeight": {
            "title": "$:/language/ThemeTweaks/Metrics/BodyLineHeight",
            "text": "Line height for tiddler body"
        },
        "$:/language/ThemeTweaks/Metrics/StoryLeft": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryLeft",
            "text": "Story left position"
        },
        "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint",
            "text": "how far the left margin of the story river<br>(tiddler area) is from the left of the page"
        },
        "$:/language/ThemeTweaks/Metrics/StoryTop": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryTop",
            "text": "Story top position"
        },
        "$:/language/ThemeTweaks/Metrics/StoryTop/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryTop/Hint",
            "text": "how far the top margin of the story river<br>is from the top of the page"
        },
        "$:/language/ThemeTweaks/Metrics/StoryRight": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryRight",
            "text": "Story right"
        },
        "$:/language/ThemeTweaks/Metrics/StoryRight/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryRight/Hint",
            "text": "how far the left margin of the sidebar <br>is from the left of the page"
        },
        "$:/language/ThemeTweaks/Metrics/StoryWidth": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryWidth",
            "text": "Story width"
        },
        "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint",
            "text": "the overall width of the story river"
        },
        "$:/language/ThemeTweaks/Metrics/TiddlerWidth": {
            "title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth",
            "text": "Tiddler width"
        },
        "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint",
            "text": "within the story river"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint",
            "text": "Sidebar breakpoint"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint",
            "text": "the minimum page width at which the story<br>river and sidebar will appear side by side"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarWidth": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarWidth",
            "text": "Sidebar width"
        },
        "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint": {
            "title": "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint",
            "text": "the width of the sidebar in fluid-fixed layout"
        },
        "$:/language/TiddlerInfo/Advanced/Caption": {
            "title": "$:/language/TiddlerInfo/Advanced/Caption",
            "text": "Advanced"
        },
        "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint",
            "text": "none"
        },
        "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading": {
            "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading",
            "text": "Plugin Details"
        },
        "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint",
            "text": "This plugin contains the following shadow tiddlers:"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading",
            "text": "Shadow Status"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint",
            "text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is not a shadow tiddler"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint",
            "text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is a shadow tiddler"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source",
            "text": "It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>"
        },
        "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint": {
            "title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint",
            "text": "It is overridden by an ordinary tiddler"
        },
        "$:/language/TiddlerInfo/Fields/Caption": {
            "title": "$:/language/TiddlerInfo/Fields/Caption",
            "text": "Fields"
        },
        "$:/language/TiddlerInfo/List/Caption": {
            "title": "$:/language/TiddlerInfo/List/Caption",
            "text": "List"
        },
        "$:/language/TiddlerInfo/List/Empty": {
            "title": "$:/language/TiddlerInfo/List/Empty",
            "text": "This tiddler does not have a list"
        },
        "$:/language/TiddlerInfo/Listed/Caption": {
            "title": "$:/language/TiddlerInfo/Listed/Caption",
            "text": "Listed"
        },
        "$:/language/TiddlerInfo/Listed/Empty": {
            "title": "$:/language/TiddlerInfo/Listed/Empty",
            "text": "This tiddler is not listed by any others"
        },
        "$:/language/TiddlerInfo/References/Caption": {
            "title": "$:/language/TiddlerInfo/References/Caption",
            "text": "Backlinks"
        },
        "$:/language/TiddlerInfo/References/Empty": {
            "title": "$:/language/TiddlerInfo/References/Empty",
            "text": "No tiddlers link to this one"
        },
        "$:/language/TiddlerInfo/Tagging/Caption": {
            "title": "$:/language/TiddlerInfo/Tagging/Caption",
            "text": "Tagging"
        },
        "$:/language/TiddlerInfo/Tagging/Empty": {
            "title": "$:/language/TiddlerInfo/Tagging/Empty",
            "text": "No tiddlers are tagged with this one"
        },
        "$:/language/TiddlerInfo/Tools/Caption": {
            "title": "$:/language/TiddlerInfo/Tools/Caption",
            "text": "Tools"
        },
        "$:/language/Docs/Types/application/javascript": {
            "title": "$:/language/Docs/Types/application/javascript",
            "description": "JavaScript code",
            "name": "application/javascript",
            "group": "Developer",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/application/json": {
            "title": "$:/language/Docs/Types/application/json",
            "description": "JSON data",
            "name": "application/json",
            "group": "Developer",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/application/x-tiddler-dictionary": {
            "title": "$:/language/Docs/Types/application/x-tiddler-dictionary",
            "description": "Data dictionary",
            "name": "application/x-tiddler-dictionary",
            "group": "Developer",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/image/gif": {
            "title": "$:/language/Docs/Types/image/gif",
            "description": "GIF image",
            "name": "image/gif",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/jpeg": {
            "title": "$:/language/Docs/Types/image/jpeg",
            "description": "JPEG image",
            "name": "image/jpeg",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/png": {
            "title": "$:/language/Docs/Types/image/png",
            "description": "PNG image",
            "name": "image/png",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/svg+xml": {
            "title": "$:/language/Docs/Types/image/svg+xml",
            "description": "Structured Vector Graphics image",
            "name": "image/svg+xml",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/image/x-icon": {
            "title": "$:/language/Docs/Types/image/x-icon",
            "description": "ICO format icon file",
            "name": "image/x-icon",
            "group": "Image",
            "group-sort": "1"
        },
        "$:/language/Docs/Types/text/css": {
            "title": "$:/language/Docs/Types/text/css",
            "description": "Static stylesheet",
            "name": "text/css",
            "group": "Developer",
            "group-sort": "2"
        },
        "$:/language/Docs/Types/text/html": {
            "title": "$:/language/Docs/Types/text/html",
            "description": "HTML markup",
            "name": "text/html",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/language/Docs/Types/text/plain": {
            "title": "$:/language/Docs/Types/text/plain",
            "description": "Plain text",
            "name": "text/plain",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/language/Docs/Types/text/vnd.tiddlywiki": {
            "title": "$:/language/Docs/Types/text/vnd.tiddlywiki",
            "description": "TiddlyWiki 5",
            "name": "text/vnd.tiddlywiki",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/language/Docs/Types/text/x-tiddlywiki": {
            "title": "$:/language/Docs/Types/text/x-tiddlywiki",
            "description": "TiddlyWiki Classic",
            "name": "text/x-tiddlywiki",
            "group": "Text",
            "group-sort": "0"
        },
        "$:/languages/en-GB/icon": {
            "title": "$:/languages/en-GB/icon",
            "type": "image/svg+xml",
            "text": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 30\" width=\"1200\" height=\"600\">\n<clipPath id=\"t\">\n\t<path d=\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\"/>\n</clipPath>\n<path d=\"M0,0 v30 h60 v-30 z\" fill=\"#00247d\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" clip-path=\"url(#t)\" stroke=\"#cf142b\" stroke-width=\"4\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#fff\" stroke-width=\"10\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#cf142b\" stroke-width=\"6\"/>\n</svg>\n"
        },
        "$:/languages/en-GB": {
            "title": "$:/languages/en-GB",
            "name": "en-GB",
            "description": "English (British)",
            "author": "JeremyRuston",
            "core-version": ">=5.0.0\"",
            "text": "Stub pseudo-plugin for the default language"
        },
        "$:/core/modules/commander.js": {
            "title": "$:/core/modules/commander.js",
            "text": "/*\\\ntitle: $:/core/modules/commander.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Commander class is a command interpreter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a sequence of commands\n\tcommandTokens: an array of command string tokens\n\twiki: reference to the wiki store object\n\tstreams: {output:, error:}, each of which has a write(string) method\n\tcallback: a callback invoked as callback(err) where err is null if there was no error\n*/\nvar Commander = function(commandTokens,callback,wiki,streams) {\n\tvar path = require(\"path\");\n\tthis.commandTokens = commandTokens;\n\tthis.nextToken = 0;\n\tthis.callback = callback;\n\tthis.wiki = wiki;\n\tthis.streams = streams;\n\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\n};\n\n/*\nLog a string if verbose flag is set\n*/\nCommander.prototype.log = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str + \"\\n\");\n\t}\n};\n\n/*\nWrite a string if verbose flag is set\n*/\nCommander.prototype.write = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str);\n\t}\n};\n\n/*\nAdd a string of tokens to the command queue\n*/\nCommander.prototype.addCommandTokens = function(commandTokens) {\n\tvar params = commandTokens.slice(0);\n\tparams.unshift(0);\n\tparams.unshift(this.nextToken);\n\tArray.prototype.splice.apply(this.commandTokens,params);\n};\n\n/*\nExecute the sequence of commands and invoke a callback on completion\n*/\nCommander.prototype.execute = function() {\n\tthis.executeNextCommand();\n};\n\n/*\nExecute the next command in the sequence\n*/\nCommander.prototype.executeNextCommand = function() {\n\tvar self = this;\n\t// Invoke the callback if there are no more commands\n\tif(this.nextToken >= this.commandTokens.length) {\n\t\tthis.callback(null);\n\t} else {\n\t\t// Get and check the command token\n\t\tvar commandName = this.commandTokens[this.nextToken++];\n\t\tif(commandName.substr(0,2) !== \"--\") {\n\t\t\tthis.callback(\"Missing command: \" + commandName);\n\t\t} else {\n\t\t\tcommandName = commandName.substr(2); // Trim off the --\n\t\t\t// Accumulate the parameters to the command\n\t\t\tvar params = [];\n\t\t\twhile(this.nextToken < this.commandTokens.length && \n\t\t\t\tthis.commandTokens[this.nextToken].substr(0,2) !== \"--\") {\n\t\t\t\tparams.push(this.commandTokens[this.nextToken++]);\n\t\t\t}\n\t\t\t// Get the command info\n\t\t\tvar command = $tw.commands[commandName],\n\t\t\t\tc,err;\n\t\t\tif(!command) {\n\t\t\t\tthis.callback(\"Unknown command: \" + commandName);\n\t\t\t} else {\n\t\t\t\tif(this.verbose) {\n\t\t\t\t\tthis.streams.output.write(\"Executing command: \" + commandName + \" \" + params.join(\" \") + \"\\n\");\n\t\t\t\t}\n\t\t\t\t// Parse named parameters if required\n\t\t\t\tif(command.info.namedParameterMode) {\n\t\t\t\t\tparams = this.extractNamedParameters(params,command.info.mandatoryParameters);\n\t\t\t\t\tif(typeof params === \"string\") {\n\t\t\t\t\t\treturn this.callback(params);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(command.info.synchronous) {\n\t\t\t\t\t// Synchronous command\n\t\t\t\t\tc = new command.Command(params,this);\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.executeNextCommand();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Asynchronous command\n\t\t\t\t\tc = new command.Command(params,this,function(err) {\n\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\tself.callback(err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.executeNextCommand();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nGiven an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, returns a hashmap of values or a string if error\n*/\nCommander.prototype.extractNamedParameters = function(params,mandatoryParameters) {\n\tmandatoryParameters = mandatoryParameters || [];\n\tvar errors = [],\n\t\tparamsByName = Object.create(null);\n\t// Extract the parameters\n\t$tw.utils.each(params,function(param) {\n\t\tvar index = param.indexOf(\"=\");\n\t\tif(index < 1) {\n\t\t\terrors.push(\"malformed named parameter: '\" + param + \"'\");\n\t\t}\n\t\tparamsByName[param.slice(0,index)] = $tw.utils.trim(param.slice(index+1));\n\t});\n\t// Check the mandatory parameters are present\n\t$tw.utils.each(mandatoryParameters,function(mandatoryParameter) {\n\t\tif(!$tw.utils.hop(paramsByName,mandatoryParameter)) {\n\t\t\terrors.push(\"missing mandatory parameter: '\" + mandatoryParameter + \"'\");\n\t\t}\n\t});\n\t// Return any errors\n\tif(errors.length > 0) {\n\t\treturn errors.join(\" and\\n\");\n\t} else {\n\t\treturn paramsByName;\t\t\n\t}\n};\n\nCommander.initCommands = function(moduleType) {\n\tmoduleType = moduleType || \"command\";\n\t$tw.commands = {};\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tvar c = $tw.commands[module.info.name] = {};\n\t\t// Add the methods defined by the module\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\tc[f] = module[f];\n\t\t\t}\n\t\t}\n\t});\n};\n\nexports.Commander = Commander;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/commands/build.js": {
            "title": "$:/core/modules/commands/build.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/build.js\ntype: application/javascript\nmodule-type: command\n\nCommand to build a build target\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"build\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Get the build targets defined in the wiki\n\tvar buildTargets = $tw.boot.wikiInfo.build;\n\tif(!buildTargets) {\n\t\treturn \"No build targets defined\";\n\t}\n\t// Loop through each of the specified targets\n\tvar targets;\n\tif(this.params.length > 0) {\n\t\ttargets = this.params;\n\t} else {\n\t\ttargets = Object.keys(buildTargets);\n\t}\n\tfor(var targetIndex=0; targetIndex<targets.length; targetIndex++) {\n\t\tvar target = targets[targetIndex],\n\t\t\tcommands = buildTargets[target];\n\t\tif(!commands) {\n\t\t\treturn \"Build target '\" + target + \"' not found\";\n\t\t}\n\t\t// Add the commands to the queue\n\t\tthis.commander.addCommandTokens(commands);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/clearpassword.js": {
            "title": "$:/core/modules/commands/clearpassword.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/clearpassword.js\ntype: application/javascript\nmodule-type: command\n\nClear password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"clearpassword\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\t$tw.crypto.setPassword(null);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/deletetiddlers.js": {
            "title": "$:/core/modules/commands/deletetiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/deletetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to delete tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"deletetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filter\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\twiki.deleteTiddler(title);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/editions.js": {
            "title": "$:/core/modules/commands/editions.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/editions.js\ntype: application/javascript\nmodule-type: command\n\nCommand to list the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"editions\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\t// Output the list\n\tthis.commander.streams.output.write(\"Available editions:\\n\\n\");\n\tvar editionInfo = $tw.utils.getEditionInfo();\n\t$tw.utils.each(editionInfo,function(info,name) {\n\t\tself.commander.streams.output.write(\"    \" + name + \": \" + info.description + \"\\n\");\n\t});\n\tthis.commander.streams.output.write(\"\\n\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/fetch.js": {
            "title": "$:/core/modules/commands/fetch.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/fetch.js\ntype: application/javascript\nmodule-type: command\n\nCommands to fetch external tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"fetch\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing subcommand and url\";\n\t}\n\tswitch(this.params[0]) {\n\t\tcase \"raw-file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turl: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turl: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"raw-files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t}\n\treturn null;\n};\n\nCommand.prototype.fetchFiles = function(options) {\n\tvar self = this;\n\t// Get the list of URLs\n\tvar urls;\n\tif(options.url) {\n\t\turls = [options.url]\n\t} else if(options.urlFilter) {\n\t\turls = this.commander.wiki.filterTiddlers(options.urlFilter);\n\t} else {\n\t\treturn \"Missing URL\";\n\t}\n\t// Process each URL in turn\n\tvar next = 0;\n\tvar getNextFile = function(err) {\n\t\tif(err) {\n\t\t\treturn options.callback(err);\n\t\t}\n\t\tif(next < urls.length) {\n\t\t\tself.fetchFile(urls[next++],options,getNextFile);\n\t\t} else {\n\t\t\toptions.callback(null);\n\t\t}\n\t};\n\tgetNextFile(null);\n\t// Success\n\treturn null;\n};\n\nCommand.prototype.fetchFile = function(url,options,callback,redirectCount) {\n\tif(redirectCount > 10) {\n\t\treturn callback(\"Error too many redirects retrieving \" + url);\n\t}\n\tvar self = this,\n\t\tlib = url.substr(0,8) === \"https://\" ? require(\"https\") : require(\"http\");\n\tlib.get(url).on(\"response\",function(response) {\n\t    var type = (response.headers[\"content-type\"] || \"\").split(\";\")[0],\n\t    \tdata = [];\n\t    self.commander.write(\"Reading \" + url + \": \");\n\t    response.on(\"data\",function(chunk) {\n\t        data.push(chunk);\n\t        self.commander.write(\".\");\n\t    });\n\t    response.on(\"end\",function() {\n\t        self.commander.write(\"\\n\");\n\t        if(response.statusCode === 200) {\n\t\t        self.processBody(Buffer.concat(data),type,options,url);\n\t\t        callback(null);\n\t        } else {\n\t        \tif(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {\n\t        \t\treturn self.fetchFile(response.headers.location,options,callback,redirectCount + 1);\n\t        \t} else {\n\t\t        \treturn callback(\"Error \" + response.statusCode + \" retrieving \" + url)\t        \t\t\n\t        \t}\n\t        }\n\t   \t});\n\t   \tresponse.on(\"error\",function(e) {\n\t\t\tconsole.log(\"Error on GET request: \" + e);\n\t\t\tcallback(e);\n\t   \t});\n\t});\n\treturn null;\n};\n\nCommand.prototype.processBody = function(body,type,options,url) {\n\tvar self = this;\n\t// Collect the tiddlers in a wiki\n\tvar incomingWiki = new $tw.Wiki();\n\tif(options.raw) {\n\t\tvar typeInfo = type ? $tw.config.contentTypeInfo[type] : null,\n\t\t\tencoding = typeInfo ? typeInfo.encoding : \"utf8\";\n\t\tincomingWiki.addTiddler(new $tw.Tiddler({\n\t\t\ttitle: url,\n\t\t\ttype: type,\n\t\t\ttext: body.toString(encoding)\n\t\t}));\n\t} else {\n\t\t// Deserialise the file to extract the tiddlers\n\t\tvar tiddlers = this.commander.wiki.deserializeTiddlers(type || \"text/html\",body.toString(\"utf8\"),{});\n\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\tincomingWiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t});\n\t}\n\t// Filter the tiddlers to select the ones we want\n\tvar filteredTitles = incomingWiki.filterTiddlers(options.importFilter || \"[all[tiddlers]]\");\n\t// Import the selected tiddlers\n\tvar count = 0;\n\tincomingWiki.each(function(tiddler,title) {\n\t\tif(filteredTitles.indexOf(title) !== -1) {\n\t\t\tvar newTiddler;\n\t\t\tif(options.transformFilter) {\n\t\t\t\tvar transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [\"\"])[0];\n\t\t\t\tif(transformedTitle) {\n\t\t\t\t\tself.commander.log(\"Importing \" + title + \" as \" + transformedTitle)\n\t\t\t\t\tnewTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.commander.log(\"Importing \" + title)\n\t\t\t\tnewTiddler = tiddler;\n\t\t\t}\n\t\t\tself.commander.wiki.importTiddler(newTiddler);\n\t\t\tcount++;\n\t\t}\n\t});\n\tself.commander.log(\"Imported \" + count + \" tiddlers\")\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/help.js": {
            "title": "$:/core/modules/commands/help.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/help.js\ntype: application/javascript\nmodule-type: command\n\nHelp command\n\n\\*/\n(function(){\n\n/*jshint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"help\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar subhelp = this.params[0] || \"default\",\n\t\thelpBase = \"$:/language/Help/\",\n\t\ttext;\n\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\n\t\tsubhelp = \"notfound\";\n\t}\n\t// Wikify the help as formatted text (ie block elements generate newlines)\n\ttext = this.commander.wiki.renderTiddler(\"text/plain-formatted\",helpBase + subhelp);\n\t// Remove any leading linebreaks\n\ttext = text.replace(/^(\\r?\\n)*/g,\"\");\n\tthis.commander.streams.output.write(text);\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/import.js": {
            "title": "$:/core/modules/commands/import.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/import.js\ntype: application/javascript\nmodule-type: command\n\nCommand to import tiddlers from a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"import\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 2) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar filename = self.params[0],\n\t\tdeserializer = self.params[1],\n\t\ttitle = self.params[2] || filename,\n\t\tencoding = self.params[3] || \"utf8\",\n\t\ttext = fs.readFileSync(filename,encoding),\n\t\ttiddlers = this.commander.wiki.deserializeTiddlers(null,text,{title: title},{deserializer: deserializer});\n\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t});\n\tthis.commander.log(tiddlers.length + \" tiddler(s) imported\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/init.js": {
            "title": "$:/core/modules/commands/init.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/init.js\ntype: application/javascript\nmodule-type: command\n\nCommand to initialise an empty wiki folder\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"init\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\t// Check that we don't already have a valid wiki folder\n\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\n\t\treturn \"Wiki folder is not empty\";\n\t}\n\t// Loop through each of the specified editions\n\tvar editions = this.params.length > 0 ? this.params : [\"empty\"];\n\tfor(var editionIndex=0; editionIndex<editions.length; editionIndex++) {\n\t\tvar editionName = editions[editionIndex];\n\t\t// Check the edition exists\n\t\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\n\t\tif(!$tw.utils.isDirectory(editionPath)) {\n\t\t\treturn \"Edition '\" + editionName + \"' not found\";\n\t\t}\n\t\t// Copy the edition content\n\t\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\n\t\tif(!err) {\n\t\t\tthis.commander.streams.output.write(\"Copied edition '\" + editionName + \"' to \" + $tw.boot.wikiPath + \"\\n\");\n\t\t} else {\n\t\t\treturn err;\n\t\t}\n\t}\n\t// Tweak the tiddlywiki.info to remove any included wikis\n\tvar packagePath = $tw.boot.wikiPath + \"/tiddlywiki.info\",\n\t\tpackageJson = JSON.parse(fs.readFileSync(packagePath));\n\tdelete packageJson.includeWikis;\n\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/listen.js": {
            "title": "$:/core/modules/commands/listen.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/listen.js\ntype: application/javascript\nmodule-type: command\n\nListen for HTTP requests and serve tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"listen\",\n\tsynchronous: true,\n\tnamedParameterMode: true,\n\tmandatoryParameters: [],\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: self.params\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/load.js": {
            "title": "$:/core/modules/commands/load.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/load.js\ntype: application/javascript\nmodule-type: command\n\nCommand to load tiddlers from a file or directory\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"load\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar tiddlers = $tw.loadTiddlersFromPath(self.params[0]),\n\t\tcount = 0;\n\t$tw.utils.each(tiddlers,function(tiddlerInfo) {\n\t\t$tw.utils.each(tiddlerInfo.tiddlers,function(tiddler) {\n\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t\t\tcount++;\n\t\t});\n\t});\n\tif(!count && self.params[1] !== \"noerror\") {\n\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t} else {\n\t\tself.callback(null);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/makelibrary.js": {
            "title": "$:/core/modules/commands/makelibrary.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/makelibrary.js\ntype: application/javascript\nmodule-type: command\n\nCommand to pack all of the plugins in the library into a plugin tiddler of type \"library\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"makelibrary\",\n\tsynchronous: true\n};\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar wiki = this.commander.wiki,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = $tw.utils.getSubdirectories(folder) || [];\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = $tw.utils.getSubdirectories(folder) || [];\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.pluginsPath,$tw.config.pluginsEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.themesPath,$tw.config.themesEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,$tw.config.languagesEnvVar),collectPlugins);\n\t// Save the upgrade library tiddler\n\tvar pluginFields = {\n\t\ttitle: upgradeLibraryTitle,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"library\",\n\t\t\"text\": JSON.stringify({tiddlers: tiddlers})\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/output.js": {
            "title": "$:/core/modules/commands/output.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/output.js\ntype: application/javascript\nmodule-type: command\n\nCommand to set the default output location (defaults to current working directory)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"output\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing output path\";\n\t}\n\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/password.js": {
            "title": "$:/core/modules/commands/password.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/password.js\ntype: application/javascript\nmodule-type: command\n\nSave password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"password\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing password\";\n\t}\n\t$tw.crypto.setPassword(this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/render.js": {
            "title": "$:/core/modules/commands/render.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/render.js\ntype: application/javascript\nmodule-type: command\n\nRender individual tiddlers and save the results to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"render\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing tiddler filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]addsuffix[.html]]\",\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tvarName = this.params[4],\n\t\tvarValue = this.params[5],\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template || title),\n\t\t\tvariables = {currentTiddler: title};\n\t\tif(varName) {\n\t\t\tvariables[varName] = varValue || \"\";\n\t\t}\n\t\tvar widgetNode = wiki.makeWidget(parser,{variables: variables}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Rendering \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/rendertiddler.js": {
            "title": "$:/core/modules/commands/rendertiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/rendertiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render a tiddler and save it to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"rendertiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tname = this.params[4],\n\t\tvalue = this.params[5],\n\t\tvariables = {};\n\t$tw.utils.createFileDirectories(filename);\n\tif(template) {\n\t\tvariables.currentTiddler = title;\n\t\ttitle = template;\n\t}\n\tif(name && value) {\n\t\tvariables[name] = value;\n\t}\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title,{variables: variables}),\"utf8\",function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/rendertiddlers.js": {
            "title": "$:/core/modules/commands/rendertiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/rendertiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"rendertiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttemplate = this.params[1],\n\t\toutputPath = this.commander.outputPath,\n\t\tpathname = path.resolve(outputPath,this.params[2]),\t\t\n\t\ttype = this.params[3] || \"text/html\",\n\t\textension = this.params[4] || \".html\",\n\t\tdeleteDirectory = (this.params[5] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template),\n\t\t\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\texportPath = null;\n\t\tif($tw.utils.hop($tw.macros,\"tv-get-export-path\")) {\n\t\t\tvar macroPath = $tw.macros[\"tv-get-export-path\"].run.apply(self,[title]);\n\t\t\tif(macroPath) {\n\t\t\t\texportPath = path.resolve(outputPath,macroPath + extension);\n\t\t\t}\n\t\t}\n\t\tvar finalPath = exportPath || path.resolve(pathname,encodeURIComponent(title) + extension);\n\t\t$tw.utils.createFileDirectories(finalPath);\n\t\tfs.writeFileSync(finalPath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/save.js": {
            "title": "$:/core/modules/commands/save.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/save.js\ntype: application/javascript\nmodule-type: command\n\nSaves individual tiddlers in their raw text or binary format to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"save\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]]\",\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Saving \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savelibrarytiddlers.js": {
            "title": "$:/core/modules/commands/savelibrarytiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/savelibrarytiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the subtiddlers of a bundle tiddler as a series of JSON files\n\n--savelibrarytiddlers <tiddler> <tiddler-filter> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe tiddler filter specifies the plugins to be included.\n\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\n\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savelibrarytiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tcontainerTitle = this.params[0],\n\t\tfilter = this.params[1],\n\t\tbasepath = this.params[2],\n\t\tskinnyListTitle = this.params[3];\n\t// Get the container tiddler as data\n\tvar containerData = self.commander.wiki.getTiddlerDataCached(containerTitle,undefined);\n\tif(!containerData) {\n\t\treturn \"'\" + containerTitle + \"' is not a tiddler bundle\";\n\t}\n\t// Filter the list of plugins\n\tvar pluginList = [];\n\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\n\t\tpluginList.push(title);\n\t});\n\tvar filteredPluginList;\n\tif(filter) {\n\t\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\n\t} else {\n\t\tfilteredPluginList = pluginList;\n\t}\n\t// Iterate through the plugins\n\tvar skinnyList = [];\n\t$tw.utils.each(filteredPluginList,function(title) {\n\t\tvar tiddler = containerData.tiddlers[title];\n\t\t// Save each JSON file and collect the skinny data\n\t\tvar pathname = path.resolve(self.commander.outputPath,basepath + encodeURIComponent(title) + \".json\");\n\t\t$tw.utils.createFileDirectories(pathname);\n\t\tfs.writeFileSync(pathname,JSON.stringify(tiddler),\"utf8\");\n\t\t// Collect the skinny list data\n\t\tvar pluginTiddlers = JSON.parse(tiddler.text),\n\t\t\treadmeContent = (pluginTiddlers.tiddlers[title + \"/readme\"] || {}).text,\n\t\t\tdoesRequireReload = !!self.commander.wiki.doesPluginInfoRequireReload(pluginTiddlers),\n\t\t\ticonTiddler = pluginTiddlers.tiddlers[title + \"/icon\"] || {},\n\t\t\ticonType = iconTiddler.type,\n\t\t\ticonText = iconTiddler.text,\n\t\t\ticonContent;\n\t\tif(iconType && iconText) {\n\t\t\ticonContent = $tw.utils.makeDataUri(iconText,iconType);\n\t\t}\n\t\tskinnyList.push($tw.utils.extend({},tiddler,{\n\t\t\ttext: undefined,\n\t\t\treadme: readmeContent,\n\t\t\t\"requires-reload\": doesRequireReload ? \"yes\" : \"no\",\n\t\t\ticon: iconContent\n\t\t}));\n\t});\n\t// Save the catalogue tiddler\n\tif(skinnyListTitle) {\n\t\tself.commander.wiki.setTiddlerData(skinnyListTitle,skinnyList);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savetiddler.js": {
            "title": "$:/core/modules/commands/savetiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/savetiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the content of a tiddler to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savetiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddler = this.commander.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t\t$tw.utils.createFileDirectories(filename);\n\t\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\t\tself.callback(err);\n\t\t});\n\t} else {\n\t\treturn \"Missing tiddler: \" + title;\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savetiddlers.js": {
            "title": "$:/core/modules/commands/savetiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/savetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"savetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\n\t\tdeleteDirectory = (this.params[2] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilename = path.resolve(pathname,encodeURIComponent(title));\n\t\tfs.writeFileSync(filename,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/savewikifolder.js": {
            "title": "$:/core/modules/commands/savewikifolder.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/savewikifolder.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the current wiki as a wiki folder\n\n--savewikifolder <wikifolderpath> [<filter>]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savewikifolder\",\n\tsynchronous: true\n};\n\nvar fs,path;\nif($tw.node) {\n\tfs = require(\"fs\");\n\tpath = require(\"path\");\n}\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing wiki folder path\";\n\t}\n\tvar wikifoldermaker = new WikiFolderMaker(this.params[0],this.params[1],this.commander);\n\treturn wikifoldermaker.save();\n};\n\nfunction WikiFolderMaker(wikiFolderPath,wikiFilter,commander) {\n\tthis.wikiFolderPath = wikiFolderPath;\n\tthis.wikiFilter = wikiFilter || \"[all[tiddlers]]\";\n\tthis.commander = commander;\n\tthis.wiki = commander.wiki;\n\tthis.savedPaths = []; // So that we can detect filename clashes\n}\n\nWikiFolderMaker.prototype.log = function(str) {\n\tif(this.commander.verbose) {\n\t\tconsole.log(str);\n\t}\n};\n\nWikiFolderMaker.prototype.tiddlersToIgnore = [\n\t\"$:/boot/boot.css\",\n\t\"$:/boot/boot.js\",\n\t\"$:/boot/bootprefix.js\",\n\t\"$:/core\",\n\t\"$:/library/sjcl.js\",\n\t\"$:/temp/info-plugin\"\n];\n\n/*\nReturns null if successful, or an error string if there was an error\n*/\nWikiFolderMaker.prototype.save = function() {\n\tvar self = this;\n\t// Check that the output directory doesn't exist\n\tif(fs.existsSync(this.wikiFolderPath) && !$tw.utils.isDirectoryEmpty(this.wikiFolderPath)) {\n\t\treturn \"The unpackwiki command requires that the output wiki folder be empty\";\n\t}\n\t// Get the tiddlers from the source wiki\n\tvar tiddlerTitles = this.wiki.filterTiddlers(this.wikiFilter);\n\t// Initialise a new tiddlwiki.info file\n\tvar newWikiInfo = {};\n\t// Process each incoming tiddler in turn\n\t$tw.utils.each(tiddlerTitles,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tif(self.tiddlersToIgnore.indexOf(title) !== -1) {\n\t\t\t\t// Ignore the core plugin and the ephemeral info plugin\n\t\t\t\tself.log(\"Ignoring tiddler: \" + title);\n\t\t\t} else {\n\t\t\t\tvar type = tiddler.fields.type,\n\t\t\t\t\tpluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif(type === \"application/json\" && pluginType) {\n\t\t\t\t\t// Plugin tiddler\n\t\t\t\t\tvar libraryDetails = self.findPluginInLibrary(title);\n\t\t\t\t\tif(libraryDetails) {\n\t\t\t\t\t\t// A plugin from the core library\n\t\t\t\t\t\tself.log(\"Adding built-in plugin: \" + libraryDetails.name);\n\t\t\t\t\t\tnewWikiInfo[libraryDetails.type] = newWikiInfo[libraryDetails.type]  || [];\n\t\t\t\t\t\t$tw.utils.pushTop(newWikiInfo[libraryDetails.type],libraryDetails.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// A custom plugin\n\t\t\t\t\t\tself.log(\"Processing custom plugin: \" + title);\n\t\t\t\t\t\tself.saveCustomPlugin(tiddler);\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\t// Ordinary tiddler\n\t\t\t\t\tself.saveTiddler(\"tiddlers\",tiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Save the tiddlywiki.info file\n\tthis.saveJSONFile(\"tiddlywiki.info\",newWikiInfo);\n\tself.log(\"Writing tiddlywiki.info: \" + JSON.stringify(newWikiInfo,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\n/*\nTest whether the specified tiddler is a plugin in the plugin library\n*/\nWikiFolderMaker.prototype.findPluginInLibrary = function(title) {\n\tvar parts = title.split(\"/\"),\n\t\tpluginPath, type, name;\n\tif(parts[0] === \"$:\") {\n\t\tif(parts[1] === \"languages\" && parts.length === 3) {\n\t\t\tpluginPath = \"languages\" + path.sep + parts[2];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2];\n\t\t} else if(parts[1] === \"plugins\" || parts[1] === \"themes\" && parts.length === 4) {\n\t\t\tpluginPath = parts[1] + path.sep + parts[2] + path.sep + parts[3];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2] + \"/\" + parts[3];\n\t\t}\n\t}\n\tif(pluginPath && type && name) {\n\t\tpluginPath = path.resolve($tw.boot.bootPath,\"..\",pluginPath);\n\t\tif(fs.existsSync(pluginPath)) {\n\t\t\treturn {\n\t\t\t\tpluginPath: pluginPath,\n\t\t\t\ttype: type,\n\t\t\t\tname: name\n\t\t\t};\n\t\t}\n\t}\n\treturn false;\n};\n\nWikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {\n\tvar self = this,\n\t\tpluginTitle = pluginTiddler.fields.title,\n\t\ttitleParts = pluginTitle.split(\"/\"),\n\t\tdirectory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{\n\t\t\tdirectory: path.resolve(this.wikiFolderPath,pluginTiddler.fields[\"plugin-type\"] + \"s\")\n\t\t}),\n\t\tpluginInfo = pluginTiddler.getFieldStrings({exclude: [\"text\",\"type\"]});\n\tthis.saveJSONFile(directory + path.sep + \"plugin.info\",pluginInfo);\n\tself.log(\"Writing \" + directory + path.sep + \"plugin.info: \" + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces));\n\tvar pluginTiddlers = JSON.parse(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin\n\t$tw.utils.each(pluginTiddlers,function(tiddler) {\n\t\tself.saveTiddler(directory,new $tw.Tiddler(tiddler));\n\t});\n};\n\nWikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {\n\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\tdirectory: path.resolve(this.wikiFolderPath,directory),\n\t\twiki: this.wiki\n\t});\n\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\n};\n\nWikiFolderMaker.prototype.saveJSONFile = function(filename,json) {\n\tthis.saveTextFile(filename,JSON.stringify(json,null,$tw.config.preferences.jsonSpaces));\n};\n\nWikiFolderMaker.prototype.saveTextFile = function(filename,data) {\n\tthis.saveFile(filename,\"utf8\",data);\n};\n\nWikiFolderMaker.prototype.saveFile = function(filename,encoding,data) {\n\tvar filepath = path.resolve(this.wikiFolderPath,filename);\n\t$tw.utils.createFileDirectories(filepath);\n\tfs.writeFileSync(filepath,data,encoding);\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/server.js": {
            "title": "$:/core/modules/commands/server.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nDeprecated legacy command for serving tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: {\n\t\t\tport: this.params[0],\n\t\t\thost: this.params[6],\n\t\t\t\"root-tiddler\": this.params[1],\n\t\t\t\"root-render-type\": this.params[2],\n\t\t\t\"root-serve-type\": this.params[3],\n\t\t\tusername: this.params[4],\n\t\t\tpassword: this.params[5],\n\t\t\t\"path-prefix\": this.params[7],\n\t\t\t\"debug-level\": this.params[8]\n\t\t}\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/setfield.js": {
            "title": "$:/core/modules/commands/setfield.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/setfield.js\ntype: application/javascript\nmodule-type: command\n\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"setfield\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 4) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tfieldname = this.params[1] || \"text\",\n\t\ttemplatetitle = this.params[2],\n\t\trendertype = this.params[3] || \"text/plain\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(templatetitle),\n\t\t\tnewFields = {},\n\t\t\ttiddler = wiki.getTiddler(title);\n\t\tif(parser) {\n\t\t\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tnewFields[fieldname] = rendertype === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t} else {\n\t\t\tnewFields[fieldname] = undefined;\n\t\t}\n\t\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/unpackplugin.js": {
            "title": "$:/core/modules/commands/unpackplugin.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/unpackplugin.js\ntype: application/javascript\nmodule-type: command\n\nCommand to extract the shadow tiddlers from within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"unpackplugin\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing plugin name\";\n\t}\n\tvar self = this,\n\t\ttitle = this.params[0],\n\t\tpluginData = this.commander.wiki.getTiddlerDataCached(title);\n\tif(!pluginData) {\n\t\treturn \"Plugin '\" + title + \"' not found\";\n\t}\n\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\n\t\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/verbose.js": {
            "title": "$:/core/modules/commands/verbose.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/verbose.js\ntype: application/javascript\nmodule-type: command\n\nVerbose command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"verbose\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.verbose = true;\n\t// Output the boot message log\n\tthis.commander.streams.output.write(\"Boot log:\\n  \" + $tw.boot.logMessages.join(\"\\n  \") + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/commands/version.js": {
            "title": "$:/core/modules/commands/version.js",
            "text": "/*\\\ntitle: $:/core/modules/commands/version.js\ntype: application/javascript\nmodule-type: command\n\nVersion command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"version\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.streams.output.write($tw.version + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "command"
        },
        "$:/core/modules/config.js": {
            "title": "$:/core/modules/config.js",
            "text": "/*\\\ntitle: $:/core/modules/config.js\ntype: application/javascript\nmodule-type: config\n\nCore configuration constants\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.preferences = {};\n\nexports.preferences.notificationDuration = 3 * 1000;\nexports.preferences.jsonSpaces = 4;\n\nexports.textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00d6\\u00d8-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z\\u00df-\\u00f6\\u00f8-\\u00ff\\u0151\\u0171]\",\n\tanyLetter:   \"[A-Za-z0-9\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tblockPrefixLetters:\t\"[A-Za-z0-9-_\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\"\n};\n\nexports.textPrimitives.unWikiLink = \"~\";\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \"+\" +\n\texports.textPrimitives.lowerLetter + \"+\" +\n\texports.textPrimitives.upperLetter +\n\texports.textPrimitives.anyLetter + \"*\";\n\nexports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\n\nexports.htmlVoidElements = \"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\".split(\",\");\n\nexports.htmlBlockElements = \"address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video\".split(\",\");\n\nexports.htmlUnsafeElements = \"script\".split(\",\");\n\n})();\n",
            "type": "application/javascript",
            "module-type": "config"
        },
        "$:/core/modules/deserializers.js": {
            "title": "$:/core/modules/deserializers.js",
            "text": "/*\\\ntitle: $:/core/modules/deserializers.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nFunctions to deserialise tiddlers from a block of text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\n\n<div title=\"Title\" creator=\"JoeBloggs\" modifier=\"JoeBloggs\" created=\"201102111106\" modified=\"201102111310\" tags=\"myTag [[my long tag]]\">\n<pre>The text of the tiddler (without the expected HTML encoding).\n</pre>\n</div>\n\nNote that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.\n\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\n*/\nvar parseTiddlerDiv = function(text /* [,fields] */) {\n\t// Slot together the default results\n\tvar result = {};\n\tif(arguments.length > 1) {\n\t\tfor(var f=1; f<arguments.length; f++) {\n\t\t\tvar fields = arguments[f];\n\t\t\tfor(var t in fields) {\n\t\t\t\tresult[t] = fields[t];\t\t\n\t\t\t}\n\t\t}\n\t}\n\t// Parse the DIV body\n\tvar startRegExp = /^\\s*<div\\s+([^>]*)>(\\s*<pre>)?/gi,\n\t\tendRegExp,\n\t\tmatch = startRegExp.exec(text);\n\tif(match) {\n\t\t// Old-style DIVs don't have the <pre> tag\n\t\tif(match[2]) {\n\t\t\tendRegExp = /<\\/pre>\\s*<\\/div>\\s*$/gi;\n\t\t} else {\n\t\t\tendRegExp = /<\\/div>\\s*$/gi;\n\t\t}\n\t\tvar endMatch = endRegExp.exec(text);\n\t\tif(endMatch) {\n\t\t\t// Extract the text\n\t\t\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\n\t\t\t// Process the attributes\n\t\t\tvar attrRegExp = /\\s*([^=\\s]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi,\n\t\t\t\tattrMatch;\n\t\t\tdo {\n\t\t\t\tattrMatch = attrRegExp.exec(match[1]);\n\t\t\t\tif(attrMatch) {\n\t\t\t\t\tvar name = attrMatch[1];\n\t\t\t\t\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\n\t\t\t\t\tresult[name] = value;\n\t\t\t\t}\n\t\t\t} while(attrMatch);\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [parseTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar incoming,\n\t\tresults = [];\n\ttry {\n\t\tincoming = JSON.parse(text);\n\t} catch(e) {\n\t\tincoming = [{\n\t\t\ttitle: \"JSON error: \" + e,\n\t\t\ttext: \"\"\n\t\t}]\n\t}\n\tif(!$tw.utils.isArray(incoming)) {\n\t\tincoming = [incoming];\n\t}\n\tfor(var t=0; t<incoming.length; t++) {\n\t\tvar incomingFields = incoming[t],\n\t\t\tfields = {};\n\t\tfor(var f in incomingFields) {\n\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t}\n\t\t}\n\t\tresults.push(fields);\n\t}\n\treturn results;\n};\n\n/*\nParse an HTML file into tiddlers. There are three possibilities:\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\n# An ordinary HTML file\n*/\nexports[\"text/html\"] = function(text,fields) {\n\t// Check if we've got a store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tmatch = storeAreaMarkerRegExp.exec(text);\n\tif(match) {\n\t\t// If so, it's either a classic TiddlyWiki file or an unencrypted TW5 file\n\t\t// First read the normal tiddlers\n\t\tvar results = deserializeTiddlyWikiFile(text,storeAreaMarkerRegExp.lastIndex,!!match[1],fields);\n\t\t// Then any system tiddlers\n\t\tvar systemAreaMarkerRegExp = /<div id=[\"']?systemArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\t\tsysMatch = systemAreaMarkerRegExp.exec(text);\n\t\tif(sysMatch) {\n\t\t\tresults.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));\n\t\t}\n\t\treturn results;\n\t} else {\n\t\t// Check whether we've got an encrypted file\n\t\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedStoreArea) {\n\t\t\t// If so, attempt to decrypt it using the current password\n\t\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t\t} else {\n\t\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\t\treturn deserializeHtmlFile(text,fields);\n\t\t}\n\t}\n};\n\nfunction deserializeHtmlFile(text,fields) {\n\tvar result = {};\n\t$tw.utils.each(fields,function(value,name) {\n\t\tresult[name] = value;\n\t});\n\tresult.text = text;\n\tresult.type = \"text/html\";\n\treturn [result];\n}\n\nfunction deserializeTiddlyWikiFile(text,storeAreaEnd,isTiddlyWiki5,fields) {\n\tvar results = [],\n\t\tendOfDivRegExp = /(<\\/div>\\s*)/gi,\n\t\tstartPos = storeAreaEnd,\n\t\tdefaultType = isTiddlyWiki5 ? undefined : \"text/x-tiddlywiki\";\n\tendOfDivRegExp.lastIndex = startPos;\n\tvar match = endOfDivRegExp.exec(text);\n\twhile(match) {\n\t\tvar endPos = endOfDivRegExp.lastIndex,\n\t\t\ttiddlerFields = parseTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\n\t\tif(!tiddlerFields) {\n\t\t\tbreak;\n\t\t}\n\t\t$tw.utils.each(tiddlerFields,function(value,name) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\n\t\t\t}\n\t\t});\n\t\tif(tiddlerFields.text !== null) {\n\t\t\tresults.push(tiddlerFields);\n\t\t}\n\t\tstartPos = endPos;\n\t\tmatch = endOfDivRegExp.exec(text);\n\t}\n\treturn results;\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "tiddlerdeserializer"
        },
        "$:/core/modules/editor/engines/framed.js": {
            "title": "$:/core/modules/editor/engines/framed.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/engines/framed.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction FramedEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass;\n\t}\n\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create the iframe\n\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\n\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";\n\tthis.widget.domNodes.push(this.iframeNode);\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.iframeDoc.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.iframeNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\n\t}\t\n\t// Copy the styles from the dummy textarea\n\tthis.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"click\",handlerObject: this,handlerMethod: \"handleClickEvent\"},\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this.widget,handlerMethod: \"handleKeydownEvent\"},\n\t\t{name: \"focus\",handlerObject: this,handlerMethod: \"handleFocusEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.iframeDoc.body.appendChild(this.domNode);\n}\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nFramedEngine.prototype.updateDomNodeText = function(text) {\n\tthis.domNode.value = text;\n};\n\n/*\nGet the text of the engine\n*/\nFramedEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.iframeNode.style.height = (newHeight + 14) + \"px\"; // +14 for the border on the textarea\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\tthis.iframeNode.style.height = (fixedHeight + 14) + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedEngine.prototype.focus  = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a focus event\n*/\nFramedEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\t\n\t}\n};\n\n/*\nHandle a click\n*/\nFramedEngine.prototype.handleClickEvent = function(event) {\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions);\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.iframeDoc.queryCommandSupported(\"insertText\") && this.iframeDoc.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.iframeDoc.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.iframeDoc.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedEngine = FramedEngine;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/editor/engines/simple.js": {
            "title": "$:/core/modules/editor/engines/simple.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/engines/simple.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction SimpleEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.domNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode || text === \"\") {\n\t\t\tthis.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nSimpleEngine.prototype.updateDomNodeText = function(text) {\n\tthis.domNode.value = text;\n};\n\n/*\nGet the text of the engine\n*/\nSimpleEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleEngine.prototype.focus  = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions);\n\t}\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\n\t}\n\tif(this.widget.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNode,\n\t\t\ttitle: this.widget.editFocusPopup,\n\t\t\twiki: this.widget.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleEngine = SimpleEngine;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/editor/factory.js": {
            "title": "$:/core/modules/editor/factory.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/factory.js\ntype: application/javascript\nmodule-type: library\n\nFactory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\n// Configuration tiddlers\nvar HEIGHT_MODE_TITLE = \"$:/config/TextEditor/EditorHeight/Mode\";\nvar ENABLE_TOOLBAR_TITLE = \"$:/config/TextEditor/EnableToolbar\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nfunction editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {\n\n\tvar EditTextWidget = function(parseTreeNode,options) {\n\t\t// Initialise the editor operations if they've not been done already\n\t\tif(!this.editorOperations) {\n\t\t\tEditTextWidget.prototype.editorOperations = {};\n\t\t\t$tw.modules.applyMethods(\"texteditoroperation\",this.editorOperations);\n\t\t}\n\t\tthis.initialise(parseTreeNode,options);\n\t};\n\n\t/*\n\tInherit from the base widget class\n\t*/\n\tEditTextWidget.prototype = new Widget();\n\n\t/*\n\tRender this widget into the DOM\n\t*/\n\tEditTextWidget.prototype.render = function(parent,nextSibling) {\n\t\t// Save the parent dom node\n\t\tthis.parentDomNode = parent;\n\t\t// Compute our attributes\n\t\tthis.computeAttributes();\n\t\t// Execute our logic\n\t\tthis.execute();\n\t\t// Create the wrapper for the toolbar and render its content\n\t\tif(this.editShowToolbar) {\n\t\t\tthis.toolbarNode = this.document.createElement(\"div\");\n\t\t\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\t\t\tparent.insertBefore(this.toolbarNode,nextSibling);\n\t\t\tthis.renderChildren(this.toolbarNode,null);\n\t\t\tthis.domNodes.push(this.toolbarNode);\n\t\t}\n\t\t// Create our element\n\t\tvar editInfo = this.getEditInfo(),\n\t\t\tEngine = this.editShowToolbar ? toolbarEngine : nonToolbarEngine;\n\t\tthis.engine = new Engine({\n\t\t\t\twidget: this,\n\t\t\t\tvalue: editInfo.value,\n\t\t\t\ttype: editInfo.type,\n\t\t\t\tparentNode: parent,\n\t\t\t\tnextSibling: nextSibling\n\t\t\t});\n\t\t// Call the postRender hook\n\t\tif(this.postRender) {\n\t\t\tthis.postRender();\n\t\t}\n\t\t// Fix height\n\t\tthis.engine.fixHeight();\n\t\t// Focus if required\n\t\tif(this.editFocus === \"true\" || this.editFocus === \"yes\") {\n\t\t\tthis.engine.focus();\n\t\t}\n\t\t// Add widget message listeners\n\t\tthis.addEventListeners([\n\t\t\t{type: \"tm-edit-text-operation\", handler: \"handleEditTextOperationMessage\"}\n\t\t]);\n\t};\n\n\t/*\n\tGet the tiddler being edited and current value\n\t*/\n\tEditTextWidget.prototype.getEditInfo = function() {\n\t\t// Get the edit value\n\t\tvar self = this,\n\t\t\tvalue,\n\t\t\ttype = \"text/plain\",\n\t\t\tupdate;\n\t\tif(this.editIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\t\tupdate = function(value) {\n\t\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\t// Get the current tiddler and the field name\n\t\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\t\tif(tiddler) {\n\t\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t\t\tif(this.editField === \"text\") {\n\t\t\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\t\tswitch(this.editField) {\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\t\ttype = \"text/vnd.tiddlywiki\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"title\":\n\t\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\t\tvalue = this.editDefault;\n\t\t\t\t}\n\t\t\t}\n\t\t\tupdate = function(value) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\t\tupdateFields = {\n\t\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t\t};\n\t\t\t\tupdateFields[self.editField] = value;\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t\t};\n\t\t}\n\t\tif(this.editType) {\n\t\t\ttype = this.editType;\n\t\t}\n\t\treturn {value: value || \"\", type: type, update: update};\n\t};\n\n\t/*\n\tHandle an edit text operation message from the toolbar\n\t*/\n\tEditTextWidget.prototype.handleEditTextOperationMessage = function(event) {\n\t\t// Prepare information about the operation\n\t\tvar operation = this.engine.createTextOperation();\n\t\t// Invoke the handler for the selected operation\n\t\tvar handler = this.editorOperations[event.param];\n\t\tif(handler) {\n\t\t\thandler.call(this,event,operation);\n\t\t}\n\t\t// Execute the operation via the engine\n\t\tvar newText = this.engine.executeTextOperation(operation);\n\t\t// Fix the tiddler height and save changes\n\t\tthis.engine.fixHeight();\n\t\tthis.saveChanges(newText);\n\t};\n\n\t/*\n\tCompute the internal state of the widget\n\t*/\n\tEditTextWidget.prototype.execute = function() {\n\t\t// Get our parameters\n\t\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.editField = this.getAttribute(\"field\",\"text\");\n\t\tthis.editIndex = this.getAttribute(\"index\");\n\t\tthis.editDefault = this.getAttribute(\"default\");\n\t\tthis.editClass = this.getAttribute(\"class\");\n\t\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t\tthis.editSize = this.getAttribute(\"size\");\n\t\tthis.editRows = this.getAttribute(\"rows\");\n\t\tthis.editAutoHeight = this.wiki.getTiddlerText(HEIGHT_MODE_TITLE,\"auto\");\n\t\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",this.editAutoHeight === \"auto\" ? \"yes\" : \"no\") === \"yes\";\n\t\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\t\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\t\tthis.editFocus = this.getAttribute(\"focus\");\n\t\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\t\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\") === \"yes\";\n\t\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\t\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\t\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\n\t\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t\t// Get the default editor element tag and type\n\t\tvar tag,type;\n\t\tif(this.editField === \"text\") {\n\t\t\ttag = \"textarea\";\n\t\t} else {\n\t\t\ttag = \"input\";\n\t\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\t\ttag = fieldModule.editTag;\n\t\t\t}\n\t\t\tif(fieldModule && fieldModule.editType) {\n\t\t\t\ttype = fieldModule.editType;\n\t\t\t}\n\t\t\ttype = type || \"text\";\n\t\t}\n\t\t// Get the rest of our parameters\n\t\tthis.editTag = this.getAttribute(\"tag\",tag) || \"input\";\n\t\tthis.editType = this.getAttribute(\"type\",type);\n\t\t// Make the child widgets\n\t\tthis.makeChildWidgets();\n\t\t// Determine whether to show the toolbar\n\t\tthis.editShowToolbar = this.wiki.getTiddlerText(ENABLE_TOOLBAR_TITLE,\"yes\");\n\t\tthis.editShowToolbar = (this.editShowToolbar === \"yes\") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);\n\t};\n\n\t/*\n\tSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n\t*/\n\tEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\t\tvar changedAttributes = this.computeAttributes();\n\t\t// Completely rerender if any of our attributes have changed\n\t\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup ||  changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedAttributes.disabled) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t\t} else if (changedTiddlers[this.editRefreshTitle]) {\n\t\t\tthis.engine.updateDomNodeText(this.getEditInfo().value);\n\t\t} else if(changedTiddlers[this.editTitle]) {\n\t\t\tvar editInfo = this.getEditInfo();\n\t\t\tthis.updateEditor(editInfo.value,editInfo.type);\n\t\t}\n\t\tthis.engine.fixHeight();\n\t\tif(this.editShowToolbar) {\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/*\n\tUpdate the editor with new text. This method is separate from updateEditorDomNode()\n\tso that subclasses can override updateEditor() and still use updateEditorDomNode()\n\t*/\n\tEditTextWidget.prototype.updateEditor = function(text,type) {\n\t\tthis.updateEditorDomNode(text,type);\n\t};\n\n\t/*\n\tUpdate the editor dom node with new text\n\t*/\n\tEditTextWidget.prototype.updateEditorDomNode = function(text,type) {\n\t\tthis.engine.setText(text,type);\n\t};\n\n\t/*\n\tSave changes back to the tiddler store\n\t*/\n\tEditTextWidget.prototype.saveChanges = function(text) {\n\t\tvar editInfo = this.getEditInfo();\n\t\tif(text !== editInfo.value) {\n\t\t\teditInfo.update(text);\n\t\t}\n\t};\n\n\t/*\n\tHandle a dom \"keydown\" event, which we'll bubble up to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.handleKeydownEvent = function(event) {\n\t\t// Check for a keyboard shortcut\n\t\tif(this.toolbarNode) {\n\t\t\tvar shortcutElements = this.toolbarNode.querySelectorAll(\"[data-tw-keyboard-shortcut]\");\n\t\t\tfor(var index=0; index<shortcutElements.length; index++) {\n\t\t\t\tvar el = shortcutElements[index],\n\t\t\t\t\tshortcutData = el.getAttribute(\"data-tw-keyboard-shortcut\"),\n\t\t\t\t\tkeyInfoArray = $tw.keyboardManager.parseKeyDescriptors(shortcutData,{\n\t\t\t\t\t\twiki: this.wiki\n\t\t\t\t\t});\n\t\t\t\tif($tw.keyboardManager.checkKeyDescriptors(event,keyInfoArray)) {\n\t\t\t\t\tvar clickEvent = this.document.createEvent(\"Events\");\n\t\t\t\t    clickEvent.initEvent(\"click\",true,false);\n\t\t\t\t    el.dispatchEvent(clickEvent);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Propogate the event to the container\n\t\tif(this.propogateKeydownEvent(event)) {\n\t\t\t// Ignore the keydown if it was already handled\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise, process the keydown normally\n\t\treturn false;\n\t};\n\n\t/*\n\tPropogate keydown events to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.propogateKeydownEvent = function(event) {\n\t\tvar newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent(\"Events\");\n\t\tif(newEvent.initEvent) {\n\t\t\tnewEvent.initEvent(\"keydown\", true, true);\n\t\t}\n\t\tnewEvent.keyCode = event.keyCode;\n\t\tnewEvent.which = event.which;\n\t\tnewEvent.metaKey = event.metaKey;\n\t\tnewEvent.ctrlKey = event.ctrlKey;\n\t\tnewEvent.altKey = event.altKey;\n\t\tnewEvent.shiftKey = event.shiftKey;\n\t\treturn !this.parentDomNode.dispatchEvent(newEvent);\n\t};\n\n\treturn EditTextWidget;\n\n}\n\nexports.editTextWidgetFactory = editTextWidgetFactory;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/editor/operations/bitmap/clear.js": {
            "title": "$:/core/modules/editor/operations/bitmap/clear.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/clear.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to clear the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"clear\"] = function(event) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.globalAlpha = 1;\n\tctx.fillStyle = event.paramObject.colour || \"white\";\n\tctx.fillRect(0,0,this.canvasDomNode.width,this.canvasDomNode.height);\n\t// Save changes\n\tthis.strokeEnd();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "bitmapeditoroperation"
        },
        "$:/core/modules/editor/operations/bitmap/resize.js": {
            "title": "$:/core/modules/editor/operations/bitmap/resize.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/resize.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to resize the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"resize\"] = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(event.paramObject.width || this.canvasDomNode.width,10),\n\t\tnewHeight = parseInt(event.paramObject.height || this.canvasDomNode.height,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newHeight > 0 && !(newWidth === this.currCanvas.width && newHeight === this.currCanvas.height)) {\n\t\tthis.changeCanvasSize(newWidth,newHeight);\n\t}\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "bitmapeditoroperation"
        },
        "$:/core/modules/editor/operations/bitmap/rotate-left.js": {
            "title": "$:/core/modules/editor/operations/bitmap/rotate-left.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/rotate-left.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to rotate the image left by 90 degrees\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"rotate-left\"] = function(event) {\n\t// Rotate the canvas left by 90 degrees\n\tthis.rotateCanvasLeft();\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "bitmapeditoroperation"
        },
        "$:/core/modules/editor/operations/text/excise.js": {
            "title": "$:/core/modules/editor/operations/text/excise.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/excise.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to excise the selection to a new tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"excise\"] = function(event,operation) {\n\tvar editTiddler = this.wiki.getTiddler(this.editTitle),\n\t\teditTiddlerTitle = this.editTitle;\n\tif(editTiddler && editTiddler.fields[\"draft.of\"]) {\n\t\teditTiddlerTitle = editTiddler.fields[\"draft.of\"];\n\t}\n\tvar excisionTitle = event.paramObject.title || this.wiki.generateNewTitle(\"New Excision\");\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\tthis.wiki.getModificationFields(),\n\t\t{\n\t\t\ttitle: excisionTitle,\n\t\t\ttext: operation.selection,\n\t\t\ttags: event.paramObject.tagnew === \"yes\" ?  [editTiddlerTitle] : []\n\t\t}\n\t));\n\toperation.replacement = excisionTitle;\n\tswitch(event.paramObject.type || \"transclude\") {\n\t\tcase \"transclude\":\n\t\t\toperation.replacement = \"{{\" + operation.replacement+ \"}}\";\n\t\t\tbreak;\n\t\tcase \"link\":\n\t\t\toperation.replacement = \"[[\" + operation.replacement+ \"]]\";\n\t\t\tbreak;\n\t\tcase \"macro\":\n\t\t\toperation.replacement = \"<<\" + (event.paramObject.macro || \"translink\") + \" \\\"\\\"\\\"\" + operation.replacement + \"\\\"\\\"\\\">>\";\n\t\t\tbreak;\n\t}\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/make-link.js": {
            "title": "$:/core/modules/editor/operations/text/make-link.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/make-link.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to make a link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"make-link\"] = function(event,operation) {\n\tif(operation.selection) {\n\t\toperation.replacement = \"[[\" + operation.selection + \"|\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t} else {\n\t\toperation.replacement = \"[[\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t}\n\toperation.newSelStart = operation.selStart + operation.replacement.length;\n\toperation.newSelEnd = operation.newSelStart;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/prefix-lines.js": {
            "title": "$:/core/modules/editor/operations/text/prefix-lines.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/prefix-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to add a prefix to the selected lines\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"prefix-lines\"] = function(event,operation) {\n\tvar targetCount = parseInt(event.paramObject.count + \"\",10);\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Compose the required prefix\n\tvar prefix = $tw.utils.repeat(event.paramObject.character,targetCount);\n\t// Process each line\n\tvar lines = operation.text.substring(operation.cutStart,operation.cutEnd).split(/\\r?\\n/mg);\n\t$tw.utils.each(lines,function(line,index) {\n\t\t// Remove and count any existing prefix characters\n\t\tvar count = 0;\n\t\twhile(line.charAt(0) === event.paramObject.character) {\n\t\t\tline = line.substring(1);\n\t\t\tcount++;\n\t\t}\n\t\t// Remove any whitespace\n\t\twhile(line.charAt(0) === \" \") {\n\t\t\tline = line.substring(1);\n\t\t}\n\t\t// We're done if we removed the exact required prefix, otherwise add it\n\t\tif(count !== targetCount) {\n\t\t\t// Apply the prefix\n\t\t\tline =  prefix + \" \" + line;\n\t\t}\n\t\t// Save the modified line\n\t\tlines[index] = line;\n\t});\n\t// Stitch the replacement text together and set the selection\n\toperation.replacement = lines.join(\"\\n\");\n\tif(lines.length === 1) {\n\t\toperation.newSelStart = operation.cutStart + operation.replacement.length;\n\t\toperation.newSelEnd = operation.newSelStart;\n\t} else {\n\t\toperation.newSelStart = operation.cutStart;\n\t\toperation.newSelEnd = operation.newSelStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/replace-all.js": {
            "title": "$:/core/modules/editor/operations/text/replace-all.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-all.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the entire text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-all\"] = function(event,operation) {\n\toperation.cutStart = 0;\n\toperation.cutEnd = operation.text.length;\n\toperation.replacement = event.paramObject.text;\n\toperation.newSelStart = 0;\n\toperation.newSelEnd = operation.replacement.length;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/replace-selection.js": {
            "title": "$:/core/modules/editor/operations/text/replace-selection.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the selection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-selection\"] = function(event,operation) {\n\toperation.replacement = event.paramObject.text;\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/save-selection.js": {
            "title": "$:/core/modules/editor/operations/text/save-selection.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/save-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to save the current selection in a specified tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"save-selection\"] = function(event,operation) {\n\tvar tiddler = event.paramObject.tiddler,\n\t\tfield = event.paramObject.field || \"text\";\n\tif(tiddler && field) {\n\t\tthis.wiki.setText(tiddler,field,null,operation.text.substring(operation.selStart,operation.selEnd));\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/wrap-lines.js": {
            "title": "$:/core/modules/editor/operations/text/wrap-lines.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selected lines with a prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-lines\"] = function(event,operation) {\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Add the prefix and suffix\n\toperation.replacement = event.paramObject.prefix + \"\\n\" +\n\t\t\t\toperation.text.substring(operation.cutStart,operation.cutEnd) + \"\\n\" +\n\t\t\t\tevent.paramObject.suffix + \"\\n\";\n\toperation.newSelStart = operation.cutStart + event.paramObject.prefix.length + 1;\n\toperation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/editor/operations/text/wrap-selection.js": {
            "title": "$:/core/modules/editor/operations/text/wrap-selection.js",
            "text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selection with the specified prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-selection\"] = function(event,operation) {\n\tif(operation.selStart === operation.selEnd) {\n\t\t// No selection; check if we're within the prefix/suffix\n\t\tif(operation.text.substring(operation.selStart - event.paramObject.prefix.length,operation.selStart + event.paramObject.suffix.length) === event.paramObject.prefix + event.paramObject.suffix) {\n\t\t\t// Remove the prefix and suffix\n\t\t\toperation.cutStart = operation.selStart - event.paramObject.prefix.length;\n\t\t\toperation.cutEnd = operation.selEnd + event.paramObject.suffix.length;\n\t\t\toperation.replacement = \"\";\n\t\t\toperation.newSelStart = operation.cutStart;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t} else {\n\t\t\t// Wrap the cursor instead\n\t\t\toperation.cutStart = operation.selStart;\n\t\t\toperation.cutEnd = operation.selEnd;\n\t\t\toperation.replacement = event.paramObject.prefix + event.paramObject.suffix;\n\t\t\toperation.newSelStart = operation.selStart + event.paramObject.prefix.length;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t}\n\t} else if(operation.text.substring(operation.selStart,operation.selStart + event.paramObject.prefix.length) === event.paramObject.prefix && operation.text.substring(operation.selEnd - event.paramObject.suffix.length,operation.selEnd) === event.paramObject.suffix) {\n\t\t// Prefix and suffix are already present, so remove them\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = operation.selection.substring(event.paramObject.prefix.length,operation.selection.length - event.paramObject.suffix.length);\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t} else {\n\t\t// Add the prefix and suffix\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = event.paramObject.prefix + operation.selection + event.paramObject.suffix;\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "texteditoroperation"
        },
        "$:/core/modules/filterrunprefixes/all.js": {
            "title": "$:/core/modules/filterrunprefixes/all.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/all.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nUnion of sets without de-duplication.\nEquivalent to = filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.all = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.push.apply(results, operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/and.js": {
            "title": "$:/core/modules/filterrunprefixes/and.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/and.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nIntersection of sets.\nEquivalent to + filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.and = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\tsource = options.wiki.makeTiddlerIterator(results.toArray());\n\t\tresults.clear();\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/else.js": {
            "title": "$:/core/modules/filterrunprefixes/else.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/else.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to ~ filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.else = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length === 0) {\n\t\t\t// Main result so far is empty\n\t\t\tresults.pushTop(operationSubFunction(source,widget));\n\t\t}\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/except.js": {
            "title": "$:/core/modules/filterrunprefixes/except.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/except.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nDifference of sets.\nEquivalent to - filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.except = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.remove(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/filter.js": {
            "title": "$:/core/modules/filterrunprefixes/filter.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/filter.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.filter = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar resultsToRemove = [];\n\t\t\tresults.each(function(result) {\n\t\t\t\tvar filtered = operationSubFunction(options.wiki.makeTiddlerIterator([result]),widget);\n\t\t\t\tif(filtered.length === 0) {\n\t\t\t\t\tresultsToRemove.push(result);\n\t\t\t\t}\n\t\t\t});\n\t\t\tresults.remove(resultsToRemove);\n\t\t}\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/intersection.js": {
            "title": "$:/core/modules/filterrunprefixes/intersection.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/intersection.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.intersection = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length !== 0) {\n\t\t\tvar secondRunResults = operationSubFunction(source,widget);\n\t\t\tvar firstRunResults = results.toArray();\n\t\t\tresults.clear();\n\t\t\t$tw.utils.each(firstRunResults,function(title) {\n\t\t\t\tif(secondRunResults.indexOf(title) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/or.js": {
            "title": "$:/core/modules/filterrunprefixes/or.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/or.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to a filter run with no prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.or = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filterrunprefixes/reduce.js": {
            "title": "$:/core/modules/filterrunprefixes/reduce.js",
            "text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/reduce.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.reduce = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar accumulator = \"\";\n\t\t\tvar index = 0;\n\t\t\tresults.each(function(title) {\n\t\t\t\tvar list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{\n\t\t\t\t\t\tgetVariable: function(name) {\n\t\t\t\t\t\t\tswitch(name) {\n\t\t\t\t\t\t\t\tcase \"currentTiddler\":\n\t\t\t\t\t\t\t\t\treturn \"\" + title;\n\t\t\t\t\t\t\t\tcase \"accumulator\":\n\t\t\t\t\t\t\t\t\treturn \"\" + accumulator;\n\t\t\t\t\t\t\t\tcase \"index\":\n\t\t\t\t\t\t\t\t\treturn \"\" + index;\n\t\t\t\t\t\t\t\tcase \"revIndex\":\n\t\t\t\t\t\t\t\t\treturn \"\" +  (results.length - 1 - index);\n\t\t\t\t\t\t\t\tcase \"length\":\n\t\t\t\t\t\t\t\t\treturn \"\" + results.length;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\treturn widget.getVariable(name);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\tif(list.length > 0) {\n\t\t\t\t\taccumulator = \"\" + list[0];\n\t\t\t\t}\n\t\t\t\t++index;\n\t\t\t});\n\t\t\tresults.clear();\n\t\t\tresults.push(accumulator);\t\n\t\t}\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filterrunprefix"
        },
        "$:/core/modules/filters/addprefix.js": {
            "title": "$:/core/modules/filters/addprefix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/addprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a prefix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand + title);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/addsuffix.js": {
            "title": "$:/core/modules/filters/addsuffix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/addsuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a suffix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addsuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title + operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/after.js": {
            "title": "$:/core/modules/filters/after.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/after.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.after = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index === -1 || index > (results.length - 2)) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index + 1]];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/all/current.js": {
            "title": "$:/core/modules/filters/all/current.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/current.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(currTiddlerTitle) {\n\t\treturn [currTiddlerTitle];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/missing.js": {
            "title": "$:/core/modules/filters/all/missing.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/missing.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\treturn options.wiki.getMissingTitles();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/orphans.js": {
            "title": "$:/core/modules/filters/all/orphans.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/orphans.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[orphans]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphans = function(source,prefix,options) {\n\treturn options.wiki.getOrphanTitles();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/shadows.js": {
            "title": "$:/core/modules/filters/all/shadows.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/shadows.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[shadows]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadows = function(source,prefix,options) {\n\treturn options.wiki.allShadowTitles();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/tags.js": {
            "title": "$:/core/modules/filters/all/tags.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/tags.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tags]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,prefix,options) {\n\treturn Object.keys(options.wiki.getTagMap());\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all/tiddlers.js": {
            "title": "$:/core/modules/filters/all/tiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all/tiddlers.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddlers = function(source,prefix,options) {\n\treturn options.wiki.allTitles();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "allfilteroperator"
        },
        "$:/core/modules/filters/all.js": {
            "title": "$:/core/modules/filters/all.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/all.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for selecting tiddlers\n\n[all[shadows+tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar allFilterOperators;\n\nfunction getAllFilterOperators() {\n\tif(!allFilterOperators) {\n\t\tallFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"allfilteroperator\",allFilterOperators);\n\t}\n\treturn allFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.all = function(source,operator,options) {\n\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = [],\n\t\tsubops = operator.operand.split(\"+\");\n\t// Check for common optimisations\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\t$tw.utils.pushTop(results,subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/backlinks.js": {
            "title": "$:/core/modules/filters/backlinks.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/backlinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.backlinks = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/before.js": {
            "title": "$:/core/modules/filters/before.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/before.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.before = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index <= 0) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index - 1]];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/commands.js": {
            "title": "$:/core/modules/filters/commands.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/commands.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the commands available in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.commands = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.commands,function(commandInfo,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/compare.js": {
            "title": "$:/core/modules/filters/compare.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/compare.js\ntype: application/javascript\nmodule-type: filteroperator\n\nGeneral purpose comparison operator\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.compare = function(source,operator,options) {\n\tvar suffixes = operator.suffixes || [],\n\t\ttype = (suffixes[0] || [])[0],\n\t\tmode = (suffixes[1] || [])[0],\n\t\ttypeFn = $tw.utils.makeCompareFunction(type,{defaultType: \"number\"}),\n\t\tmodeFn = modes[mode] || modes.eq,\n\t\tinvert = operator.prefix === \"!\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tif(modeFn(typeFn(title,operator.operand)) !== invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nvar modes = {\n\t\"eq\": function(value) {return value === 0;},\n\t\"ne\": function(value) {return value !== 0;},\n\t\"gteq\": function(value) {return value >= 0;},\n\t\"gt\": function(value) {return value > 0;},\n\t\"lteq\": function(value) {return value <= 0;},\n\t\"lt\": function(value) {return value < 0;}\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/contains.js": {
            "title": "$:/core/modules/filters/contains.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/contains.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for finding values in array fields\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.contains = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"list\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/count.js": {
            "title": "$:/core/modules/filters/count.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/count.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the number of entries in the current list.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.count = function(source,operator,options) {\n\tvar count = 0;\n\tsource(function(tiddler,title) {\n\t\tcount++;\n\t});\n\treturn [count + \"\"];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/days.js": {
            "title": "$:/core/modules/filters/days.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/days.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a specified date field within a specified date interval.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.days = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\tdayInterval = (parseInt(operator.operand,10)||0),\n\t\tdayIntervalSign = $tw.utils.sign(dayInterval),\n\t\ttargetTimeStamp = (new Date()).setHours(0,0,0,0) + 1000*60*60*24*dayInterval,\n\t\tisWithinDays = function(dateField) {\n\t\t\tvar sign = $tw.utils.sign(targetTimeStamp - (new Date(dateField)).setHours(0,0,0,0));\n\t\t\treturn sign === 0 || sign === dayIntervalSign;\n\t\t};\n\n\tif(operator.prefix === \"!\") {\n\t\ttargetTimeStamp = targetTimeStamp - 1000*60*60*24*dayIntervalSign;\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(!isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/duplicateslugs.js": {
            "title": "$:/core/modules/filters/duplicateslugs.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/duplicateslugs.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter function for [duplicateslugs[]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.duplicateslugs = function(source,operator,options) {\n\tvar slugs = Object.create(null), // Hashmap by slug of title, replaced with \"true\" if the duplicate title has already been output\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tvar slug = options.wiki.slugify(title);\n\t\tif(slug in slugs) {\n\t\t\tif(slugs[slug] !== true) {\n\t\t\t\tresults.push(slugs[slug]);\n\t\t\t\tslugs[slug] = true;\n\t\t\t}\n\t\t\tresults.push(title);\n\t\t} else {\n\t\t\tslugs[slug] = title;\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/each.js": {
            "title": "$:/core/modules/filters/each.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/each.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique value of the specified field.\nWith suffix \"list\", selects all tiddlers that are values in a specified list field.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.each = function(source,operator,options) {\n\tvar results =[] ,\n\tvalue,values = {},\n\tfield = operator.operand || \"title\";\n\tif(operator.suffix === \"value\" && field === \"title\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(values,title)) {\n\t\t\t\tvalues[title] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else if(operator.suffix !== \"list-item\") {\n\t\tif(field === \"title\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && !$tw.utils.hop(values,title)) {\n\t\t\t\t\tvalues[title] = true;\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvalue = tiddler.getFieldString(field);\n\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\t$tw.utils.each(\n\t\t\t\t\toptions.wiki.getTiddlerList(title,field),\n\t\t\t\t\tfunction(value) {\n\t\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\t\tresults.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/eachday.js": {
            "title": "$:/core/modules/filters/eachday.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/eachday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique day covered by the specified date field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.eachday = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = [],\n\t\tfieldName = operator.operand || \"modified\";\n\t// Function to convert a date/time to a date integer\n\tvar toDate = function(value) {\n\t\tvalue = (new Date(value)).setHours(0,0,0,0);\n\t\treturn value+0;\n\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tvar value = toDate($tw.utils.parseDate(tiddler.fields[fieldName]));\n\t\t\tif(values.indexOf(value) === -1) {\n\t\t\t\tvalues.push(value);\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/editiondescription.js": {
            "title": "$:/core/modules/filters/editiondescription.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/editiondescription.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the descriptions of the specified edition names\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editiondescription = function(source,operator,options) {\n\tvar results = [];\n\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\t\tresults.push(editionInfo[title].description || \"\");\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/editions.js": {
            "title": "$:/core/modules/filters/editions.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/editions.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the available editions in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editions = function(source,operator,options) {\n\tvar results = [];\n\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\t\tresults.push(name);\n\t\t\t});\n\t\t}\n\t\tresults.sort();\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/else.js": {
            "title": "$:/core/modules/filters/else.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/else.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing an empty input list with a constant, passing a non-empty input list straight through\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.else = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tif(results.length === 0) {\n\t\treturn [operator.operand];\n\t} else {\n\t\treturn results;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/decodeuricomponent.js": {
            "title": "$:/core/modules/filters/decodeuricomponent.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/decodeuricomponent.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for applying decodeURIComponent() to each item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter functions\n*/\n\nexports.decodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURIComponent(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURIComponent(title));\n\t});\n\treturn results;\n};\n\nexports.decodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURI(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURI(title));\n\t});\n\treturn results;\n};\n\nexports.decodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlDecode(title));\n\t});\n\treturn results;\n};\n\nexports.encodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlEncode(title));\n\t});\n\treturn results;\n};\n\nexports.stringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.stringify(title,(operator.suffix === \"rawunicode\")));\n\t});\n\treturn results;\n};\n\nexports.jsonstringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.jsonStringify(title,(operator.suffix === \"rawunicode\")));\n\t});\n\treturn results;\n};\n\nexports.escaperegexp = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.escapeRegExp(title));\n\t});\n\treturn results;\n};\n\nexports.escapecss = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t// escape any character with a special meaning in CSS using CSS.escape()\n\t\tresults.push(CSS.escape(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/enlist.js": {
            "title": "$:/core/modules/filters/enlist.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/enlist.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand parsed as a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.enlist = function(source,operator,options) {\n\tvar allowDuplicates = false;\n\tswitch(operator.suffix) {\n\t\tcase \"raw\":\n\t\t\tallowDuplicates = true;\n\t\t\tbreak;\n\t\tcase \"dedupe\":\n\t\t\tallowDuplicates = false;\n\t\t\tbreak;\n\t}\n\tvar list = $tw.utils.parseStringArray(operator.operand,allowDuplicates);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/field.js": {
            "title": "$:/core/modules/filters/field.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/field.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.field = function(source,operator,options) {\n\tvar results = [],indexedResults,\n\t\tfieldname = (operator.suffix || operator.operator || \"title\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text !== operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !!operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif(source.byField && operator.operand) {\n\t\t\t\tindexedResults = source.byField(fieldname,operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults\n\t\t\t\t}\n\t\t\t}\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text === operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/fields.js": {
            "title": "$:/core/modules/filters/fields.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/fields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.fields = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName,\n\t\tsuffixes = (operator.suffixes || [])[0] || [],\n\t\toperand = $tw.utils.parseStringArray(operator.operand);\n\t\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(suffixes.indexOf(\"include\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? $tw.utils.pushTop(results,fieldName) : \"\";\n\t\t\t\t}\n\t\t\t} else if (suffixes.indexOf(\"exclude\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? \"\" : $tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else if\n\t\t\telse {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else\n\t\t} // if (tiddler)\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/filter.js": {
            "title": "$:/core/modules/filters/filter.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/filter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning those input titles that pass a subfilter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.filter = function(source,operator,options) {\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\tresults = [],\n\t\ttarget = operator.prefix !== \"!\";\n\tsource(function(tiddler,title) {\n\t\tvar list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]));\n\t\tif((list.length > 0) === target) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/format/date.js": {
            "title": "$:/core/modules/filters/format/date.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/format/date.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.date = function(source,operand,options) {\n\tvar results = [];\t\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.formatDateString(value,operand || \"YYYY MM DD 0hh:0mm\"));\n\t\t}\n\t});\t\n\treturn results;\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "formatfilteroperator"
        },
        "$:/core/modules/filters/format/relativedate.js": {
            "title": "$:/core/modules/filters/format/relativedate.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/format/relativedate.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.relativedate = function(source,operand,options) {\n\tvar results = [];\t\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.getRelativeDate((new Date()) - (new Date(value))).description);\n\t\t}\n\t});\t\n\treturn results;\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "formatfilteroperator"
        },
        "$:/core/modules/filters/format.js": {
            "title": "$:/core/modules/filters/format.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/format.js\ntype: application/javascript\nmodule-type: filteroperator\nFilter operator for formatting strings\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar formatFilterOperators;\n\nfunction getFormatFilterOperators() {\n\tif(!formatFilterOperators) {\n\t\tformatFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"formatfilteroperator\",formatFilterOperators);\n\t}\n\treturn formatFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.format = function(source,operator,options) {\n\t// Dispatch to the correct formatfilteroperator\n\tvar formatFilterOperators = getFormatFilterOperators();\n\tif(operator.suffix) {\n\t\tvar formatFilterOperator = formatFilterOperators[operator.suffix];\n\t\tif(formatFilterOperator) {\n\t\t\treturn formatFilterOperator(source,operator.operand,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/FormatFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all unchanged if the suffix is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/get.js": {
            "title": "$:/core/modules/filters/get.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/get.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.get = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value = tiddler.getFieldString(operator.operand);\n\t\t\tif(value) {\n\t\t\t\tresults.push(value);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/getindex.js": {
            "title": "$:/core/modules/filters/getindex.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/getindex.js\ntype: application/javascript\nmodule-type: filteroperator\n\nreturns the value at a given index of datatiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getindex = function(source,operator,options) {\n\tvar data,title,results = [];\n\tif(operator.operand){\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = tiddler ? tiddler.fields.title : title;\n\t\t\tdata = options.wiki.extractTiddlerDataItem(tiddler,operator.operand);\n\t\t\tif(data) {\n\t\t\t\tresults.push(data);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/getvariable.js": {
            "title": "$:/core/modules/filters/getvariable.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/getvariable.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing input values by the value of the variable with the same name, or blank if the variable is missing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getvariable = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.widget.getVariable(title) || \"\");\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/has.js": {
            "title": "$:/core/modules/filters/has.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/has.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a tiddler has the specified field or index\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.has = function(source,operator,options) {\n\tvar results = [],\n\t\tinvert = operator.prefix === \"!\";\n\n\tif(operator.suffix === \"field\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse if(operator.suffix === \"index\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand].length === 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && (tiddler.fields[operator.operand].length !== 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\t\t\t\t\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/haschanged.js": {
            "title": "$:/core/modules/filters/haschanged.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/haschanged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returns tiddlers from the list that have a non-zero changecount.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.haschanged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) === 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) > 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/indexes.js": {
            "title": "$:/core/modules/filters/indexes.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/indexes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the indexes of a data tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.indexes = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = options.wiki.getTiddlerDataCached(title);\n\t\tif(data) {\n\t\t\t$tw.utils.pushTop(results,Object.keys(data));\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/insertbefore.js": {
            "title": "$:/core/modules/filters/insertbefore.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/insertbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nInsert an item before another item in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.insertbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar target = options.widget && options.widget.getVariable(operator.suffix || \"currentTiddler\");\n\tif(target !== operator.operand) {\n\t\t// Remove the entry from the list if it is present\n\t\tvar pos = results.indexOf(operator.operand);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,1);\n\t\t}\n\t\t// Insert the entry before the target marker\n\t\tpos = results.indexOf(target);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,0,operator.operand);\n\t\t} else {\n\t\t\tresults.push(operator.operand);\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/is/binary.js": {
            "title": "$:/core/modules/filters/is/binary.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/binary.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[binary]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.binary = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/blank.js": {
            "title": "$:/core/modules/filters/is/blank.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/blank.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[blank]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.blank = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/current.js": {
            "title": "$:/core/modules/filters/is/current.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/current.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar results = [],\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title !== currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title === currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/draft.js": {
            "title": "$:/core/modules/filters/is/draft.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/draft.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[draft]] analagous to [has[draft.of]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.draft = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,\"draft.of\")) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,\"draft.of\") && (tiddler.fields[\"draft.of\"].length !== 0)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\t\t\t\t\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/image.js": {
            "title": "$:/core/modules/filters/is/image.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/image.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[image]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.image = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/missing.js": {
            "title": "$:/core/modules/filters/is/missing.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/missing.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/orphan.js": {
            "title": "$:/core/modules/filters/is/orphan.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/orphan.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[orphan]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphan = function(source,prefix,options) {\n\tvar results = [],\n\t\torphanTitles = options.wiki.getOrphanTitles();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) !== -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/shadow.js": {
            "title": "$:/core/modules/filters/is/shadow.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/shadow.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[shadow]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadow = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/system.js": {
            "title": "$:/core/modules/filters/is/system.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/system.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[system]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.system = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/tag.js": {
            "title": "$:/core/modules/filters/is/tag.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/tag.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tag]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,prefix,options) {\n\tvar results = [],\n\t\ttagMap = options.wiki.getTagMap();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/tiddler.js": {
            "title": "$:/core/modules/filters/is/tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/tiddler.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tiddler]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddler = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is/variable.js": {
            "title": "$:/core/modules/filters/is/variable.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is/variable.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[variable]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variable = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!(title in options.widget.variables)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title in options.widget.variables) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "isfilteroperator"
        },
        "$:/core/modules/filters/is.js": {
            "title": "$:/core/modules/filters/is.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/is.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking tiddler properties\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar isFilterOperators;\n\nfunction getIsFilterOperators() {\n\tif(!isFilterOperators) {\n\t\tisFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"isfilteroperator\",isFilterOperators);\n\t}\n\treturn isFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.is = function(source,operator,options) {\n\t// Dispatch to the correct isfilteroperator\n\tvar isFilterOperators = getIsFilterOperators();\n\tif(operator.operand) {\n\t\tvar isFilterOperator = isFilterOperators[operator.operand];\n\t\tif(isFilterOperator) {\n\t\t\treturn isFilterOperator(source,operator.prefix,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/IsFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all tiddlers if the operand is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/limit.js": {
            "title": "$:/core/modules/filters/limit.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/limit.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for chopping the results to a specified maximum number of entries\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.limit = function(source,operator,options) {\n\tvar results = [];\n\t// Convert to an array\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Slice the array if necessary\n\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\n\tif(operator.prefix === \"!\") {\n\t\tresults = results.slice(-limit);\n\t} else {\n\t\tresults = results.slice(0,limit);\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/links.js": {
            "title": "$:/core/modules/filters/links.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/links.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the links from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.links = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/list.js": {
            "title": "$:/core/modules/filters/list.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/list.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.list = function(source,operator,options) {\n\tvar results = [],\n\t\ttr = $tw.utils.parseTextReference(operator.operand),\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\"),\n\t\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults = list;\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/listed.js": {
            "title": "$:/core/modules/filters/listed.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/listed.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that have the selected tiddlers in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.listed = function(source,operator,options) {\n\tvar field = operator.operand || \"list\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/listops.js": {
            "title": "$:/core/modules/filters/listops.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for manipulating the current selection list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.order = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.operand.toLowerCase() === \"reverse\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.unshift(title);\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nReverse list\n*/\nexports.reverse = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.unshift(title);\n\t});\n\treturn results;\n};\n\n/*\nFirst entry/entries in list\n*/\nexports.first = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,count);\n};\n\n/*\nLast entry/entries in list\n*/\nexports.last = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(-count);\n};\n\n/*\nAll but the first entry/entries of the list\n*/\nexports.rest = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count);\n};\nexports.butfirst = exports.rest;\nexports.bf = exports.rest;\n\n/*\nAll but the last entry/entries of the list\n*/\nexports.butlast = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,-count);\n};\nexports.bl = exports.butlast;\n\n/*\nThe nth member of the list\n*/\nexports.nth = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count - 1,count);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/lookup.js": {
            "title": "$:/core/modules/filters/lookup.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/lookup.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that looks up values via a title prefix\n\n[lookup:<field>[<prefix>]]\n\nPrepends the prefix to the selected items and returns the specified field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.lookup = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.getTiddlerText(operator.operand + title) || operator.suffix);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/match.js": {
            "title": "$:/core/modules/filters/match.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/match.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title matches a string\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.match = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() !== (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() === (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title !== operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title === operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/math.js": {
            "title": "$:/core/modules/filters/math.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/math.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for math. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\nNote that strings are converted to numbers automatically. Trailing non-digits are ignored.\n\n* \"\" converts to 0\n* \"12kk\" converts to 12\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.negate = makeNumericBinaryOperator(\n\tfunction(a) {return -a}\n);\n\nexports.abs = makeNumericBinaryOperator(\n\tfunction(a) {return Math.abs(a)}\n);\n\nexports.ceil = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(a)}\n);\n\nexports.floor = makeNumericBinaryOperator(\n\tfunction(a) {return Math.floor(a)}\n);\n\nexports.round = makeNumericBinaryOperator(\n\tfunction(a) {return Math.round(a)}\n);\n\nexports.trunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.trunc(a)}\n);\n\nexports.untrunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(Math.abs(a)) * Math.sign(a)}\n);\n\nexports.sign = makeNumericBinaryOperator(\n\tfunction(a) {return Math.sign(a)}\n);\n\nexports.add = makeNumericBinaryOperator(\n\tfunction(a,b) {return a + b;}\n);\n\nexports.subtract = makeNumericBinaryOperator(\n\tfunction(a,b) {return a - b;}\n);\n\nexports.multiply = makeNumericBinaryOperator(\n\tfunction(a,b) {return a * b;}\n);\n\nexports.divide = makeNumericBinaryOperator(\n\tfunction(a,b) {return a / b;}\n);\n\nexports.remainder = makeNumericBinaryOperator(\n\tfunction(a,b) {return a % b;}\n);\n\nexports.max = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.max(a,b);}\n);\n\nexports.min = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.min(a,b);}\n);\n\nexports.fixed = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toFixed.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.precision = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toPrecision.call(a,Math.min(Math.max(b,1),100));}\n);\n\nexports.exponential = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.power = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.pow(a,b);}\n);\n\nexports.log = makeNumericBinaryOperator(\n\tfunction(a,b) {\n\t\tif(b) {\n\t\t\treturn Math.log(a)/Math.log(b);\n\t\t} else {\n\t\t\treturn Math.log(a);\n\t\t}\n\t}\n);\n\nexports.sum = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0 // Initial value\n);\n\nexports.product = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator * value},\n\t1 // Initial value\n);\n\nexports.maxall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.max(accumulator,value)},\n\t-Infinity // Initial value\n);\n\nexports.minall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.min(accumulator,value)},\n\tInfinity // Initial value\n);\n\nfunction makeNumericBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [],\n\t\t\tnumOperand = $tw.utils.parseNumber(operator.operand);\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push($tw.utils.stringifyNumber(fnCalc($tw.utils.parseNumber(title),numOperand)));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeNumericReducingOperator(fnCalc,initialValue) {\n\tinitialValue = initialValue || 0;\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\treturn [$tw.utils.stringifyNumber(result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,$tw.utils.parseNumber(currentValue));\n\t\t},initialValue))];\n\t};\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/minlength.js": {
            "title": "$:/core/modules/filters/minlength.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/minlength.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for filtering out titles that don't meet the minimum length in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.minlength = function(source,operator,options) {\n\tvar results = [],\n\t\tminLength = parseInt(operator.operand || \"\",10) || 0;\n\tsource(function(tiddler,title) {\n\t\tif(title.length >= minLength) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/modules.js": {
            "title": "$:/core/modules/filters/modules.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/modules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the modules of a given type in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.modules = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\tresults.push(moduleName);\n\t\t});\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/moduletypes.js": {
            "title": "$:/core/modules/filters/moduletypes.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/moduletypes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the module types in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.moduletypes = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/next.js": {
            "title": "$:/core/modules/filters/next.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/next.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.next = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch++;\n\t\tif(match > 0 && match < list.length) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/plugintiddlers.js": {
            "title": "$:/core/modules/filters/plugintiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/plugintiddlers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the shadow tiddlers within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.plugintiddlers = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerDataCached(title,{tiddlers:[]});\n\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\n\t\t\t\tresults.push(title);\n\t\t\t});\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/prefix.js": {
            "title": "$:/core/modules/filters/prefix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/prefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title starts with a prefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.prefix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/previous.js": {
            "title": "$:/core/modules/filters/previous.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/previous.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.previous = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch--;\n\t\tif(match >= 0) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/range.js": {
            "title": "$:/core/modules/filters/range.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/range.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for generating a numeric range.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.range = function(source,operator,options) {\n\tvar results = [];\n\t// Split the operand into numbers delimited by these symbols\n\tvar parts = operator.operand.split(/[,:;]/g),\n\t\tbeg, end, inc, i, fixed = 0;\n\tfor (i=0; i<parts.length; i++) {\n\t\t// Validate real number\n\t\tif(!/^\\s*[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))\\s*$/.test(parts[i])) {\n\t\t\treturn [\"range: bad number \\\"\" + parts[i] + \"\\\"\"];\n\t\t}\n\t\t// Count digits; the most precise number determines decimal places in output.\n\t\tvar frac = /\\.\\d+/.exec(parts[i]);\n\t\tif(frac) {\n\t\t\tfixed = Math.max(fixed,frac[0].length-1);\n\t\t}\n\t\tparts[i] = parseFloat(parts[i]);\n\t}\n\tswitch(parts.length) {\n\t\tcase 1:\n\t\t\tend = parts[0];\n\t\t\tif (end >= 1) {\n\t\t\t\tbeg = 1;\n\t\t\t}\n\t\t\telse if (end <= -1) {\n\t\t\t\tbeg = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = Math.abs(parts[2]);\n\t\t\tbreak;\n\t}\n\tif(inc === 0) {\n\t\treturn [\"range: increment 0 causes infinite loop\"];\n\t}\n\t// May need to count backwards\n\tvar direction = ((end < beg) ? -1 : 1);\n\tinc *= direction;\n\t// Estimate number of resulting elements\n\tif((end - beg) / inc > 10000) {\n\t\treturn [\"range: too many steps (over 10K)\"];\n\t}\n\t// Avoid rounding error on last step\n\tend += direction * 0.5 * Math.pow(0.1,fixed);\n\tvar safety = 10010;\n\t// Enumerate the range\n\tif (end<beg) {\n\t\tfor(i=beg; i>end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor(i=beg; i<end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif(safety<0) {\n\t\treturn [\"range: unexpectedly large output\"];\n\t}\n\t// Reverse?\n\tif(operator.prefix === \"!\") {\n\t\tresults.reverse();\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/reduce.js": {
            "title": "$:/core/modules/filters/reduce.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/reduce.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator evaluates a subfilter for each item, making the running total available in the variable `accumulator`, and the current index available in the variable `index`\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.reduce = function(source,operator,options) {\n\t// Accumulate the list\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Run the filter over each item\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\taccumulator = operator.operands[1] || \"\";\n\tfor(var index=0; index<results.length; index++) {\n\t\tvar title = results[index],\n\t\t\tlist = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),{\n\t\t\t\tgetVariable: function(name) {\n\t\t\t\t\tswitch(name) {\n\t\t\t\t\t\tcase \"currentTiddler\":\n\t\t\t\t\t\t\treturn \"\" + title;\n\t\t\t\t\t\tcase \"accumulator\":\n\t\t\t\t\t\t\treturn \"\" + accumulator;\n\t\t\t\t\t\tcase \"index\":\n\t\t\t\t\t\t\treturn \"\" + index;\n\t\t\t\t\t\tcase \"revIndex\":\n\t\t\t\t\t\t\treturn \"\" + (results.length - 1 - index);\n\t\t\t\t\t\tcase \"length\":\n\t\t\t\t\t\t\treturn \"\" + results.length;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn options.widget.getVariable(name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\tif(list.length > 0) {\n\t\t\taccumulator = \"\" +  list[0];\n\t\t}\n\t}\n\tif(results.length > 0) {\n\t\treturn [accumulator];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/regexp.js": {
            "title": "$:/core/modules/filters/regexp.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/regexp.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for regexp matching\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.regexp = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"title\").toLowerCase(),\n\t\tregexpString, regexp, flags = \"\", match,\n\t\tgetFieldString = function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\treturn tiddler.getFieldString(fieldname);\n\t\t\t} else if(fieldname === \"title\") {\n\t\t\t\treturn title;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t// Process flags and construct regexp\n\tregexpString = operator.operand;\n\tmatch = /^\\(\\?([gim]+)\\)/.exec(regexpString);\n\tif(match) {\n\t\tflags = match[1];\n\t\tregexpString = regexpString.substr(match[0].length);\n\t} else {\n\t\tmatch = /\\(\\?([gim]+)\\)$/.exec(regexpString);\n\t\tif(match) {\n\t\t\tflags = match[1];\n\t\t\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\n\t\t}\n\t}\n\ttry {\n\t\tregexp = new RegExp(regexpString,flags);\n\t} catch(e) {\n\t\treturn [\"\" + e];\n\t}\n\t// Process the incoming tiddlers\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/removeprefix.js": {
            "title": "$:/core/modules/filters/removeprefix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/removeprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removeprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/removesuffix.js": {
            "title": "$:/core/modules/filters/removesuffix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/removesuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removesuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title && title.substr(-operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/sameday.js": {
            "title": "$:/core/modules/filters/sameday.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/sameday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sameday = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\n\t// Function to convert a date/time to a date integer\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(tiddler.getFieldDay(fieldName) === targetDate) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/search.js": {
            "title": "$:/core/modules/filters/search.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/search.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for searching for the text in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.search = function(source,operator,options) {\n\tvar invert = operator.prefix === \"!\";\n\tif(operator.suffixes) {\n\t\tvar hasFlag = function(flag) {\n\t\t\t\treturn (operator.suffixes[1] || []).indexOf(flag) !== -1;\n\t\t\t},\n\t\t\texcludeFields = false,\n\t\t\tfieldList = operator.suffixes[0] || [],\n\t\t\tfirstField = fieldList[0] || \"\", \n\t\t\tfirstChar = firstField.charAt(0),\n\t\t\tfields;\n\t\tif(firstChar === \"-\") {\n\t\t\tfields = [firstField.slice(1)].concat(fieldList.slice(1));\n\t\t\texcludeFields = true;\n\t\t} else if(fieldList[0] === \"*\"){\n\t\t\tfields = [];\n\t\t\texcludeFields = true;\n\t\t} else {\n\t\t\tfields = fieldList.slice(0);\n\t\t}\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: fields,\n\t\t\texcludeField: excludeFields,\n\t\t\tcaseSensitive: hasFlag(\"casesensitive\"),\n\t\t\tliteral: hasFlag(\"literal\"),\n\t\t\twhitespace: hasFlag(\"whitespace\"),\n\t\t\tanchored: hasFlag(\"anchored\"),\n\t\t\tregexp: hasFlag(\"regexp\"),\n\t\t\twords: hasFlag(\"words\")\n\t\t});\n\t} else {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert\n\t\t});\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/shadowsource.js": {
            "title": "$:/core/modules/filters/shadowsource.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/shadowsource.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the source plugins for shadow tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadowsource = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar source = options.wiki.getShadowSource(title);\n\t\tif(source) {\n\t\t\t$tw.utils.pushTop(results,source);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/slugify.js": {
            "title": "$:/core/modules/filters/slugify.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/slugify.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for slugifying a tiddler title\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.slugify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.slugify(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/sort.js": {
            "title": "$:/core/modules/filters/sort.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/sort.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,false);\n\treturn results;\n};\n\nexports.nsort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,true);\n\treturn results;\n};\n\nexports.sortan = function(source, operator, options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results, operator.operand || \"title\", operator.prefix === \"!\",false,false,true);\n\treturn results;\n};\n\nexports.sortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,false);\n\treturn results;\n};\n\nexports.nsortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,true);\n\treturn results;\n};\n\nvar prepare_results = function (source) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/sortsub.js": {
            "title": "$:/core/modules/filters/sortsub.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/sortsub.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting by a subfilter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sortsub = function(source,operator,options) {\n\t// Compile the subfilter\n\tvar filterFn = options.wiki.compileFilter(operator.operand);\n\t// Collect the input titles and the corresponding sort keys\n\tvar inputTitles = [],\n\t\tsortKeys = [];\n\tsource(function(tiddler,title) {\n\t\tinputTitles.push(title);\n\t\tvar r = filterFn.call(options.wiki,function(iterator) {\n\t\t\titerator(options.wiki.getTiddler(title),title);\n\t\t},{\n\t\t\tgetVariable: function(name) {\n\t\t\t\tif(name === \"currentTiddler\") {\n\t\t\t\t\treturn title;\n\t\t\t\t} else {\n\t\t\t\t\treturn options.widget.getVariable(name);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tsortKeys.push(r[0] || \"\");\n\t});\n\t// Rather than sorting the titles array, we'll sort the indexes so that we can consult both arrays\n\tvar indexes = new Array(inputTitles.length);\n\tfor(var t=0; t<inputTitles.length; t++) {\n\t\tindexes[t] = t;\n\t}\n\t// Sort the indexes\n\tvar compareFn = $tw.utils.makeCompareFunction(operator.suffix,{defaultType: \"string\",invert: operator.prefix === \"!\"});\n\tindexes = indexes.sort(function(a,b) {\n\t\treturn compareFn(sortKeys[a],sortKeys[b]);\n\t});\n\t// Make the results array in order\n\tvar results = [];\n\t$tw.utils.each(indexes,function(index) {\n\t\tresults.push(inputTitles[index]);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/splitbefore.js": {
            "title": "$:/core/modules/filters/splitbefore.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.splitbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(operator.operand);\n\t\tif(parts.length === 1) {\n\t\t\t$tw.utils.pushTop(results,parts[0]);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,parts[0] + operator.operand);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/storyviews.js": {
            "title": "$:/core/modules/filters/storyviews.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/storyviews.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the story views in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.storyviews = function(source,operator,options) {\n\tvar results = [],\n\t\tstoryviews = {};\n\t$tw.modules.applyMethods(\"storyview\",storyviews);\n\t$tw.utils.each(storyviews,function(info,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/strings.js": {
            "title": "$:/core/modules/filters/strings.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/strings.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for strings. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.length = makeStringBinaryOperator(\n\tfunction(a) {return [\"\" + (\"\" + a).length];}\n);\n\nexports.uppercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toUpperCase()];}\n);\n\nexports.lowercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toLowerCase()];}\n);\n\nexports.sentencecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toSentenceCase(a)];}\n);\n\nexports.titlecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toTitleCase(a)];}\n);\n\nexports.trim = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\toperand = (operator.operand || \"\"),\n\t\tfnCalc;\n\tif(suffix === \"prefix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimPrefix(a,b)];}\n\t} else if(suffix === \"suffix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix(a,b)];}\n\t} else {\n\t\tif(operand === \"\") {\n\t\t\tfnCalc = function(a) {return [$tw.utils.trim(a)];}\n\t\t} else {\n\t\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix($tw.utils.trimPrefix(a,b),b)];}\n\t\t}\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,fnCalc(title,operand));\n\t});\n\treturn result;\n};\n\nexports.split = makeStringBinaryOperator(\n\tfunction(a,b) {return (\"\" + a).split(b);}\n);\n\nexports[\"enlist-input\"] = makeStringBinaryOperator(\n\tfunction(a,o,s) {return $tw.utils.parseStringArray(\"\" + a,(s === \"raw\"));}\n);\n\nexports.join = makeStringReducingOperator(\n\tfunction(accumulator,value,operand) {\n\t\tif(accumulator === null) {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn accumulator + operand + value;\n\t\t}\n\t},null\n);\n\nfunction makeStringBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tArray.prototype.push.apply(result,fnCalc(title,operator.operand || \"\",operator.suffix || \"\"));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeStringReducingOperator(fnCalc,initialValue) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\tif(result.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\treturn [result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,currentValue,operator.operand || \"\");\n\t\t},initialValue) || \"\"];\n\t};\n}\n\nexports.splitregexp = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\tflags = (suffix.indexOf(\"m\") !== -1 ? \"m\" : \"\") + (suffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tregExp;\n\ttry {\n\t\tregExp = new RegExp(operator.operand || \"\",flags);\t\t\n\t} catch(ex) {\n\t\treturn [\"RegExp error: \" + ex];\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,title.split(regExp));\n\t});\t\t\n\treturn result;\n};\n\nexports[\"search-replace\"] = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = operator.suffixes || [],\n\t\tflagSuffix = (suffixes[0] ? (suffixes[0][0] || \"\") : \"\"),\n\t\tflags = (flagSuffix.indexOf(\"g\") !== -1 ? \"g\" : \"\") + (flagSuffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tisRegExp = (suffixes[1] && suffixes[1][0] === \"regexp\") ? true : false,\n\t\tsearchTerm,\n\t\tregExp;\n\t\n\tsource(function(tiddler,title) {\n\t\tif(title && (operator.operands.length > 1)) {\n\t\t\t//Escape regexp characters if the operand is not a regular expression\n\t\t\tsearchTerm = isRegExp ? operator.operand : $tw.utils.escapeRegExp(operator.operand);\n\t\t\ttry {\n\t\t\t\tregExp = new RegExp(searchTerm,flags);\n\t\t\t} catch(ex) {\n\t\t\t\treturn [\"RegExp error: \" + ex];\n\t\t\t}\n\t\t\tresults.push(\n\t\t\t\ttitle.replace(regExp,operator.operands[1])\n\t\t\t);\n\t\t} else {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nexports.pad = function(source,operator,options) {\n\tvar results = [],\n\t\ttargetLength = operator.operand ? parseInt(operator.operand) : 0,\n\t\tfill = operator.operands[1] || \"0\";\n\n\tsource(function(tiddler,title) {\n\t\tif(title && title.length) {\n\t\t\tif(title.length >= targetLength) {\n\t\t\t\tresults.push(title);\n\t\t\t} else {\n\t\t\t\tvar padString = \"\",\n\t\t\t\t\tpadStringLength = targetLength - title.length;\n\t\t\t\twhile (padStringLength > padString.length) {\n\t\t\t\t\tpadString += fill;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t//make sure we do not exceed the specified length\n\t\t\t\tpadString = padString.slice(0,padStringLength);\n\t\t\t\tif(operator.suffix && (operator.suffix === \"suffix\")) {\n\t\t\t\t\ttitle = title + padString;\n\t\t\t\t} else {\n\t\t\t\t\ttitle = padString + title;\n\t\t\t\t}\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/subfilter.js": {
            "title": "$:/core/modules/filters/subfilter.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/subfilter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand evaluated as a filter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subfilter = function(source,operator,options) {\n\tvar list = options.wiki.filterTiddlers(operator.operand,options.widget,source);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/subtiddlerfields.js": {
            "title": "$:/core/modules/filters/subtiddlerfields.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/subtiddlerfields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected subtiddlers of the plugin named in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subtiddlerfields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar subtiddler = options.wiki.getSubTiddler(operator.operand,title);\n\t\tif(subtiddler) {\n\t\t\tfor(var fieldName in subtiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/suffix.js": {
            "title": "$:/core/modules/filters/suffix.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/suffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title ends with a suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.suffix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/tag.js": {
            "title": "$:/core/modules/filters/tag.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/tag.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking for the presence of a tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,operator,options) {\n\tvar results = [],indexedResults;\n\tif((operator.suffix || \"\").toLowerCase() === \"strict\" && !operator.operand) {\n\t\t// New semantics:\n\t\t// Always return copy of input if operator.operand is missing\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else {\n\t\t// Old semantics:\n\t\tvar tiddlers;\n\t\tif(operator.prefix === \"!\") {\n\t\t\t// Returns a copy of the input if operator.operand is missing\n\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddlers.indexOf(title) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// Returns empty results if operator.operand is missing\n\t\t\tif(source.byTag) {\n\t\t\t\tindexedResults = source.byTag(operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\t\tsource(function(tiddler,title) {\n\t\t\t\t\tif(tiddlers.indexOf(title) !== -1) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t\t\t}\n\t\t}\t\t\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/tagging.js": {
            "title": "$:/core/modules/filters/tagging.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/tagging.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tagging = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/tags.js": {
            "title": "$:/core/modules/filters/tags.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/tags.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the tags of the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,operator,options) {\n\tvar tags = {};\n\tsource(function(tiddler,title) {\n\t\tvar t, length;\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\tfor(t=0, length=tiddler.fields.tags.length; t<length; t++) {\n\t\t\t\ttags[tiddler.fields.tags[t]] = true;\n\t\t\t}\n\t\t}\n\t});\n\treturn Object.keys(tags);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/then.js": {
            "title": "$:/core/modules/filters/then.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/then.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing any titles with a constant\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.then = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/title.js": {
            "title": "$:/core/modules/filters/title.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/title.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing title fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.title = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields.title !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults.push(operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/untagged.js": {
            "title": "$:/core/modules/filters/untagged.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/untagged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the selected tiddlers that are untagged\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.untagged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.hasField(\"tags\") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/variables.js": {
            "title": "$:/core/modules/filters/variables.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/variables.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the active variables\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variables = function(source,operator,options) {\n\tvar names = [];\n\tfor(var variable in options.widget.variables) {\n\t\tnames.push(variable);\n\t}\n\treturn names.sort();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/wikiparserrules.js": {
            "title": "$:/core/modules/filters/wikiparserrules.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/wikiparserrules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the wiki parser rules in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.wikiparserrules = function(source,operator,options) {\n\tvar results = [],\n\t\toperand = operator.operand;\n\t$tw.utils.each($tw.modules.types.wikirule,function(mod) {\n\t\tvar exp = mod.exports;\n\t\tif(!operand || exp.types[operand]) {\n\t\t\tresults.push(exp.name);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters/x-listops.js": {
            "title": "$:/core/modules/filters/x-listops.js",
            "text": "/*\\\ntitle: $:/core/modules/filters/x-listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nExtended filter operators to manipulate the current list.\n\n\\*/\n(function () {\n\n\t/*jslint node: true, browser: true */\n\t/*global $tw: false */\n\t\"use strict\";\n\n\t/*\n\tFetch titles from the current list\n\t*/\n\tvar prepare_results = function (source) {\n\tvar results = [];\n\t\tsource(function (tiddler, title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list before the item named in the operand\n\t*/\n\texports.putbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list after the item named in the operand\n\t*/\n\texports.putafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tReplaces the item named in the operand with a number of items from the tail of the current list\n\t*/\n\texports.replace = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -count) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list to the head of the list\n\t*/\n\texports.putfirst = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(-count).concat(results.slice(0, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the head of the current list to the tail of the list\n\t*/\n\texports.putlast = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(count).concat(results.slice(0, count));\n\t};\n\n\t/*\n\tMoves the item named in the operand a number of places forward or backward in the list\n\t*/\n\texports.move = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1),\n\t\t\tmarker = results.splice(index, 1),\n\t\t\toffset =  (index + count) > 0 ? index + count : 0;\n\t\treturn results.slice(0, offset).concat(marker).concat(results.slice(offset));\n\t};\n\n\t/*\n\tReturns the items from the current list that are after the item named in the operand\n\t*/\n\texports.allafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(index) :\n\t\t\tresults.slice(index + 1);\n\t};\n\n\t/*\n\tReturns the items from the current list that are before the item named in the operand\n\t*/\n\texports.allbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(0, index + 1) :\n\t\t\tresults.slice(0, index);\n\t};\n\n\t/*\n\tAppends the items listed in the operand array to the tail of the current list\n\t*/\n\texports.append = function (source, operator) {\n\t\tvar append = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || append.length;\n\t\treturn (append.length === 0) ? results :\n\t\t\t(operator.prefix) ? results.concat(append.slice(-count)) :\n\t\t\tresults.concat(append.slice(0, count));\n\t};\n\n\t/*\n\tPrepends the items listed in the operand array to the head of the current list\n\t*/\n\texports.prepend = function (source, operator) {\n\t\tvar prepend = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,prepend.length);\n\t\treturn (prepend.length === 0) ? results :\n\t\t\t(operator.prefix) ? prepend.slice(-count).concat(results) :\n\t\t\tprepend.slice(0, count).concat(results);\n\t};\n\n\t/*\n\tReturns all items from the current list except the items listed in the operand array\n\t*/\n\texports.remove = function (source, operator) {\n\t\tvar array = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || array.length,\n\t\t\tp,\n\t\t\tlen,\n\t\t\tindex;\n\t\tlen = array.length - 1;\n\t\tfor (p = 0; p < count; ++p) {\n\t\t\tif (operator.prefix) {\n\t\t\t\tindex = results.indexOf(array[len - p]);\n\t\t\t} else {\n\t\t\t\tindex = results.indexOf(array[p]);\n\t\t\t}\n\t\t\tif (index !== -1) {\n\t\t\t\tresults.splice(index, 1);\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t};\n\n\t/*\n\tReturns all items from the current list sorted in the order of the items in the operand array\n\t*/\n\texports.sortby = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tif (!results || results.length < 2) {\n\t\t\treturn results;\n\t\t}\n\t\tvar lookup = $tw.utils.parseStringArray(operator.operand, \"true\");\n\t\tresults.sort(function (a, b) {\n\t\t\treturn lookup.indexOf(a) - lookup.indexOf(b);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tRemoves all duplicate items from the current list\n\t*/\n\texports.unique = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tvar set = results.reduce(function (a, b) {\n\t\t\tif (a.indexOf(b) < 0) {\n\t\t\t\ta.push(b);\n\t\t\t}\n\t\t\treturn a;\n\t\t}, []);\n\t\treturn set;\n\t};\n\n\tvar cycleValueInArray = function(results,operands,stepSize) {\n\t\tvar resultsIndex,\n\t\t\tstep = stepSize || 1,\n\t\t\ti = 0,\n\t\t\topLength = operands.length,\n\t\t\tnextOperandIndex;\t\t\n\t\tfor(i; i < opLength; i++) {\n\t\t\tresultsIndex = results.indexOf(operands[i]);\n\t\t\tif(resultsIndex !== -1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif(resultsIndex !== -1) {\n\t\t\ti = i + step;\n\t\t\tnextOperandIndex = (i < opLength ? i : i - opLength);\n\t\t\tif(operands.length > 1) {\n\t\t\t\tresults.splice(resultsIndex,1,operands[nextOperandIndex]);\n\t\t\t} else {\n\t\t\t\tresults.splice(resultsIndex,1);\n\t\t\t}\n\t\t} else {\n\t\t\tresults.push(operands[0]);\n\t\t}\n\t\treturn results;\t\t\n\t}\n\n\t/*\n\tToggles an item in the current list.\n\t*/\t\n\texports.toggle = function(source,operator) {\n\t\treturn cycleValueInArray(prepare_results(source),operator.operands);\n\t}\n\n\texports.cycle = function(source,operator) {\n\t\tvar results = prepare_results(source),\n\t\t\toperands = (operator.operand.length ? $tw.utils.parseStringArray(operator.operand, \"true\") : [\"\"]),\n\t\t\tstep = $tw.utils.getInt(operator.operands[1]||\"\",1);\n\t\tif(step < 0) {\n\t\t\toperands.reverse();\n\t\t\tstep = Math.abs(step);\n\t\t}\t\n\t\treturn cycleValueInArray(results,operands,step);\n\t}\n\t\n})();\n",
            "type": "application/javascript",
            "module-type": "filteroperator"
        },
        "$:/core/modules/filters.js": {
            "title": "$:/core/modules/filters.js",
            "text": "/*\\\ntitle: $:/core/modules/filters.js\ntype: application/javascript\nmodule-type: wikimethod\n\nAdds tiddler filtering methods to the $tw.Wiki object.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParses an operation (i.e. a run) within a filter string\n\toperators: Array of array of operator nodes into which results should be inserted\n\tfilterString: filter string\n\tp: start position within the string\nReturns the new start position, after the parsed operation\n*/\nfunction parseFilterOperation(operators,filterString,p) {\n\tvar nextBracketPos, operator;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\tthrow \"Missing [ in filter expression\";\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = filterString.charAt(p++);\n\t\t}\n\t\t// Get the operator name\n\t\tnextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing [ in filter expression\";\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\t// The raw suffix for older filters\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t\t// The processed suffix for newer filters\n\t\t\toperator.suffixes = [];\n\t\t\t$tw.utils.each(operator.suffix.split(\":\"),function(subsuffix) {\n\t\t\t\toperator.suffixes.push([]);\n\t\t\t\t$tw.utils.each(subsuffix.split(\",\"),function(entry) {\n\t\t\t\t\tentry = $tw.utils.trim(entry);\n\t\t\t\t\tif(entry) {\n\t\t\t\t\t\toperator.suffixes[operator.suffixes.length - 1].push(entry); \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\t\toperator.operands = [];\n\t\tfunction parseOperand(bracketType) {\n\t\t\tvar operand = {};\n\t\t\tswitch (bracketType) {\n\t\t\t\tcase \"{\": // Curly brackets\n\t\t\t\t\toperand.indirect = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"[\": // Square brackets\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<\": // Angle brackets\n\t\t\t\t\toperand.variable = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"/\": // regexp brackets\n\t\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\t\tif(rexMatch) {\n\t\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n\t// DEPRECATION WARNING\n\tconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(nextBracketPos === -1) {\n\t\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t\t}\n\t\t\tif(!operator.regexp) {\n\t\t\t\toperand.text = filterString.substring(p,nextBracketPos);\n\t\t\t\toperator.operands.push(operand);\n\t\t\t}\n\t\t\tp = nextBracketPos + 1;\n\t\t}\n\t\t\n\t\tp = nextBracketPos + 1;\n\t\tparseOperand(bracket);\n\t\t\n\t\t// Check for multiple operands\n\t\twhile(filterString.charAt(p) === \",\") {\n\t\t\tp++;\n\t\t\tif(/^[\\[\\{<\\/]/.test(filterString.substring(p))) {\n\t\t\t\tnextBracketPos = p;\n\t\t\t\tp++;\n\t\t\t\tparseOperand(filterString.charAt(nextBracketPos));\n\t\t\t} else {\n\t\t\t\tthrow \"Missing [ in filter expression\";\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-|~|=|\\:(\\w+))?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow $tw.language.getString(\"Error/FilterSyntax\");\n\t\t\t}\n\t\t\tvar operation = {\n\t\t\t\tprefix: \"\",\n\t\t\t\toperators: []\n\t\t\t};\n\t\t\tif(match[1]) {\n\t\t\t\toperation.prefix = match[1];\n\t\t\t\tp = p + operation.prefix.length;\n\t\t\t\tif(match[2]) {\n\t\t\t\t\toperation.namedPrefix = match[2];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(match[3]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[4] || match[5] || match[6]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operands: [{text: match[4] || match[5] || match[6]}]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.getFilterRunPrefixes = function() {\n\tif(!this.filterRunPrefixes) {\n\t\t$tw.Wiki.prototype.filterRunPrefixes = {};\n\t\t$tw.modules.applyMethods(\"filterrunprefix\",this.filterRunPrefixes);\n\t}\n\treturn this.filterRunPrefixes;\n}\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\treturn function(source,widget) {\n\t\t\treturn [$tw.language.getString(\"Error/Filter\") + \": \" + e];\n\t\t};\n\t}\n\t// Get the hashmap of filter operator functions\n\tvar filterOperators = this.getFilterOperators();\n\t// Assemble array of functions, one for each operation\n\tvar operationFunctions = [];\n\t// Step through the operations\n\tvar self = this;\n\t$tw.utils.each(filterParseTree,function(operation) {\n\t\t// Create a function for the chain of operators in the operation\n\t\tvar operationSubFunction = function(source,widget) {\n\t\t\tvar accumulator = source,\n\t\t\t\tresults = [],\n\t\t\t\tcurrTiddlerTitle = widget && widget.getVariable(\"currentTiddler\");\n\t\t\t$tw.utils.each(operation.operators,function(operator) {\n\t\t\t\tvar operands = [],\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\toperatorFunction = filterOperators.field;\n\t\t\t\t} else {\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$tw.utils.each(operator.operands,function(operand) {\n\t\t\t\t\tif(operand.indirect) {\n\t\t\t\t\t\toperand.value = self.getTextReference(operand.text,\"\",currTiddlerTitle);\n\t\t\t\t\t} else if(operand.variable) {\n\t\t\t\t\t\toperand.value = widget.getVariable(operand.text,{defaultValue: \"\"});\n\t\t\t\t\t} else {\n\t\t\t\t\t\toperand.value = operand.text;\n\t\t\t\t\t}\n\t\t\t\t\toperands.push(operand.value);\n\t\t\t\t});\n\n\t\t\t\t// Invoke the appropriate filteroperator module\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operands.length > 0 ? operands[0] : undefined,\n\t\t\t\t\t\t\toperands: operands,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\tsuffixes: operator.suffixes,\n\t\t\t\t\t\t\tregexp: operator.regexp\n\t\t\t\t\t\t},{\n\t\t\t\t\t\t\twiki: self,\n\t\t\t\t\t\t\twidget: widget\n\t\t\t\t\t\t});\n\t\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\t\taccumulator = self.makeTiddlerIterator(results);\n\t\t\t\t} else {\n\t\t\t\t\taccumulator = results;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\tvar resultArray = [];\n\t\t\t\tresults(function(tiddler,title) {\n\t\t\t\t\tresultArray.push(title);\n\t\t\t\t});\n\t\t\t\treturn resultArray;\n\t\t\t}\n\t\t};\n\t\tvar filterRunPrefixes = self.getFilterRunPrefixes();\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tvar options = {wiki: self};\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn filterRunPrefixes[\"or\"](operationSubFunction, options);\n\t\t\t\tcase \"=\": // The results of the operation are pushed into the result without deduplication\n\t\t\t\t\treturn filterRunPrefixes[\"all\"](operationSubFunction, options);\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn filterRunPrefixes[\"except\"](operationSubFunction, options);\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn filterRunPrefixes[\"and\"](operationSubFunction, options);\n\t\t\t\tcase \"~\": // This operation is unioned into the result only if the main result so far is empty\n\t\t\t\t\treturn filterRunPrefixes[\"else\"](operationSubFunction, options);\n\t\t\t\tdefault: \n\t\t\t\t\tif(operation.namedPrefix && filterRunPrefixes[operation.namedPrefix]) {\n\t\t\t\t\t\treturn filterRunPrefixes[operation.namedPrefix](operationSubFunction, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t\tresults.clear();\n\t\t\t\t\t\t\tresults.push($tw.language.getString(\"Error/FilterRunPrefix\"));\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t}\n\t\t})());\n\t});\n\t// Return a function that applies the operations to a source iterator of tiddler titles\n\treturn $tw.perf.measure(\"filter: \" + filterString,function filterFunction(source,widget) {\n\t\tif(!source) {\n\t\t\tsource = self.each;\n\t\t} else if(typeof source === \"object\") { // Array or hashmap\n\t\t\tsource = self.makeTiddlerIterator(source);\n\t\t}\n\t\tvar results = new $tw.utils.LinkedList();\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results.toArray();\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikimethod"
        },
        "$:/core/modules/indexers/backlinks-indexer.js": {
            "title": "$:/core/modules/indexers/backlinks-indexer.js",
            "text": "/*\\\ntitle: $:/core/modules/indexers/backlinks-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers' backlinks\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\n\nfunction BacklinksIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nBacklinksIndexer.prototype.init = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype.rebuild = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype._getLinks = function(tiddler) {\n\tvar parser =  this.wiki.parseText(tiddler.fields.type, tiddler.fields.text, {});\n\tif(parser) {\n\t\treturn this.wiki.extractLinks(parser.tree);\n\t}\n\treturn [];\n}\n\nBacklinksIndexer.prototype.update = function(updateDescriptor) {\n\tif(!this.index) {\n\t\treturn;\n\t}\n\tvar newLinks = [],\n\t    oldLinks = [],\n\t    self = this;\n\tif(updateDescriptor.old.exists) {\n\t\toldLinks = this._getLinks(updateDescriptor.old.tiddler);\n\t}\n\tif(updateDescriptor.new.exists) {\n\t\tnewLinks = this._getLinks(updateDescriptor.new.tiddler);\n\t}\n\n\t$tw.utils.each(oldLinks,function(link) {\n\t\tif(self.index[link]) {\n\t\t\tdelete self.index[link][updateDescriptor.old.tiddler.fields.title];\n\t\t}\n\t});\n\t$tw.utils.each(newLinks,function(link) {\n\t\tif(!self.index[link]) {\n\t\t\tself.index[link] = Object.create(null);\n\t\t}\n\t\tself.index[link][updateDescriptor.new.tiddler.fields.title] = true;\n\t});\n}\n\nBacklinksIndexer.prototype.lookup = function(title) {\n\tif(!this.index) {\n\t\tthis.index = Object.create(null);\n\t\tvar self = this;\n\t\tthis.wiki.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self._getLinks(tiddler);\n\t\t\t$tw.utils.each(links, function(link) {\n\t\t\t\tif(!self.index[link]) {\n\t\t\t\t\tself.index[link] = Object.create(null);\n\t\t\t\t}\n\t\t\t\tself.index[link][title] = true;\n\t\t\t});\n\t\t});\n\t}\n\tif(this.index[title]) {\n\t\treturn Object.keys(this.index[title]);\n\t} else {\n\t\treturn [];\n\t}\n}\n\nexports.BacklinksIndexer = BacklinksIndexer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "indexer"
        },
        "$:/core/modules/indexers/field-indexer.js": {
            "title": "$:/core/modules/indexers/field-indexer.js",
            "text": "/*\\\ntitle: $:/core/modules/indexers/field-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nvar DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH = 128;\n\nfunction FieldIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nFieldIndexer.prototype.init = function() {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH;\n\tthis.addIndexMethods();\n}\n\n// Provided for testing\nFieldIndexer.prototype.setMaxIndexedValueLength = function(length) {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = length;\n};\n\nFieldIndexer.prototype.addIndexMethods = function() {\n\tvar self = this;\n\tthis.wiki.each.byField = function(name,value) {\n\t\tvar titles = self.wiki.allTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachShadow.byField = function(name,value) {\n\t\tvar titles = self.wiki.allShadowTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachTiddlerPlusShadows.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n\tthis.wiki.eachShadowPlusTiddlers.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n};\n\n/*\nTear down and then rebuild the index as if all tiddlers have changed\n*/\nFieldIndexer.prototype.rebuild = function() {\n\t// Invalidate the index so that it will be rebuilt when it is next used\n\tthis.index = null;\n};\n\n/*\nBuild the index for a particular field\n*/\nFieldIndexer.prototype.buildIndexForField = function(name) {\n\tvar self = this;\n\t// Hashmap by field name of hashmap by field value of array of tiddler titles\n\tthis.index = this.index || Object.create(null);\n\tthis.index[name] = Object.create(null);\n\tvar baseIndex = this.index[name];\n\t// Update the index for each tiddler\n\tthis.wiki.eachTiddlerPlusShadows(function(tiddler,title) {\n\t\tif(name in tiddler.fields) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t// Skip any values above the maximum length\n\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\tbaseIndex[value] = baseIndex[value] || [];\n\t\t\t\tbaseIndex[value].push(title);\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nUpdate the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create)\nupdateDescriptor: {old: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>},new: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>}}\n*/\nFieldIndexer.prototype.update = function(updateDescriptor) {\n\tvar self = this;\n\t// Don't do anything if the index hasn't been built yet\n\tif(this.index === null) {\n\t\treturn;\n\t}\n\t// Remove the old tiddler from the index\n\tif(updateDescriptor.old.tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor.old.tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor.old.tiddler.getFieldString(name),\n\t\t\t\t\ttiddlerList = indexEntry[value];\n\t\t\t\tif(tiddlerList) {\n\t\t\t\t\tvar index = tiddlerList.indexOf(updateDescriptor.old.tiddler.fields.title);\n\t\t\t\t\tif(index !== -1) {\n\t\t\t\t\t\ttiddlerList.splice(index,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// Add the new tiddler to the index\n\tif(updateDescriptor[\"new\"].tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor[\"new\"].tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor[\"new\"].tiddler.getFieldString(name);\n\t\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\t\tindexEntry[value] = indexEntry[value] || [];\n\t\t\t\t\tindexEntry[value].push(updateDescriptor[\"new\"].tiddler.fields.title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n// Lookup the given field returning a list of tiddler titles\nFieldIndexer.prototype.lookup = function(name,value) {\n\t// Fail the lookup if the value is too long\n\tif(value.length >= this.maxIndexedValueLength) {\n\t\treturn null;\n\t}\n\t// Update the index if it has yet to be built\n\tif(this.index === null || !this.index[name]) {\n\t\tthis.buildIndexForField(name);\n\t}\n\treturn this.index[name][value] || [];\n};\n\nexports.FieldIndexer = FieldIndexer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "indexer"
        },
        "$:/core/modules/indexers/tag-indexer.js": {
            "title": "$:/core/modules/indexers/tag-indexer.js",
            "text": "/*\\\ntitle: $:/core/modules/indexers/tag-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nfunction TagIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nTagIndexer.prototype.init = function() {\n\tthis.subIndexers = [\n\t\tnew TagSubIndexer(this,\"each\"),\n\t\tnew TagSubIndexer(this,\"eachShadow\"),\n\t\tnew TagSubIndexer(this,\"eachTiddlerPlusShadows\"),\n\t\tnew TagSubIndexer(this,\"eachShadowPlusTiddlers\")\n\t];\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.addIndexMethod();\n\t});\n};\n\nTagIndexer.prototype.rebuild = function() {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.rebuild();\n\t});\n};\n\nTagIndexer.prototype.update = function(updateDescriptor) {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.update(updateDescriptor);\n\t});\n};\n\nfunction TagSubIndexer(indexer,iteratorMethod) {\n\tthis.indexer = indexer;\n\tthis.iteratorMethod = iteratorMethod;\n\tthis.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} or null if not yet initialised\n}\n\nTagSubIndexer.prototype.addIndexMethod = function() {\n\tvar self = this;\n\tthis.indexer.wiki[this.iteratorMethod].byTag = function(tag) {\n\t\treturn self.lookup(tag).slice(0);\n\t};\n};\n\nTagSubIndexer.prototype.rebuild = function() {\n\tvar self = this;\n\t// Hashmap by tag of array of {isSorted:, titles:[]}\n\tthis.index = Object.create(null);\n\t// Add all the tags\n\tthis.indexer.wiki[this.iteratorMethod](function(tiddler,title) {\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\tif(!self.index[tag]) {\n\t\t\t\tself.index[tag] = {isSorted: false, titles: [title]};\n\t\t\t} else {\n\t\t\t\tself.index[tag].titles.push(title);\n\t\t\t}\n\t\t});\t\t\n\t});\n};\n\nTagSubIndexer.prototype.update = function(updateDescriptor) {\n\tthis.index = null;\n};\n\nTagSubIndexer.prototype.lookup = function(tag) {\n\t// Update the index if it has yet to be built\n\tif(this.index === null) {\n\t\tthis.rebuild();\n\t}\n\tvar indexRecord = this.index[tag];\n\tif(indexRecord) {\n\t\tif(!indexRecord.isSorted) {\n\t\t\tif(this.indexer.wiki.sortByList) {\n\t\t\t\tindexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag);\n\t\t\t}\t\t\t\n\t\t\tindexRecord.isSorted = true;\n\t\t}\n\t\treturn indexRecord.titles;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n\nexports.TagIndexer = TagIndexer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "indexer"
        },
        "$:/core/modules/info/platform.js": {
            "title": "$:/core/modules/info/platform.js",
            "text": "/*\\\ntitle: $:/core/modules/info/platform.js\ntype: application/javascript\nmodule-type: info\n\nInitialise basic platform $:/info/ tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) {\n\tvar mapBoolean = function(value) {return value ? \"yes\" : \"no\";},\n\t\tinfoTiddlerFields = [];\n\t// Basics\n\tinfoTiddlerFields.push({title: \"$:/info/browser\", text: mapBoolean(!!$tw.browser)});\n\tinfoTiddlerFields.push({title: \"$:/info/node\", text: mapBoolean(!!$tw.node)});\n\tinfoTiddlerFields.push({title: \"$:/info/startup-timestamp\", text: $tw.utils.stringifyDate(new Date())});\n\tif($tw.browser) {\n\t\t// Document location\n\t\tvar setLocationProperty = function(name,value) {\n\t\t\t\tinfoTiddlerFields.push({title: \"$:/info/url/\" + name, text: value});\t\t\t\n\t\t\t},\n\t\t\tlocation = document.location;\n\t\tsetLocationProperty(\"full\", (location.toString()).split(\"#\")[0]);\n\t\tsetLocationProperty(\"host\", location.host);\n\t\tsetLocationProperty(\"hostname\", location.hostname);\n\t\tsetLocationProperty(\"protocol\", location.protocol);\n\t\tsetLocationProperty(\"port\", location.port);\n\t\tsetLocationProperty(\"pathname\", location.pathname);\n\t\tsetLocationProperty(\"search\", location.search);\n\t\tsetLocationProperty(\"origin\", location.origin);\n\t\t// Screen size\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/width\", text: window.screen.width.toString()});\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/height\", text: window.screen.height.toString()});\n \t\t// Dark mode through event listener on MediaQueryList\n \t\tvar mqList = window.matchMedia(\"(prefers-color-scheme: dark)\"),\n \t\t\tgetDarkModeTiddler = function() {return {title: \"$:/info/darkmode\", text: mqList.matches ? \"yes\" : \"no\"};};\n \t\tinfoTiddlerFields.push(getDarkModeTiddler());\n \t\tmqList.addListener(function(event) {\n \t\t\tupdateInfoTiddlersCallback([getDarkModeTiddler()]);\n \t\t});\n\t\t// Language\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/language\", text: navigator.language || \"\"});\n\t}\n\treturn infoTiddlerFields;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "info"
        },
        "$:/core/modules/keyboard.js": {
            "title": "$:/core/modules/keyboard.js",
            "text": "/*\\\ntitle: $:/core/modules/keyboard.js\ntype: application/javascript\nmodule-type: global\n\nKeyboard handling utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"cancel\": 3,\n\t\"help\": 6,\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"clear\": 12,\n\t\"return\": 13,\n\t\"enter\": 13,\n\t\"pause\": 19,\n\t\"escape\": 27,\n\t\"space\": 32,\n\t\"page_up\": 33,\n\t\"page_down\": 34,\n\t\"end\": 35,\n\t\"home\": 36,\n\t\"left\": 37,\n\t\"up\": 38,\n\t\"right\": 39,\n\t\"down\": 40,\n\t\"printscreen\": 44,\n\t\"insert\": 45,\n\t\"delete\": 46,\n\t\"0\": 48,\n\t\"1\": 49,\n\t\"2\": 50,\n\t\"3\": 51,\n\t\"4\": 52,\n\t\"5\": 53,\n\t\"6\": 54,\n\t\"7\": 55,\n\t\"8\": 56,\n\t\"9\": 57,\n\t\"firefoxsemicolon\": 59,\n\t\"firefoxequals\": 61,\n\t\"a\": 65,\n\t\"b\": 66,\n\t\"c\": 67,\n\t\"d\": 68,\n\t\"e\": 69,\n\t\"f\": 70,\n\t\"g\": 71,\n\t\"h\": 72,\n\t\"i\": 73,\n\t\"j\": 74,\n\t\"k\": 75,\n\t\"l\": 76,\n\t\"m\": 77,\n\t\"n\": 78,\n\t\"o\": 79,\n\t\"p\": 80,\n\t\"q\": 81,\n\t\"r\": 82,\n\t\"s\": 83,\n\t\"t\": 84,\n\t\"u\": 85,\n\t\"v\": 86,\n\t\"w\": 87,\n\t\"x\": 88,\n\t\"y\": 89,\n\t\"z\": 90,\n\t\"numpad0\": 96,\n\t\"numpad1\": 97,\n\t\"numpad2\": 98,\n\t\"numpad3\": 99,\n\t\"numpad4\": 100,\n\t\"numpad5\": 101,\n\t\"numpad6\": 102,\n\t\"numpad7\": 103,\n\t\"numpad8\": 104,\n\t\"numpad9\": 105,\n\t\"multiply\": 106,\n\t\"add\": 107,\n\t\"separator\": 108,\n\t\"subtract\": 109,\n\t\"decimal\": 110,\n\t\"divide\": 111,\n\t\"f1\": 112,\n\t\"f2\": 113,\n\t\"f3\": 114,\n\t\"f4\": 115,\n\t\"f5\": 116,\n\t\"f6\": 117,\n\t\"f7\": 118,\n\t\"f8\": 119,\n\t\"f9\": 120,\n\t\"f10\": 121,\n\t\"f11\": 122,\n\t\"f12\": 123,\n\t\"f13\": 124,\n\t\"f14\": 125,\n\t\"f15\": 126,\n\t\"f16\": 127,\n\t\"f17\": 128,\n\t\"f18\": 129,\n\t\"f19\": 130,\n\t\"f20\": 131,\n\t\"f21\": 132,\n\t\"f22\": 133,\n\t\"f23\": 134,\n\t\"f24\": 135,\n\t\"firefoxminus\": 173,\n\t\"semicolon\": 186,\n\t\"equals\": 187,\n\t\"comma\": 188,\n\t\"dash\": 189,\n\t\"period\": 190,\n\t\"slash\": 191,\n\t\"backquote\": 192,\n\t\"openbracket\": 219,\n\t\"backslash\": 220,\n\t\"closebracket\": 221,\n\t\"quote\": 222\n};\n\nfunction KeyboardManager(options) {\n\tvar self = this;\n\toptions = options || \"\";\n\t// Save the named key hashmap\n\tthis.namedKeys = namedKeys;\n\t// Create a reverse mapping of code to keyname\n\tthis.keyNames = [];\n\t$tw.utils.each(namedKeys,function(keyCode,name) {\n\t\tself.keyNames[keyCode] = name.substr(0,1).toUpperCase() + name.substr(1);\n\t});\n\t// Save the platform-specific name of the \"meta\" key\n\tthis.metaKeyName = $tw.platform.isMac ? \"cmd-\" : \"win-\";\n\tthis.shortcutKeysList = [], // Stores the shortcut-key descriptors\n\tthis.shortcutActionList = [], // Stores the corresponding action strings\n\tthis.shortcutParsedList = []; // Stores the parsed key descriptors\n\tthis.lookupNames = [\"shortcuts\"];\n\tthis.lookupNames.push($tw.platform.isMac ? \"shortcuts-mac\" : \"shortcuts-not-mac\")\n\tthis.lookupNames.push($tw.platform.isWindows ? \"shortcuts-windows\" : \"shortcuts-not-windows\");\n\tthis.lookupNames.push($tw.platform.isLinux ? \"shortcuts-linux\" : \"shortcuts-not-linux\");\n\tthis.updateShortcutLists(this.getShortcutTiddlerList());\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.handleShortcutChanges(changes);\n\t});\n}\n\n/*\nReturn an array of keycodes for the modifier keys ctrl, shift, alt, meta\n*/\nKeyboardManager.prototype.getModifierKeys = function() {\n\treturn [\n\t\t16, // Shift\n\t\t17, // Ctrl\n\t\t18, // Alt\n\t\t20, // CAPS LOCK\n\t\t91, // Meta (left)\n\t\t93, // Meta (right)\n\t\t224 // Meta (Firefox)\n\t]\n};\n\n/*\nParses a key descriptor into the structure:\n{\n\tkeyCode: numeric keycode\n\tshiftKey: boolean\n\taltKey: boolean\n\tctrlKey: boolean\n\tmetaKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nKeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor) {\n\tvar components = keyDescriptor.split(/\\+|\\-/),\n\t\tinfo = {\n\t\t\tkeyCode: 0,\n\t\t\tshiftKey: false,\n\t\t\taltKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase(),\n\t\t\tc = s.charCodeAt(0);\n\t\t// Look for modifier keys\n\t\tif(s === \"ctrl\") {\n\t\t\tinfo.ctrlKey = true;\n\t\t} else if(s === \"shift\") {\n\t\t\tinfo.shiftKey = true;\n\t\t} else if(s === \"alt\") {\n\t\t\tinfo.altKey = true;\n\t\t} else if(s === \"meta\" || s === \"cmd\" || s === \"win\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(this.namedKeys[s]) {\n\t\t\tinfo.keyCode = this.namedKeys[s];\n\t\t}\n\t}\n\tif(info.keyCode) {\n\t\treturn info;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nParse a list of key descriptors into an array of keyInfo objects. The key descriptors can be passed as an array of strings or a space separated string\n*/\nKeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) {\n\tvar self = this;\n\toptions = options || {};\n\toptions.stack = options.stack || [];\n\tvar wiki = options.wiki || $tw.wiki;\n\tif(typeof keyDescriptors === \"string\" && keyDescriptors === \"\") {\n\t\treturn [];\n\t}\n\tif(!$tw.utils.isArray(keyDescriptors)) {\n\t\tkeyDescriptors = keyDescriptors.split(\" \");\n\t}\n\tvar result = [];\n\t$tw.utils.each(keyDescriptors,function(keyDescriptor) {\n\t\t// Look for a named shortcut\n\t\tif(keyDescriptor.substr(0,2) === \"((\" && keyDescriptor.substr(-2,2) === \"))\") {\n\t\t\tif(options.stack.indexOf(keyDescriptor) === -1) {\n\t\t\t\toptions.stack.push(keyDescriptor);\n\t\t\t\tvar name = keyDescriptor.substring(2,keyDescriptor.length - 2),\n\t\t\t\t\tlookupName = function(configName) {\n\t\t\t\t\t\tvar keyDescriptors = wiki.getTiddlerText(\"$:/config/\" + configName + \"/\" + name);\n\t\t\t\t\t\tif(keyDescriptors) {\n\t\t\t\t\t\t\tresult.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t$tw.utils.each(self.lookupNames,function(platformDescriptor) {\n\t\t\t\t\tlookupName(platformDescriptor);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tresult.push(self.parseKeyDescriptor(keyDescriptor));\n\t\t}\n\t});\n\treturn result;\n};\n\nKeyboardManager.prototype.getPrintableShortcuts = function(keyInfoArray) {\n\tvar self = this,\n\t\tresult = [];\n\t$tw.utils.each(keyInfoArray,function(keyInfo) {\n\t\tif(keyInfo) {\n\t\t\tresult.push((keyInfo.ctrlKey ? \"ctrl-\" : \"\") + \n\t\t\t\t   (keyInfo.shiftKey ? \"shift-\" : \"\") + \n\t\t\t\t   (keyInfo.altKey ? \"alt-\" : \"\") + \n\t\t\t\t   (keyInfo.metaKey ? self.metaKeyName : \"\") + \n\t\t\t\t   (self.keyNames[keyInfo.keyCode]));\n\t\t}\n\t});\n\treturn result;\n}\n\nKeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) {\n\treturn keyInfo &&\n\t\t\tevent.keyCode === keyInfo.keyCode && \n\t\t\tevent.shiftKey === keyInfo.shiftKey && \n\t\t\tevent.altKey === keyInfo.altKey && \n\t\t\tevent.ctrlKey === keyInfo.ctrlKey && \n\t\t\tevent.metaKey === keyInfo.metaKey;\n};\n\nKeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {\n\tfor(var t=0; t<keyInfoArray.length; t++) {\n\t\tif(this.checkKeyDescriptor(event,keyInfoArray[t])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.getEventModifierKeyDescriptor = function(event) {\n\treturn event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey ? \"ctrl\" : \n\t\tevent.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey ? \"shift\" : \n\t\tevent.ctrlKey && event.shiftKey && !event.altKey && !event.metaKey ? \"ctrl-shift\" : \n\t\tevent.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt\" : \n\t\tevent.altKey && event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt-shift\" : \n\t\tevent.altKey && event.ctrlKey && !event.shiftKey && !event.metaKey ? \"ctrl-alt\" : \n\t\tevent.altKey && event.shiftKey && event.ctrlKey && !event.metaKey ? \"ctrl-alt-shift\" : \n\t\tevent.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta\" : \n\t\tevent.metaKey && event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta-ctrl\" :\n\t\tevent.metaKey && event.ctrlKey && event.shiftKey && !event.altKey ? \"meta-ctrl-shift\" :\n\t\tevent.metaKey && event.ctrlKey & event.shiftKey && event.altKey ? \"meta-ctrl-alt-shift\" : \"normal\";\n};\n\nKeyboardManager.prototype.getShortcutTiddlerList = function() {\n\treturn $tw.wiki.getTiddlersWithTag(\"$:/tags/KeyboardShortcut\");\n};\n\nKeyboardManager.prototype.updateShortcutLists = function(tiddlerList) {\n\tthis.shortcutTiddlers = tiddlerList;\n\tfor(var i=0; i<tiddlerList.length; i++) {\n\t\tvar title = tiddlerList[i],\n\t\t\ttiddlerFields = $tw.wiki.getTiddler(title).fields;\n\t\tthis.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined;\n\t\tthis.shortcutActionList[i] = tiddlerFields.text;\n\t\tthis.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;\n\t}\n};\n\nKeyboardManager.prototype.handleKeydownEvent = function(event) {\n\tvar key, action;\n\tfor(var i=0; i<this.shortcutTiddlers.length; i++) {\n\t\tif(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) {\n\t\t\tkey = this.shortcutParsedList[i];\n\t\t\taction = this.shortcutActionList[i];\n\t\t}\n\t}\n\tif(key !== undefined) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\t$tw.rootWidget.invokeActionString(action,$tw.rootWidget);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.detectNewShortcuts = function(changedTiddlers) {\n\tvar shortcutConfigTiddlers = [],\n\t\thandled = false;\n\t$tw.utils.each(this.lookupNames,function(platformDescriptor) {\n\t\tvar descriptorString = \"$:/config/\" + platformDescriptor + \"/\";\n\t\tObject.keys(changedTiddlers).forEach(function(configTiddler) {\n\t\t\tvar configString = configTiddler.substr(0, configTiddler.lastIndexOf(\"/\") + 1);\n\t\t\tif(configString === descriptorString) {\n\t\t\t\tshortcutConfigTiddlers.push(configTiddler);\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t});\n\t});\n\tif(handled) {\n\t\treturn $tw.utils.hopArray(changedTiddlers,shortcutConfigTiddlers);\n\t} else {\n\t\treturn false;\n\t}\n};\n\nKeyboardManager.prototype.handleShortcutChanges = function(changedTiddlers) {\n\tvar newList = this.getShortcutTiddlerList();\n\tvar hasChanged = $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) ? true :\n\t\t($tw.utils.hopArray(changedTiddlers,newList) ? true :\n\t\t(this.detectNewShortcuts(changedTiddlers))\n\t);\n\t// Re-cache shortcuts if something changed\n\tif(hasChanged) {\n\t\tthis.updateShortcutLists(newList);\n\t}\n};\n\nexports.KeyboardManager = KeyboardManager;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/language.js": {
            "title": "$:/core/modules/language.js",
            "text": "/*\\\ntitle: $:/core/modules/language.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Language() manages translateable strings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate an instance of the language manager. Options include:\nwiki: wiki from which to retrieve translation tiddlers\n*/\nfunction Language(options) {\n\toptions = options || \"\";\n\tthis.wiki = options.wiki || $tw.wiki;\n}\n\n/*\nReturn a wikified translateable string. The title is automatically prefixed with \"$:/language/\"\nOptions include:\nvariables: optional hashmap of variables to supply to the language wikification\n*/\nLanguage.prototype.getString = function(title,options) {\n\toptions = options || {};\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.renderTiddler(\"text/plain\",title,{variables: options.variables});\n};\n\n/*\nReturn a raw, unwikified translateable string. The title is automatically prefixed with \"$:/language/\"\n*/\nLanguage.prototype.getRawString = function(title) {\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.getTiddlerText(title);\n};\n\nexports.Language = Language;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/macros/changecount.js": {
            "title": "$:/core/modules/macros/changecount.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/changecount.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the changecount for the current tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"changecount\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn this.wiki.getChangeCount(this.getVariable(\"currentTiddler\")) + \"\";\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/contrastcolour.js": {
            "title": "$:/core/modules/macros/contrastcolour.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/contrastcolour.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to choose which of two colours has the highest contrast with a base colour\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"contrastcolour\";\n\nexports.params = [\n\t{name: \"target\"},\n\t{name: \"fallbackTarget\"},\n\t{name: \"colourA\"},\n\t{name: \"colourB\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(target,fallbackTarget,colourA,colourB) {\n\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\n\tif(!rgbTarget) {\n\t\treturn colourA;\n\t}\n\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB);\n\tif(rgbColourA && !rgbColourB) {\n\t\treturn rgbColourA;\n\t}\n\tif(rgbColourB && !rgbColourA) {\n\t\treturn rgbColourB;\n\t}\n\tif(!rgbColourA && !rgbColourB) {\n\t\t// If neither colour is readable, return a crude inverse of the target\n\t\treturn [255 - rgbTarget[0],255 - rgbTarget[1],255 - rgbTarget[2],rgbTarget[3]];\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar brightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\n\t\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\n\t\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\n\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/csvtiddlers.js": {
            "title": "$:/core/modules/macros/csvtiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/csvtiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to CSV\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"csvtiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"format\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,format) {\n\tvar self = this,\n\t\ttiddlers = this.wiki.filterTiddlers(filter),\n\t\ttiddler,\n\t\tfields = [],\n\t\tt,f;\n\t// Collect all the fields\n\tfor(t=0;t<tiddlers.length; t++) {\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tfor(f in tiddler.fields) {\n\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\tfields.push(f);\n\t\t\t}\n\t\t}\n\t}\n\t// Sort the fields and bring the standard ones to the front\n\tfields.sort();\n\t\"title text modified modifier created creator\".split(\" \").reverse().forEach(function(value,index) {\n\t\tvar p = fields.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tfields.splice(p,1);\n\t\t\tfields.unshift(value)\n\t\t}\n\t});\n\t// Output the column headings\n\tvar output = [], row = [];\n\tfields.forEach(function(value) {\n\t\trow.push(quoteAndEscape(value))\n\t});\n\toutput.push(row.join(\",\"));\n\t// Output each tiddler\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\trow = [];\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t}\n\t\toutput.push(row.join(\",\"));\n\t}\n\treturn output.join(\"\\n\");\n};\n\nfunction quoteAndEscape(value) {\n\treturn \"\\\"\" + value.replace(/\"/mg,\"\\\"\\\"\") + \"\\\"\";\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/displayshortcuts.js": {
            "title": "$:/core/modules/macros/displayshortcuts.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/displayshortcuts.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to display a list of keyboard shortcuts in human readable form. Notably, it resolves named shortcuts like `((bold))` to the underlying keystrokes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"displayshortcuts\";\n\nexports.params = [\n\t{name: \"shortcuts\"},\n\t{name: \"prefix\"},\n\t{name: \"separator\"},\n\t{name: \"suffix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(shortcuts,prefix,separator,suffix) {\n\tvar shortcutArray = $tw.keyboardManager.getPrintableShortcuts($tw.keyboardManager.parseKeyDescriptors(shortcuts,{\n\t\twiki: this.wiki\n\t}));\n\tif(shortcutArray.length > 0) {\n\t\tshortcutArray.sort(function(a,b) {\n\t\t    return a.toLowerCase().localeCompare(b.toLowerCase());\n\t\t})\n\t\treturn prefix + shortcutArray.join(separator) + suffix;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/jsontiddler.js": {
            "title": "$:/core/modules/macros/jsontiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/jsontiddler.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output a single tiddler to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddler\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\ttitle = title || this.getVariable(\"currentTiddler\");\n\tvar tiddler = !!title && this.wiki.getTiddler(title),\n\t\tfields = new Object();\n\tif(tiddler) {\n\t\tfor(var field in tiddler.fields) {\n\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t}\n\t}\n\treturn JSON.stringify(fields,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/jsontiddlers.js": {
            "title": "$:/core/modules/macros/jsontiddlers.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/jsontiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"spaces\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,spaces) {\n\treturn this.wiki.getTiddlersAsJson(filter,$tw.utils.parseInt(spaces));\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/makedatauri.js": {
            "title": "$:/core/modules/macros/makedatauri.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert a string of text to a data URI\n\n<<makedatauri text:\"Text to be converted\" type:\"text/vnd.tiddlywiki\">>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"makedatauri\";\n\nexports.params = [\n\t{name: \"text\"},\n\t{name: \"type\"},\n\t{name: \"_canonical_uri\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type,_canonical_uri) {\n\treturn $tw.utils.makeDataUri(text,type,_canonical_uri);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/now.js": {
            "title": "$:/core/modules/macros/now.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/now.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a formatted version of the current time\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"now\";\n\nexports.params = [\n\t{name: \"format\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(format) {\n\treturn $tw.utils.formatDateString(new Date(),format || \"0hh:0mm, DDth MMM YYYY\");\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/qualify.js": {
            "title": "$:/core/modules/macros/qualify.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/qualify.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to qualify a state tiddler title according\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"qualify\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title + \"-\" + this.getStateQualifier();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/resolvepath.js": {
            "title": "$:/core/modules/macros/resolvepath.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/resolvepath.js\ntype: application/javascript\nmodule-type: macro\n\nResolves a relative path for an absolute rootpath.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"resolvepath\";\n\nexports.params = [\n\t{name: \"source\"},\n\t{name: \"root\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(source, root) {\n\treturn $tw.utils.resolvePath(source, root);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/unusedtitle.js": {
            "title": "$:/core/modules/macros/unusedtitle.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/unusedtitle.js\ntype: application/javascript\nmodule-type: macro\nMacro to return a new title that is unused in the wiki. It can be given a name as a base.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"unusedtitle\";\n\nexports.params = [\n\t{name: \"baseName\"},\n\t{name: \"options\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(baseName, options) {\n\tif(!baseName) {\n\t\tbaseName = $tw.language.getString(\"DefaultNewTiddlerTitle\");\n\t}\n\treturn this.wiki.generateNewTitle(baseName, options);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/macros/version.js": {
            "title": "$:/core/modules/macros/version.js",
            "text": "/*\\\ntitle: $:/core/modules/macros/version.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the TiddlyWiki core version number\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"version\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn $tw.version;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/core/modules/parsers/audioparser.js": {
            "title": "$:/core/modules/parsers/audioparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/audioparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe audio parser parses an audio tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AudioParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"audio\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"audio/ogg\"] = AudioParser;\nexports[\"audio/mpeg\"] = AudioParser;\nexports[\"audio/mp3\"] = AudioParser;\nexports[\"audio/mp4\"] = AudioParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/binaryparser.js": {
            "title": "$:/core/modules/parsers/binaryparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/binaryparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe binary parser parses a binary tiddler into a warning message and download link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar BinaryParser = function(type,text,options) {\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on binary tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!title\"}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to external or internal data URI\n\tif(options._canonical_uri) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: options._canonical_uri\n\t\t};\n\t} else if(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/octet-stream\"] = BinaryParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/csvparser.js": {
            "title": "$:/core/modules/parsers/csvparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/csvparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CsvParser = function(type,text,options) {\n\t// Table framework\n\tthis.tree = [{\n\t\t\"type\": \"scrollable\", \"children\": [{\n\t\t\t\"type\": \"element\", \"tag\": \"table\", \"children\": [{\n\t\t\t\t\"type\": \"element\", \"tag\": \"tbody\", \"children\": []\n\t\t\t}], \"attributes\": {\n\t\t\t\t\"class\": {\"type\": \"string\", \"value\": \"tc-csv-table\"}\n\t\t\t}\n\t\t}]\n\t}];\n\t// Split the text into lines\n\tvar lines = text.split(/\\r?\\n/mg),\n\t\ttag = \"th\";\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar lineText = lines[line];\n\t\tif(lineText) {\n\t\t\tvar row = {\n\t\t\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t\t\t};\n\t\t\tvar columns = lineText.split(\",\");\n\t\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\t\trow.children.push({\n\t\t\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\t\t\"text\": columns[column]\n\t\t\t\t\t\t}]\n\t\t\t\t\t});\n\t\t\t}\n\t\t\ttag = \"td\";\n\t\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t\t}\n\t}\n};\n\nexports[\"text/csv\"] = CsvParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/htmlparser.js": {
            "title": "$:/core/modules/parsers/htmlparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src},\n\t\t\tsandbox: {type: \"string\", value: \"\"}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/imageparser.js": {
            "title": "$:/core/modules/parsers/imageparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/imageparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe image parser parses an image into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"img\",\n\t\t\tattributes: {}\n\t\t};\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\tif(type === \"image/svg+xml\" || type === \".svg\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:image/svg+xml,\" + encodeURIComponent(text)};\n\t\t} else {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t\t}\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"image/svg+xml\"] = ImageParser;\nexports[\"image/jpg\"] = ImageParser;\nexports[\"image/jpeg\"] = ImageParser;\nexports[\"image/png\"] = ImageParser;\nexports[\"image/gif\"] = ImageParser;\nexports[\"image/webp\"] = ImageParser;\nexports[\"image/heic\"] = ImageParser;\nexports[\"image/heif\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/utils/parseutils.js": {
            "title": "$:/core/modules/utils/parseutils.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/parseutils.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions concerned with parsing text into tokens.\n\nMost functions have the following pattern:\n\n* The parameters are:\n** `source`: the source string being parsed\n** `pos`: the current parse position within the string\n** Any further parameters are used to identify the token that is being parsed\n* The return value is:\n** null if the token was not found at the specified position\n** an object representing the token with the following standard fields:\n*** `type`: string indicating the type of the token\n*** `start`: start position of the token in the source string\n*** `end`: end position of the token in the source string\n*** Any further fields required to describe the token\n\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \"whitespace\", start:, end:,}\n*/\nexports.parseWhiteSpace = function(source,pos) {\n\tvar p = pos,c;\n\twhile(true) {\n\t\tc = source.charAt(p);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tp++;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(p === pos) {\n\t\treturn null;\n\t} else {\n\t\treturn {\n\t\t\ttype: \"whitespace\",\n\t\t\tstart: pos,\n\t\t\tend: p\n\t\t}\n\t}\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar c;\n\twhile(true) {\n\t\tc = source.charAt(pos);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tpos++;\n\t\t} else {\n\t\t\treturn pos;\n\t\t}\n\t}\n};\n\n/*\nLook for a given string token. Returns null if not found, otherwise returns {type: \"token\", value:, start:, end:,}\n*/\nexports.parseTokenString = function(source,pos,token) {\n\tvar match = source.indexOf(token,pos) === pos;\n\tif(match) {\n\t\treturn {\n\t\t\ttype: \"token\",\n\t\t\tvalue: token,\n\t\t\tstart: pos,\n\t\t\tend: pos + token.length\n\t\t};\n\t}\n\treturn null;\n};\n\n/*\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \"regexp\", match:, start:, end:,}\n*/\nexports.parseTokenRegExp = function(source,pos,reToken) {\n\tvar node = {\n\t\ttype: \"regexp\",\n\t\tstart: pos\n\t};\n\treToken.lastIndex = pos;\n\tnode.match = reToken.exec(source);\n\tif(node.match && node.match.index === pos) {\n\t\tnode.end = pos + node.match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a string literal. Returns null if not found, otherwise returns {type: \"string\", value:, start:, end:,}\n*/\nexports.parseStringLiteral = function(source,pos) {\n\tvar node = {\n\t\ttype: \"string\",\n\t\tstart: pos\n\t};\n\tvar reString = /(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\")|(?:'([^']*)')/g;\n\treString.lastIndex = pos;\n\tvar match = reString.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.value = match[1] !== undefined ? match[1] :(\n\t\t\tmatch[2] !== undefined ? match[2] : match[3] \n\t\t\t\t\t);\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a macro invocation parameter. Returns null if not found, or {type: \"macro-parameter\", name:, value:, start:, end:}\n*/\nexports.parseMacroParameter = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macro-parameter\",\n\t\tstart: pos\n\t};\n\t// Define our regexp\n\tvar reMacroParameter = /(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\\s>\"'=]+)))/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the parameter\n\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the parameter details\n\tnode.value = token.match[2] !== undefined ? token.match[2] : (\n\t\t\t\t\ttoken.match[3] !== undefined ? token.match[3] : (\n\t\t\t\t\t\ttoken.match[4] !== undefined ? token.match[4] : (\n\t\t\t\t\t\t\ttoken.match[5] !== undefined ? token.match[5] : (\n\t\t\t\t\t\t\t\ttoken.match[6] !== undefined ? token.match[6] : (\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\tif(token.match[1]) {\n\t\tnode.name = token.match[1];\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, parameters:, start:, end:}\n*/\nexports.parseMacroInvocation = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macrocall\",\n\t\tstart: pos,\n\t\tparams: []\n\t};\n\t// Define our regexps\n\tvar reMacroName = /([^\\s>\"'=]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double less than sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"<<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the macro name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Process parameters\n\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\n\twhile(parameter) {\n\t\tnode.params.push(parameter);\n\t\tpos = parameter.end;\n\t\t// Get the next parameter\n\t\tparameter = $tw.utils.parseMacroParameter(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">>\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, valueType: \"string|indirect|macro\", value:, start:, end:,}\n*/\nexports.parseAttribute = function(source,pos) {\n\tvar node = {\n\t\tstart: pos\n\t};\n\t// Define our regexps\n\tvar reAttributeName = /([^\\/\\s>\"'=]+)/g,\n\t\treUnquotedAttribute = /([^\\/\\s<>\"'=]+)/g,\n\t\treFilteredValue = /\\{\\{\\{(.+?)\\}\\}\\}/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the attribute name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for an equals sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"=\");\n\tif(token) {\n\t\tpos = token.end;\n\t\t// Skip whitespace\n\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t// Look for a string literal\n\t\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\n\t\tif(stringLiteral) {\n\t\t\tpos = stringLiteral.end;\n\t\t\tnode.type = \"string\";\n\t\t\tnode.value = stringLiteral.value;\n\t\t} else {\n\t\t\t// Look for a filtered value\n\t\t\tvar filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);\n\t\t\tif(filteredValue) {\n\t\t\t\tpos = filteredValue.end;\n\t\t\t\tnode.type = \"filtered\";\n\t\t\t\tnode.filter = filteredValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for an indirect value\n\t\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\t\tif(indirectValue) {\n\t\t\t\t\tpos = indirectValue.end;\n\t\t\t\t\tnode.type = \"indirect\";\n\t\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a unquoted value\n\t\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\t\tif(unquotedValue) {\n\t\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\t\tnode.value = \"true\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tnode.type = \"string\";\n\t\tnode.value = \"true\";\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/parsers/pdfparser.js": {
            "title": "$:/core/modules/parsers/pdfparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/pdfparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe PDF parser embeds a PDF viewer\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"embed\",\n\t\t\tattributes: {}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/pdf\"] = ImageParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/textparser.js": {
            "title": "$:/core/modules/parsers/textparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/textparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TextParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"codeblock\",\n\t\tattributes: {\n\t\t\tcode: {type: \"string\", value: text},\n\t\t\tlanguage: {type: \"string\", value: type}\n\t\t}\n\t}];\n};\n\nexports[\"text/plain\"] = TextParser;\nexports[\"text/x-tiddlywiki\"] = TextParser;\nexports[\"application/javascript\"] = TextParser;\nexports[\"application/json\"] = TextParser;\nexports[\"text/css\"] = TextParser;\nexports[\"application/x-tiddler-dictionary\"] = TextParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/videoparser.js": {
            "title": "$:/core/modules/parsers/videoparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/videoparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe video parser parses a video tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar VideoParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"video\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"video/ogg\"] = VideoParser;\nexports[\"video/webm\"] = VideoParser;\nexports[\"video/mp4\"] = VideoParser;\nexports[\"video/quicktime\"] = VideoParser;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/wikiparser/rules/codeblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/codeblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for code blocks. For example:\n\n```\n\t```\n\tThis text will not be //wikified//\n\t```\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match and get language if defined\n\tthis.matchRegExp = /```([\\w-]*)\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\\r?\\n```$)/mg;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Return the $codeblock widget\n\treturn [{\n\t\t\ttype: \"codeblock\",\n\t\t\tattributes: {\n\t\t\t\t\tcode: {type: \"string\", value: text},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1]}\n\t\t\t}\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/codeinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/codeinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for code runs. For example:\n\n```\n\tThis is a `code run`.\n\tThis is another ``code run``\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(``?)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = new RegExp(this.match[1], \"mg\");\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"code\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: text\n\t\t}]\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/commentblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/commentblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/commentinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/commentinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/dash.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/dash.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/dash.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for dashes. For example:\n\n```\nThis is an en-dash: --\n\nThis is an em-dash: ---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"dash\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{2,3}(?!-)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar dash = this.match[0].length === 2 ? \"&ndash;\" : \"&mdash;\";\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: dash\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"bold\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /''/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - italic. For example:\n\n```\n\tThis is //italic// text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except italic\n\\rules only italic\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"italic\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\/\\//mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\/\\//mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"em\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - strikethrough. For example:\n\n```\n\tThis is ~~strikethrough~~ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except strikethrough \n\\rules only strikethrough \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strikethrough\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~~/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strike\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - subscript. For example:\n\n```\n\tThis is ,,subscript,, text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except subscript \n\\rules only subscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"subscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /,,/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sub\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - superscript. For example:\n\n```\n\tThis is ^^superscript^^ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except superscript \n\\rules only superscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"superscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\^\\^/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\^\\^/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sup\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - underscore. For example:\n\n```\n\tThis is __underscore__ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except underscore \n\\rules only underscore\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"underscore\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /__/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"u\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/entity.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/entity.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML entities. For example:\n\n```\n\tThis is a copyright symbol: &copy;\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"entity\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar entityString = this.match[1];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the entity\n\treturn [{type: \"entity\", entity: this.match[0]}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/extlink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/extlink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\nAn external link: https://www.tiddlywiki.com/\n\nA suppressed external link: ~http://www.tiddlyspace.com/\n```\n\nExternal links can be suppressed by preceding them with `~`.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"extlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(this.match[0].substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: this.match[0].substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: this.match[0]},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: this.match[0]\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for marking areas with hard line breaks. For example:\n\n```\n\"\"\"\nThis is some text\nThat is set like\nIt is a Poem\nWhen it is\nClearly\nNot\n\"\"\"\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"hardlinebreaks\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\"\"\"(?:\\r?\\n)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\"\"\")|(\\r?\\n)/mg,\n\t\ttree = [],\n\t\tmatch;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tdo {\n\t\t// Parse the run up to the terminator\n\t\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\n\t\t// Redo the terminator match\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tmatch = reEnd.exec(this.parser.source);\n\t\tif(match) {\n\t\t\tthis.parser.pos = reEnd.lastIndex;\n\t\t\t// Add a line break if the terminator was a line break\n\t\t\tif(match[2]) {\n\t\t\t\ttree.push({type: \"element\", tag: \"br\"});\n\t\t\t}\n\t\t}\n\t} while(match && !match[1]);\n\t// Return the nodes\n\treturn tree;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/heading.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/heading.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"heading\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(!{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classes = this.parser.parseClasses();\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel, \n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \")}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/horizrule.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/horizrule.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for rules. For example:\n\n```\n---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"horizrule\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{3,}\\r?(?:\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{type: \"element\", tag: \"hr\"}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/html.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/html.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for HTML elements and widgets. For example:\n\n{{{\n<aside>\nThis is an HTML5 aside element\n</aside>\n\n<$slider target=\"MyTiddler\">\nThis is a widget invocation\n</$slider>\n\n}}}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"html\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\n\t\trequireLineBreak: this.is.block\n\t});\n\treturn this.nextTag ? this.nextTag.start : undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Retrieve the most recent match so that recursive calls don't overwrite it\n\tvar tag = this.nextTag;\n\tthis.nextTag = null;\n\t// Advance the parser position to past the tag\n\tthis.parser.pos = tag.end;\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Set whether we're in block mode\n\ttag.isBlock = this.is.block || hasLineBreak;\n\t// Parse the body if we need to\n\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\n\t\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\",\n\t\t\t\treEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd);\n\t\t}\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tvar endMatch = reEnd.exec(this.parser.source);\n\t\tif(endMatch && endMatch.index === this.parser.pos) {\n\t\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.slice(1).indexOf(\"$\") !== -1) {\n\t\treturn null;\n\t}\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Check that the tag is terminated by a space, / or >\n\tif(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === \"/\") && !(source.charAt(pos) === \">\") ) {\n\t\treturn null;\n\t}\n\t// Process attributes\n\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\twhile(attribute) {\n\t\tnode.attributes[attribute.name] = attribute;\n\t\tpos = attribute.end;\n\t\t// Get the next attribute\n\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a closing slash\n\ttoken = $tw.utils.parseTokenString(source,pos,\"/\");\n\tif(token) {\n\t\tpos = token.end;\n\t\tnode.isSelfClosing = true;\n\t}\n\t// Look for a greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Check for a required line break\n\tif(options.requireLineBreak) {\n\t\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\tif(!token) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.findNextTag = function(source,pos,options) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /<([a-zA-Z\\-\\$]+)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseTag(source,match.index,options);\n\t\t// Return success\n\t\tif(tag && this.isLegalTag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\nexports.isLegalTag = function(tag) {\n\t// Widgets are always OK\n\tif(tag.type !== \"element\") {\n\t\treturn true;\n\t// If it's an HTML tag that starts with a dash then it's not legal\n\t} else if(tag.tag.charAt(0) === \"-\") {\n\t\treturn false;\n\t} else {\n\t\t// Otherwise it's OK\n\t\treturn true;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/image.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/image.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for embedding images. For example:\n\n```\n[img[https://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [https://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [https://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|https://tiddlywiki.com/fractalveg.jpg]]\n[img[TiddlerTitle]]\n[img[Description of image|TiddlerTitle]]\n```\n\nGenerates the `<$image>` widget.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"image\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\n\treturn this.nextImage ? this.nextImage.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextImage.end;\n\tvar node = {\n\t\ttype: \"image\",\n\t\tattributes: this.nextImage.attributes\n\t};\n\treturn [node];\n};\n\n/*\nFind the next image from the current position\n*/\nexports.findNextImage = function(source,pos) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /(\\[img)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseImage(source,match.index);\n\t\t// Return success\n\t\tif(tag) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \"image\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseImage = function(source,pos) {\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"image\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[img`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[img\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Process attributes\n\tif(source.charAt(pos) !== \"[\") {\n\t\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\t\twhile(attribute) {\n\t\t\tnode.attributes[attribute.name] = attribute;\n\t\t\tpos = attribute.end;\n\t\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t\tif(source.charAt(pos) !== \"[\") {\n\t\t\t\t// Get the next attribute\n\t\t\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t\t\t} else {\n\t\t\t\tattribute = null;\n\t\t\t}\n\t\t}\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[` after the attributes\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the source up to the terminating `]]`\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\]]*?)\\|)?([^\\]]+?)\\]\\]/g);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\tif(token.match[1]) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: token.match[1].trim()};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim()};\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/import.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/import.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/import.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for importing variable definitions\n\n```\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"import\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\import[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the filter terminated by a line break\n\tvar reMatch = /(.*)(\\r?\\n)|$/mg;\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\tthis.parser.pos = reMatch.lastIndex;\n\t// Parse tree nodes to return\n\treturn [{\n\t\ttype: \"importvariables\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: match[1]}\n\t\t},\n\t\tchildren: []\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/list.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/list.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"list\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\*#;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"*\": {listTag: \"ul\", itemTag: \"li\"},\n\t\"#\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"div\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\*#;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for block macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^>\\s]+)(?:\\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\\r?\\n|$)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: true\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^\\s>]+)\\s*([\\s\\S]*?)>>/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/macrodef.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/macrodef.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for macro definitions\n\n```\n\\define name(param:defaultvalue,param2:defaultvalue)\ndefinition text, including $param$ markers\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrodef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\define\\s+([^(\\s]+)\\(\\s*([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar paramString = this.match[2],\n\t\tparams = [];\n\tif(paramString !== \"\") {\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))?/mg,\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\twhile(paramMatch) {\n\t\t\t// Save the parameter details\n\t\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\n\t\t\tif(defaultValue) {\n\t\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t\t}\n\t\t\tparams.push(paramInfo);\n\t\t\t// Look for the next parameter\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n\t// Is this a multiline definition?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, the end of the body is marked with \\end\n\t\treEnd = /(\\r?\\n\\\\end[^\\S\\n\\r]*(?:$|\\r?\\n))/mg;\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /($|\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"set\",\n\t\tattributes: {\n\t\t\tname: {type: \"string\", value: this.match[1]},\n\t\t\tvalue: {type: \"string\", value: text}\n\t\t},\n\t\tchildren: [],\n\t\tparams: params,\n\t\tisMacroDefinition: true\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\n[ext[https://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|https://tiddlywiki.com/fractalveg.jpg]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettyextlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\n\treturn this.nextLink ? this.nextLink.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextLink.end;\n\treturn [this.nextLink];\n};\n\n/*\nFind the next link from the current position\n*/\nexports.findNextLink = function(source,pos) {\n\t// A regexp for finding candidate links\n\tvar reLookahead = /(\\[ext\\[)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a link\n\t\tvar link = this.parseLink(source,match.index);\n\t\t// Return success\n\t\tif(link) {\n\t\t\treturn link;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \"element\", tag: \"a\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseLink = function(source,pos) {\n\tvar token,\n\t\ttextNode = {\n\t\t\ttype: \"text\"\n\t\t},\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tstart: pos,\n\t\t\tattributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t},\n\t\t\tchildren: [textNode]\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[ext[`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[ext[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Look ahead for the terminating `]]`\n\tvar closePos = source.indexOf(\"]]\",pos);\n\tif(closePos === -1) {\n\t\treturn null;\n\t}\n\t// Look for a `|` separating the tooltip\n\tvar splitPos = source.indexOf(\"|\",pos);\n\tif(splitPos === -1 || splitPos > closePos) {\n\t\tsplitPos = null;\n\t}\n\t// Pull out the tooltip and URL\n\tvar tooltip, URL;\n\tif(splitPos) {\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t} else {\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL};\n\tnode.attributes.target = {type: \"string\", value: \"_blank\"};\n\tnode.attributes.rel = {type: \"string\", value: \"noopener noreferrer\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/prettylink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/prettylink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for pretty links. For example:\n\n```\n[[Introduction]]\n\n[[Link description|TiddlerTitle]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettylink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Process the link\n\tvar text = this.match[1],\n\t\tlink = this.match[2] || text;\n\tif($tw.utils.isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/quoteblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/quoteblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for quote blocks. For example:\n\n```\n\t<<<.optionalClass(es) optional cited from\n\ta quote\n\t<<<\n\t\n\t<<<.optionalClass(es)\n\ta quote\n\t<<< optional cited from\n```\n\nQuotes can be quoted by putting more <s\n\n```\n\t<<<\n\tQuote Level 1\n\t\n\t<<<<\n\tQuoteLevel 2\n\t<<<<\n\t\n\t<<<\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"quoteblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(<<<+)/mg;\n};\n\nexports.parse = function() {\n\tvar classes = [\"tc-quote\"];\n\t// Get all the details of the match\n\tvar reEndString = \"^\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\n\t// Parse any classes, whitespace and then the optional cite itself\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// before handling the cite, parse the body of the quote\n\tvar tree= this.parser.parseBlocks(reEndString);\n\t// If we got a cite, put it before the text\n\tif(cite.length > 0) {\n\t\ttree.unshift({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// If we got a cite, push it\n\tif(cite.length > 0) {\n\t\ttree.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Return the blockquote element\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"blockquote\",\n\t\tattributes: {\n\t\t\tclass: { type: \"string\", value: classes.join(\" \") },\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/rules.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/rules.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/rules.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for rules specifications\n\n```\n\\rules except ruleone ruletwo rulethree\n\\rules only ruleone ruletwo rulethree\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"rules\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\rules[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(tokens.length > 0) {\n\t\tthis.parser.amendRules(tokens[0],tokens.slice(1));\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/styleblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/styleblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\n\n```\n@@.myClass\n@@background-color:red;\nThis paragraph will have the CSS class `myClass`.\n\n* The `<ul>` around this list will also have the class `myClass`\n* List item 2\n\n@@\n```\n\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\n\n```\n@@.myFirstClass.mySecondClass\n@@width:100px;.myThirdClass\nThis is a paragraph\n@@\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(?:\\.([^\\r\\n\\s]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEndString = \"^@@(?:\\\\r?\\\\n)?\";\n\tvar classes = [], styles = [];\n\tdo {\n\t\t// Get the class and style\n\t\tif(this.match[1]) {\n\t\t\tstyles.push(this.match[1]);\n\t\t}\n\t\tif(this.match[2]) {\n\t\t\tclasses.push(this.match[2].split(\".\").join(\" \"));\n\t\t}\n\t\t// Move past the match\n\t\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\t// Look for another line of classes and styles\n\t\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t} while(this.match && this.match.index === this.parser.pos);\n\t// Parse the body\n\tvar tree = this.parser.parseBlocks(reEndString);\n\tfor(var t=0; t<tree.length; t++) {\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\" \"));\n\t\t}\n\t\tif(styles.length > 0) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(tree[t],\"style\",styles.join(\"\"));\n\t\t}\n\t}\n\treturn tree;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/styleinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/styleinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for assigning styles and classes to inline runs. For example:\n\n```\n@@.myClass This is some text with a class@@\n@@background-color:red;This is some text with a background colour@@\n@@width:100px;.myClass This is some text with a class and a width@@\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(\\.(?:[^\\r\\n\\s]+)\\s+)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /@@/g;\n\t// Get the styles and class\n\tvar stylesString = this.match[1],\n\t\tclassString = this.match[2] ? this.match[2].split(\".\").join(\" \") : undefined;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the run up to the terminator\n\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t// Return the classed span\n\tvar node = {\n\t\ttype: \"element\",\n\t\ttag: \"span\",\n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-inline-style\"}\n\t\t},\n\t\tchildren: tree\n\t};\n\tif(classString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,classString);\n\t}\n\tif(stylesString) {\n\t\t$tw.utils.addAttributeToParseTreeNode(node,\"style\",stylesString);\n\t}\n\treturn [node];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/syslink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/syslink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/syslink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for system tiddler links.\nCan be suppressed preceding them with `~`.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"syslink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp(\n\t\t\"~?\\\\$:\\\\/[\" +\n\t\t$tw.config.textPrimitives.anyLetter.substr(1,$tw.config.textPrimitives.anyLetter.length - 2) +\n\t\t\"\\/._-]+\",\n\t\t\"mg\"\n\t);\n};\n\nexports.parse = function() {\n\tvar match = this.match[0];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(match.substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: match.substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: match}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: match\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/table.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/table.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for tables.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"table\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\|(?:[^\\n]*)\\|(?:[fhck]?)\\r?(?:\\n|$)/mg;\n};\n\nvar processRow = function(prevColumns) {\n\tvar cellRegExp = /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?\\r?(?:\\n|$))/mg,\n\t\tcellTermRegExp = /((?:\\x20*)\\|)/mg,\n\t\ttree = [],\n\t\tcol = 0,\n\t\tcolSpanCount = 1,\n\t\tprevCell,\n\t\tvAlign;\n\t// Match a single cell\n\tcellRegExp.lastIndex = this.parser.pos;\n\tvar cellMatch = cellRegExp.exec(this.parser.source);\n\twhile(cellMatch && cellMatch.index === this.parser.pos) {\n\t\tif(cellMatch[1] === \"~\") {\n\t\t\t// Rowspan\n\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \">\") {\n\t\t\t// Colspan\n\t\t\tcolSpanCount++;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \"<\" && prevCell) {\n\t\t\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\"colspan\",1);\n\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\tcolSpanCount = 1;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[2]) {\n\t\t\t// End of row\n\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\n\t\t\t\t\t\tcolSpanCount += prevCell.attributes.colspan.value;\n\t\t\t\t} else {\n\t\t\t\t\tcolSpanCount -= 1;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\t}\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// For ordinary cells, step beyond the opening `|`\n\t\t\tthis.parser.pos++;\n\t\t\t// Look for a space at the start of the cell\n\t\t\tvar spaceLeft = false;\n\t\t\tvAlign = null;\n\t\t\tif(this.parser.source.substr(this.parser.pos).search(/^\\^([^\\^]|\\^\\^)/) === 0) {\n\t\t\t\tvAlign = \"top\";\n\t\t\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\n\t\t\t\tvAlign = \"bottom\";\n\t\t\t}\n\t\t\tif(vAlign) {\n\t\t\t\tthis.parser.pos++;\n\t\t\t}\n\t\t\tvar chr = this.parser.source.substr(this.parser.pos,1);\n\t\t\twhile(chr === \" \") {\n\t\t\t\tspaceLeft = true;\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tchr = this.parser.source.substr(this.parser.pos,1);\n\t\t\t}\n\t\t\t// Check whether this is a heading cell\n\t\t\tvar cell;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", children: []};\n\t\t\t}\n\t\t\ttree.push(cell);\n\t\t\t// Record information about this cell\n\t\t\tprevCell = cell;\n\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t// Check for a colspan\n\t\t\tif(colSpanCount > 1) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\tcolSpanCount = 1;\n\t\t\t}\n\t\t\t// Parse the cell\n\t\t\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\n\t\t\t// Set the alignment for the cell\n\t\t\tif(vAlign) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"valign\",vAlign);\n\t\t\t}\n\t\t\tif(this.parser.source.substr(this.parser.pos - 2,1) === \" \") { // spaceRight\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t} else if(spaceLeft) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t}\n\t\t\t// Move back to the closing `|`\n\t\t\tthis.parser.pos--;\n\t\t}\n\t\tcol++;\n\t\tcellRegExp.lastIndex = this.parser.pos;\n\t\tcellMatch = cellRegExp.exec(this.parser.source);\n\t}\n\treturn tree;\n};\n\nexports.parse = function() {\n\tvar rowContainerTypes = {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\t\ttable = {type: \"element\", tag: \"table\", children: []},\n\t\trowRegExp = /^\\|([^\\n]*)\\|([fhck]?)\\r?(?:\\n|$)/mg,\n\t\trowTermRegExp = /(\\|(?:[fhck]?)\\r?(?:\\n|$))/mg,\n\t\tprevColumns = [],\n\t\tcurrRowType,\n\t\trowContainer,\n\t\trowCount = 0;\n\t// Match the row\n\trowRegExp.lastIndex = this.parser.pos;\n\tvar rowMatch = rowRegExp.exec(this.parser.source);\n\twhile(rowMatch && rowMatch.index === this.parser.pos) {\n\t\tvar rowType = rowMatch[2];\n\t\t// Check if it is a class assignment\n\t\tif(rowType === \"k\") {\n\t\t\t$tw.utils.addClassToParseTreeNode(table,rowMatch[1]);\n\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t} else {\n\t\t\t// Otherwise, create a new row if this one is of a different type\n\t\t\tif(rowType !== currRowType) {\n\t\t\t\trowContainer = {type: \"element\", tag: rowContainerTypes[rowType], children: []};\n\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\tcurrRowType = rowType;\n\t\t\t}\n\t\t\t// Is this a caption row?\n\t\t\tif(currRowType === \"c\") {\n\t\t\t\t// If so, move past the opening `|` of the row\n\t\t\t\tthis.parser.pos++;\n\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t// Set the alignment - TODO: figure out why TW did this\n//\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t// Parse the caption\n\t\t\t\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\n\t\t\t} else {\n\t\t\t\t// Create the row\n\t\t\t\tvar theRow = {type: \"element\", tag: \"tr\", children: []};\n\t\t\t\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \"oddRow\" : \"evenRow\");\n\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t// Process the row\n\t\t\t\ttheRow.children = processRow.call(this,prevColumns);\n\t\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\trowMatch = rowRegExp.exec(this.parser.source);\n\t}\n\treturn [table];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {},\n\t\t\tisBlock: true\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tisBlock: true,\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/typedblock.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/typedblock.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for typed blocks. For example:\n\n```\n$$$.js\nThis will be rendered as JavaScript\n$$$\n\n$$$.svg\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"150\" height=\"100\">\n  <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n</svg>\n$$$\n\n$$$text/vnd.tiddlywiki>text/html\nThis will be rendered as an //HTML representation// of WikiText\n$$$\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.name = \"typedblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /\\r?\\n\\$\\$\\$\\r?(?:\\n|$)/mg;\n\t// Save the type\n\tvar parseType = this.match[1],\n\t\trenderType = this.match[2];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Parse the block according to the specified type\n\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \"text/plain\"});\n\t// If there's no render type, just return the parse tree\n\tif(!renderType) {\n\t\treturn parser.tree;\n\t} else {\n\t\t// Otherwise, render to the rendertype and return in a <PRE> tag\n\t\tvar widgetNode = this.parser.wiki.makeWidget(parser),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\ttext = renderType === \"text/html\" ? container.innerHTML : container.textContent;\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"pre\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/whitespace.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/whitespace.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/whitespace.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for whitespace specifications\n\n```\n\\whitespace trim\n\\whitespace notrim\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"whitespace\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\whitespace[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\t$tw.utils.each(tokens,function(token) {\n\t\tswitch(token) {\n\t\t\tcase \"trim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = true;\n\t\t\t\tbreak;\n\t\t\tcase \"notrim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = false;\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/rules/wikilink.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/wikilink.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for wiki links. For example:\n\n```\nAWikiLink\nAnotherLink\n~SuppressedLink\n```\n\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \"?\" + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// If the link starts with the unwikilink character then just output it as plain text\n\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\n\t\treturn [{type: \"text\", text: linkText.substr(1)}];\n\t}\n\t// If the link has been preceded with a blocked letter then don't treat it as a link\n\tif(this.match.index > 0) {\n\t\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\"mg\");\n\t\tpreRegExp.lastIndex = this.match.index-1;\n\t\tvar preMatch = preRegExp.exec(this.parser.source);\n\t\tif(preMatch && preMatch.index === this.match.index-1) {\n\t\t\treturn [{type: \"text\", text: linkText}];\n\t\t}\n\t}\n\treturn [{\n\t\ttype: \"link\",\n\t\tattributes: {\n\t\t\tto: {type: \"string\", value: linkText}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: linkText\n\t\t}]\n\t}];\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/core/modules/parsers/wikiparser/wikiparser.js": {
            "title": "$:/core/modules/parsers/wikiparser/wikiparser.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe wiki text parser processes blocks of source text into a parse tree.\n\nThe parse tree is made up of nested arrays of these JavaScript objects:\n\n\t{type: \"element\", tag: <string>, attributes: {}, children: []} - an HTML element\n\t{type: \"text\", text: <string>} - a text node\n\t{type: \"entity\", value: <string>} - an entity\n\t{type: \"raw\", html: <string>} - raw HTML\n\nAttributes are stored as hashmaps of the following objects:\n\n\t{type: \"string\", value: <string>} - literal string\n\t{type: \"indirect\", textReference: <textReference>} - indirect through a text reference\n\t{type: \"macro\", macro: <TBD>} - indirect through a macro invocation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\tvar self = this;\n\t// Check for an externally linked tiddler\n\tif($tw.browser && (text || \"\") === \"\" && options._canonical_uri) {\n\t\tthis.loadRemoteTiddler(options._canonical_uri);\n\t\ttext = $tw.language.getRawString(\"LazyLoadingWarning\");\n\t}\n\t// Initialise the classes if we don't have them already\n\tif(!this.pragmaRuleClasses) {\n\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\"$:/config/WikiParserRules/Pragmas/\");\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\"$:/config/WikiParserRules/Block/\");\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\"$:/config/WikiParserRules/Inline/\");\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Flag for ignoring whitespace\n\tthis.configTrimWhiteSpace = false;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = [];\n\tvar topBranch = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\ttopBranch.push.apply(topBranch,this.parseInlineRun());\n\t} else {\n\t\ttopBranch.push.apply(topBranch,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\n*/\nWikiParser.prototype.loadRemoteTiddler = function(url) {\n\tvar self = this;\n\t$tw.utils.httpRequest({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tcallback: function(err,data) {\n\t\t\tif(!err) {\n\t\t\t\tvar tiddlers = self.wiki.deserializeTiddlers(\".tid\",data,self.wiki.getCreationFields());\n\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\ttiddler[\"_canonical_uri\"] = url;\n\t\t\t\t});\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tself.wiki.addTiddlers(tiddlers);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\n*/\nWikiParser.prototype.setupRules = function(proto,configPrefix) {\n\tvar self = this;\n\tif(!$tw.safemode) {\n\t\t$tw.utils.each(proto,function(object,name) {\n\t\t\tif(self.wiki.getTiddlerText(configPrefix + name,\"enable\") !== \"enable\") {\n\t\t\t\tdelete proto[name];\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined  && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar currentTreeBranch = this.tree;\n\twhile(true) {\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\tvar subTree = nextMatch.rule.parse();\n\t\tif(subTree.length > 0) {\n\t\t\t// Quick hack; we only cope with a single parse tree node being returned, which is true at the moment\n\t\t\tcurrentTreeBranch.push.apply(currentTreeBranch,subTree);\n\t\t\tsubTree[0].children = [];\n\t\t\tcurrentTreeBranch = subTree[0].children;\n\t\t}\n\t}\n\treturn currentTreeBranch;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\"(\" + terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n)\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\treturn nextMatch.rule.parse();\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\treturn [{type: \"element\", tag: \"p\", children: this.parseInlineRun(terminatorRegExp)}];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(\"(\" + terminatorRegExpString + \")\",\"mg\"),\n\t\ttree = [];\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t//  Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\ttree.push.apply(tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t//  Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t}\n\treturn tree;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex));\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t\t// Look for the next run rule\n\t\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\toptions = options || {};\n\tvar tree = [];\n\t// Find the next occurrence of the terminator\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\t// Find the next occurrence of a inlinerule\n\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\n\t\t// Return if we've found the terminator, and it precedes any inline rule match\n\t\tif(terminatorMatch) {\n\t\t\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\n\t\t\t\tif(terminatorMatch.index > this.pos) {\n\t\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index));\n\t\t\t\t}\n\t\t\t\tthis.pos = terminatorMatch.index;\n\t\t\t\tif(options.eatTerminator) {\n\t\t\t\t\tthis.pos += terminatorMatch[0].length;\n\t\t\t\t}\n\t\t\t\treturn tree;\n\t\t\t}\n\t\t}\n\t\t// Process any inline rule, along with the text preceding it\n\t\tif(inlineRuleMatch) {\n\t\t\t// Preceding text\n\t\t\tif(inlineRuleMatch.matchIndex > this.pos) {\n\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex));\n\t\t\t\tthis.pos = inlineRuleMatch.matchIndex;\n\t\t\t}\n\t\t\t// Process the inline rule\n\t\t\ttree.push.apply(tree,inlineRuleMatch.rule.parse());\n\t\t\t// Look for the next inline rule\n\t\t\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t\t\t// Look for the next terminator match\n\t\t\tterminatorRegExp.lastIndex = this.pos;\n\t\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\t}\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\n/*\nPush a text widget onto an array, respecting the configTrimWhiteSpace setting\n*/\nWikiParser.prototype.pushTextWidget = function(array,text) {\n\tif(this.configTrimWhiteSpace) {\n\t\ttext = $tw.utils.trim(text);\n\t}\n\tif(text) {\n\t\tarray.push({type: \"text\", text: text});\t\t\n\t}\n};\n\n/*\nParse zero or more class specifiers `.classname`\n*/\nWikiParser.prototype.parseClasses = function() {\n\tvar classRegExp = /\\.([^\\s\\.]+)/mg,\n\t\tclassNames = [];\n\tclassRegExp.lastIndex = this.pos;\n\tvar match = classRegExp.exec(this.source);\n\twhile(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tclassNames.push(match[1]);\n\t\tmatch = classRegExp.exec(this.source);\n\t}\n\treturn classNames;\n};\n\n/*\nAmend the rules used by this instance of the parser\n\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\n\tnames: array of rule names\n*/\nWikiParser.prototype.amendRules = function(type,names) {\n\tnames = names || [];\n\t// Define the filter function\n\tvar target;\n\tif(type === \"only\") {\n\t\ttarget = true;\n\t} else if(type === \"except\") {\n\t\ttarget = false;\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif((names.indexOf(ruleArray[t].rule.name) === -1) === target) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js": {
            "title": "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js",
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\ntype: application/javascript\nmodule-type: global\n\nBase class for wiki parser rules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\n*/\nvar WikiRuleBase = function() {\n};\n\n/*\nTo be overridden by individual rules\n*/\nWikiRuleBase.prototype.init = function(parser) {\n\tthis.parser = parser;\n};\n\n/*\nDefault implementation of findNextMatch uses RegExp matching\n*/\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\treturn this.match ? this.match.index : undefined;\n};\n\nexports.WikiRuleBase = WikiRuleBase;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/pluginswitcher.js": {
            "title": "$:/core/modules/pluginswitcher.js",
            "text": "/*\\\ntitle: $:/core/modules/pluginswitcher.js\ntype: application/javascript\nmodule-type: global\n\nManages switching plugins for themes and languages.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\noptions:\nwiki: wiki store to be used\npluginType: type of plugin to be switched\ncontrollerTitle: title of tiddler used to control switching of this resource\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\nonSwitch: callback when plugin is switched (single parameter is array of plugin titles)\n*/\nfunction PluginSwitcher(options) {\n\tthis.wiki = options.wiki;\n\tthis.pluginType = options.pluginType;\n\tthis.controllerTitle = options.controllerTitle;\n\tthis.defaultPlugins = options.defaultPlugins || [];\n\tthis.onSwitch = options.onSwitch;\n\t// Switch to the current plugin\n\tthis.switchPlugins();\n\t// Listen for changes to the selected plugin\n\tvar self = this;\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,self.controllerTitle)) {\n\t\t\tself.switchPlugins();\n\t\t}\n\t});\n}\n\nPluginSwitcher.prototype.switchPlugins = function() {\n\t// Get the name of the current theme\n\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\n\t// If it doesn't exist, then fallback to one of the default themes\n\tvar index = 0;\n\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {\n\t\tselectedPluginTitle = this.defaultPlugins[index++];\n\t}\n\t// Accumulate the titles of the plugins that we need to load\n\tvar plugins = [],\n\t\tself = this,\n\t\taccumulatePlugin = function(title) {\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\n\t\t\t\tplugins.push(title);\n\t\t\t\tvar pluginInfo = JSON.parse(self.wiki.getTiddlerText(title)),\n\t\t\t\t\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \"\");\n\t\t\t\t$tw.utils.each(dependents,function(title) {\n\t\t\t\t\taccumulatePlugin(title);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\taccumulatePlugin(selectedPluginTitle);\n\t// Read the plugin info for the incoming plugins\n\tvar changes = $tw.wiki.readPluginInfo(plugins);\n\t// Unregister any existing theme tiddlers\n\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\n\t// Register any new theme tiddlers\n\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\n\t// Unpack the current theme tiddlers\n\t$tw.wiki.unpackPluginTiddlers();\n\t// Call the switch handler\n\tif(this.onSwitch) {\n\t\tthis.onSwitch(plugins);\n\t}\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/saver-handler.js": {
            "title": "$:/core/modules/saver-handler.js",
            "text": "/*\\\ntitle: $:/core/modules/saver-handler.js\ntype: application/javascript\nmodule-type: global\n\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the saver handler with the following options:\nwiki: wiki to be synced\ndirtyTracking: true if dirty tracking should be performed\n*/\nfunction SaverHandler(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.dirtyTracking = options.dirtyTracking;\n\tthis.preloadDirty = options.preloadDirty || [];\n\tthis.pendingAutoSave = false;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"saver-handler\");\n\t// Initialise our savers\n\tif($tw.browser) {\n\t\tthis.initSavers();\n\t}\n\t// Only do dirty tracking if required\n\tif($tw.browser && this.dirtyTracking) {\n\t\t// Compile the dirty tiddler filter\n\t\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t\t// Count of changes that have not yet been saved\n\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(self.preloadDirty,function(title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t});\n\t\tthis.numChanges = filteredChanges.length;\n\t\t// Listen out for changes to tiddlers\n\t\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t// Filter the changes so that we only count changes to tiddlers that we care about\n\t\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Adjust the number of changes\n\t\t\tself.numChanges += filteredChanges.length;\n\t\t\tself.updateDirtyStatus();\n\t\t\t// Do any autosave if one is pending and there's no more change events\n\t\t\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.pendingAutoSave = false;\n\t\t\t}\n\t\t});\n\t\t// Listen for the autosave event\n\t\t$tw.rootWidget.addEventListener(\"tm-auto-save-wiki\",function(event) {\n\t\t\t// Do the autosave unless there are outstanding tiddler change events\n\t\t\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise put ourselves in the \"pending autosave\" state and wait for the change event before we do the autosave\n\t\t\t\tself.pendingAutoSave = true;\n\t\t\t}\n\t\t});\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t}\n\t// Install the save action handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget.addEventListener(\"tm-save-wiki\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-download-file\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\tmethod: \"download\",\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t}\n}\n\nSaverHandler.prototype.titleSyncFilter = \"$:/config/SaverFilter\";\nSaverHandler.prototype.titleAutoSave = \"$:/config/AutoSave\";\nSaverHandler.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\n\n/*\nSelect the appropriate saver modules and set them up\n*/\nSaverHandler.prototype.initSavers = function(moduleType) {\n\tmoduleType = moduleType || \"saver\";\n\t// Instantiate the available savers\n\tthis.savers = [];\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tif(module.canSave(self)) {\n\t\t\tself.savers.push(module.create(self.wiki));\n\t\t}\n\t});\n\t// Sort the savers into priority order\n\tthis.savers.sort(function(a,b) {\n\t\tif(a.info.priority < b.info.priority) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(a.info.priority > b.info.priority) {\n\t\t\t\treturn +1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nSave the wiki contents. Options are:\n\tmethod: \"save\", \"autosave\" or \"download\"\n\ttemplate: the tiddler containing the template to save\n\tdownloadType: the content type for the saved file\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tmethod = options.method || \"save\";\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && ($tw.config.disableAutoSave || this.wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\")) {\n\t\treturn false;\n\t}\n\tvar\tvariables = options.variables || {},\n\t\ttemplate = options.template || \"$:/core/save/all\",\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = this.wiki.renderTiddler(downloadType,template,options),\n\t\tcallback = function(err) {\n\t\t\tif(err) {\n\t\t\t\talert($tw.language.getString(\"Error/WhileSaving\") + \":\\n\\n\" + err);\n\t\t\t} else {\n\t\t\t\t// Clear the task queue if we're saving (rather than downloading)\n\t\t\t\tif(method !== \"download\") {\n\t\t\t\t\tself.numChanges = 0;\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t}\n\t\t\t\t$tw.notifier.display(self.titleSavedNotification);\n\t\t\t\tif(options.callback) {\n\t\t\t\t\toptions.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Call the highest priority saver that supports this method\n\tfor(var t=this.savers.length-1; t>=0; t--) {\n\t\tvar saver = this.savers[t];\n\t\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\n\t\t\tthis.logger.log(\"Saving wiki with method\",method,\"through saver\",saver.info.name);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSaverHandler.prototype.isDirty = function() {\n\treturn this.numChanges > 0;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSaverHandler.prototype.updateDirtyStatus = function() {\n\tvar self = this;\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\t$tw.utils.toggleClass(win.document.body,\"tc-dirty\",self.isDirty());\n\t\t});\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/savers/andtidwiki.js": {
            "title": "$:/core/modules/savers/andtidwiki.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/andtidwiki.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the AndTidWiki Android app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar AndTidWiki = function(wiki) {\n};\n\nAndTidWiki.prototype.save = function(text,method,callback,options) {\n\tvar filename = options && options.variables ? options.variables.filename : null;\n\tif (method === \"download\") {\n\t\t// Support download\n\t\tif (window.twi.saveDownload) {\n\t\t\ttry {\n\t\t\t\twindow.twi.saveDownload(text,filename);\n\t\t\t} catch(err) {\n\t\t\t\tif (err.message === \"Method not found\") {\n\t\t\t\t\twindow.twi.saveDownload(text);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvar link = document.createElement(\"a\");\n\t\t\tlink.setAttribute(\"href\",\"data:text/plain,\" + encodeURIComponent(text));\n\t\t\tif (filename) {\n\t\t\t    link.setAttribute(\"download\",filename);\n\t\t\t}\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t}\n\t} else if (window.twi.saveWiki) {\n\t\t// Direct save in Tiddloid\n\t\twindow.twi.saveWiki(text);\n\t} else {\n\t\t// Get the pathname of this document\n\t\tvar pathname = decodeURIComponent(document.location.toString().split(\"#\")[0]);\n\t\t// Strip the file://\n\t\tif(pathname.indexOf(\"file://\") === 0) {\n\t\t\tpathname = pathname.substr(7);\n\t\t}\n\t\t// Strip any query or location part\n\t\tvar p = pathname.indexOf(\"?\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\tp = pathname.indexOf(\"#\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\t// Save the file\n\t\twindow.twi.saveFile(pathname,text);\n\t}\n\t// Call the callback\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nAndTidWiki.prototype.info = {\n\tname: \"andtidwiki\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.twi && !!window.twi.saveFile;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new AndTidWiki(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/beaker.js": {
            "title": "$:/core/modules/savers/beaker.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/beaker.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Beaker browser's (https://beakerbrowser.com) Dat protocol (https://datproject.org/)\nCompatible with beaker >= V0.7.2\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar BeakerSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nBeakerSaver.prototype.save = function(text,method,callback) {\n\tvar dat = new DatArchive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Beaker Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Beaker Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nBeakerSaver.prototype.info = {\n\tname: \"beaker\",\n\tpriority: 3000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.DatArchive && location.protocol===\"dat:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new BeakerSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/custom.js": {
            "title": "$:/core/modules/savers/custom.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/custom.js\ntype: application/javascript\nmodule-type: saver\n\nLooks for `window.$tw.customSaver` first on the current window, then\non the parent window (of an iframe). If present, the saver must define\n\tsave: function(text,method,callback) { ... }\nand the saver may define\n\tpriority: number\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar findSaver = function(window) {\n\ttry {\n\t\treturn window && window.$tw && window.$tw.customSaver;\n\t} catch (err) {\n\t\t// Catching the exception is the most reliable way to detect cross-origin iframe errors.\n\t\t// For example, instead of saying that `window.parent.$tw` is undefined, Firefox will throw\n\t\t//   Uncaught DOMException: Permission denied to access property \"$tw\" on cross-origin object\n\t\tconsole.log({ msg: \"custom saver is disabled\", reason: err });\n\t\treturn null;\n\t}\n}\nvar saver = findSaver(window) || findSaver(window.parent) || {};\n\nvar CustomSaver = function(wiki) {\n};\n\nCustomSaver.prototype.save = function(text,method,callback) {\n\treturn saver.save(text, method, callback);\n};\n\n/*\nInformation about this saver\n*/\nCustomSaver.prototype.info = {\n\tname: \"custom\",\n\tpriority: saver.priority || 4000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!(saver.save);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new CustomSaver(wiki);\n};\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/download.js": {
            "title": "$:/core/modules/savers/download.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/download.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar DownloadSaver = function(wiki) {\n};\n\nDownloadSaver.prototype.save = function(text,method,callback,options) {\n\toptions = options || {};\n\t// Get the current filename\n\tvar filename = options.variables.filename;\n\tif(!filename) {\n\t\tvar p = document.location.pathname.lastIndexOf(\"/\");\n\t\tif(p !== -1) {\n\t\t\t// We decode the pathname because document.location is URL encoded by the browser\n\t\t\tfilename = decodeURIComponent(document.location.pathname.substr(p+1));\n\t\t}\n\t}\n\tif(!filename) {\n\t\tfilename = \"tiddlywiki.html\";\n\t}\n\t// Set up the link\n\tvar link = document.createElement(\"a\");\n\tif(Blob !== undefined) {\n\t\tvar blob = new Blob([text], {type: \"text/html\"});\n\t\tlink.setAttribute(\"href\", URL.createObjectURL(blob));\n\t} else {\n\t\tlink.setAttribute(\"href\",\"data:text/html,\" + encodeURIComponent(text));\n\t}\n\tlink.setAttribute(\"download\",filename);\n\tdocument.body.appendChild(link);\n\tlink.click();\n\tdocument.body.removeChild(link);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nDownloadSaver.prototype.info = {\n\tname: \"download\",\n\tpriority: 100\n};\n\nObject.defineProperty(DownloadSaver.prototype.info, \"capabilities\", {\n\tget: function() {\n\t\tvar capabilities = [\"save\", \"download\"];\n\t\tif(($tw.wiki.getTextReference(\"$:/config/DownloadSaver/AutoSave\") || \"\").toLowerCase() === \"yes\") {\n\t\t\tcapabilities.push(\"autosave\");\n\t\t}\n\t\treturn capabilities;\n\t}\n});\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn document.createElement(\"a\").download !== undefined;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new DownloadSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/fsosaver.js": {
            "title": "$:/core/modules/savers/fsosaver.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/fsosaver.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via MS FileSystemObject ActiveXObject\n\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar FSOSaver = function(wiki) {\n};\n\nFSOSaver.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = unescape(document.location.pathname);\n\t// Test for a Windows path of the form /x:\\blah...\n\tif(/^\\/[A-Z]\\:\\\\[^\\\\]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t} else if(document.location.hostname !== \"\" && /^\\/\\\\[^\\\\]+\\\\[^\\\\]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t\t// reconstruct UNC path\n\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t} else {\n\t\treturn false;\n\t}\n\t// Save the file (as UTF-16)\n\tvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\n\tfile.Write(text);\n\tfile.Close();\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nFSOSaver.prototype.info = {\n\tname: \"FSOSaver\",\n\tpriority: 120,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\ttry {\n\t\treturn (window.location.protocol === \"file:\") && !!(new ActiveXObject(\"Scripting.FileSystemObject\"));\n\t} catch(e) { return false; }\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new FSOSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/gitea.js": {
            "title": "$:/core/modules/savers/gitea.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/gitea.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the gitea\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GiteaSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGiteaSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/Gitea/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"Gitea\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/Gitea/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/Gitea/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/Gitea/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/Gitea/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/Gitea/ServerURL\") || \"https://gitea\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"token \" + password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar use_put = true;\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(sha === \"\"){\n\t\t\t\t\tuse_put = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: endpoint + \"/repos/\" + repo + \"/branches/\" + branch,\n\t\t\t\ttype: \"GET\",\n\t\t\t\theaders: headers,\n\t\t\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\t\t\tif(xhr.status === 404) {\n\t\t\t\t\t\tcallback(\"Please ensure the branch in the Gitea repo exists\");\n\t\t\t\t\t}else{\n\t\t\t\t\t\tdata[\"branch\"] = branch;\n\t\t\t\t\t\tself.upload(uri + filename, use_put?\"PUT\":\"POST\", headers, data, callback);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\nGiteaSaver.prototype.upload = function(uri,method,headers,data,callback) {\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: method,\n\t\theaders: headers,\n\t\tdata: JSON.stringify(data),\n\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\tcallback(null);\n\t\t}\n\t});\n};\n\n/*\nInformation about this saver\n*/\nGiteaSaver.prototype.info = {\n\tname: \"Gitea\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GiteaSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/github.js": {
            "title": "$:/core/modules/savers/github.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/github.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitHub v3 REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitHubSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitHubSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitHub/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"github\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitHub/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitHub/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitHub/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitHub/Branch\") || \"main\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitHub/ServerURL\") || \"https://api.github.com\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/vnd.github.v3+json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"Basic \" + window.btoa(username + \":\" + password),\n\t\t\t\"If-None-Match\": \"\"\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a PUT request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + filename,\n\t\t\t\ttype: \"PUT\",\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitHubSaver.prototype.info = {\n\tname: \"github\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitHubSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/gitlab.js": {
            "title": "$:/core/modules/savers/gitlab.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/gitlab.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitLab REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: true */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitLabSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitLabSaver.prototype.save = function(text,method,callback) {\n\t/* See https://docs.gitlab.com/ee/api/repository_files.html */\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitLab/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"gitlab\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitLab/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitLab/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitLab/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitLab/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitLab/ServerURL\") || \"https://gitlab.com/api/v4\",\n\t\theaders = {\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Private-Token\": password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/projects/\" + encodeURIComponent(repo) + \"/repository/\";\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri + \"tree/?path=\" + encodeURIComponent(path.replace(/^\\/+|\\/$/g, '')) + \"&branch=\" + encodeURIComponent(branch.replace(/^\\/+|\\/$/g, '')),\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar requestType = \"POST\";\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\trequestType = \"PUT\";\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tcommit_message: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: text,\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + \"files/\" + encodeURIComponent(path.replace(/^\\/+/, '') + filename),\n\t\t\t\ttype: requestType,\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitLabSaver.prototype.info = {\n\tname: \"gitlab\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitLabSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/hyperdrive.js": {
            "title": "$:/core/modules/savers/hyperdrive.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/hyperdrive.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Hyperdrive Protocol (https://hypercore-protocol.org/#hyperdrive) Beaker browser beta-1.0 and later (https://beakerbrowser.com)\nCompatible with beaker >= V1.0.0\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar HyperdriveSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nHyperdriveSaver.prototype.save = function(text,method,callback) {\n\tvar dat = beaker.hyperdrive.drive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Hyperdrive Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Hyperdrive Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nHyperdriveSaver.prototype.info = {\n\tname: \"beaker-1.x\",\n\tpriority: 3000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.beaker && !!beaker.hyperdrive && location.protocol===\"hyper:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new HyperdriveSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/manualdownload.js": {
            "title": "$:/core/modules/savers/manualdownload.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/manualdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Title of the tiddler containing the download message\nvar downloadInstructionsTitle = \"$:/language/Modals/Download\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar ManualDownloadSaver = function(wiki) {\n};\n\nManualDownloadSaver.prototype.save = function(text,method,callback) {\n\t$tw.modal.display(downloadInstructionsTitle,{\n\t\tdownloadLink: \"data:text/html,\" + encodeURIComponent(text)\n\t});\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nManualDownloadSaver.prototype.info = {\n\tname: \"manualdownload\",\n\tpriority: 0,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new ManualDownloadSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/msdownload.js": {
            "title": "$:/core/modules/savers/msdownload.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/msdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via window.navigator.msSaveBlob()\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar MsDownloadSaver = function(wiki) {\n};\n\nMsDownloadSaver.prototype.save = function(text,method,callback) {\n\t// Get the current filename\n\tvar filename = \"tiddlywiki.html\",\n\t\tp = document.location.pathname.lastIndexOf(\"/\");\n\tif(p !== -1) {\n\t\tfilename = document.location.pathname.substr(p+1);\n\t}\n\t// Set up the link\n\tvar blob = new Blob([text], {type: \"text/html\"});\n\twindow.navigator.msSaveBlob(blob,filename);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nMsDownloadSaver.prototype.info = {\n\tname: \"msdownload\",\n\tpriority: 110,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.navigator.msSaveBlob;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new MsDownloadSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/put.js": {
            "title": "$:/core/modules/savers/put.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/put.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by performing a PUT request to the server\n\nWorks with any server which accepts a PUT request\nto the current URL, such as a WebDAV server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRetrieve ETag if available\n*/\nvar retrieveETag = function(self) {\n\tvar headers = {\n\t\tAccept: \"*/*;charset=UTF-8\"\n\t};\n\t$tw.utils.httpRequest({\n\t\turl: self.uri(),\n\t\ttype: \"HEAD\",\n\t\theaders: headers,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar etag = xhr.getResponseHeader(\"ETag\");\n\t\t\tif(!etag) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tself.etag = etag.replace(/^W\\//,\"\");\n\t\t}\n\t});\n};\n\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar PutSaver = function(wiki) {\n\tthis.wiki = wiki;\n\tvar self = this;\n\tvar uri = this.uri();\n\t// Async server probe. Until probe finishes, save will fail fast\n\t// See also https://github.com/Jermolene/TiddlyWiki5/issues/2276\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"OPTIONS\",\n\t\tcallback: function(err,data,xhr) {\n\t\t\t// Check DAV header http://www.webdav.org/specs/rfc2518.html#rfc.section.9.1\n\t\t\tif(!err) {\n\t\t\t\tself.serverAcceptsPuts = xhr.status === 200 && !!xhr.getResponseHeader(\"dav\");\n\t\t\t}\n\t\t}\n\t});\n\tretrieveETag(this);\n};\n\nPutSaver.prototype.uri = function() {\n\treturn document.location.toString().split(\"#\")[0];\n};\n\n// TODO: in case of edit conflict\n// Prompt: Do you want to save over this? Y/N\n// Merging would be ideal, and may be possible using future generic merge flow\nPutSaver.prototype.save = function(text,method,callback) {\n\tif(!this.serverAcceptsPuts) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tvar headers = {\n\t\t\"Content-Type\": \"text/html;charset=UTF-8\"\n\t};\n\tif(this.etag) {\n\t\theaders[\"If-Match\"] = this.etag;\n\t}\n\t$tw.utils.httpRequest({\n\t\turl: this.uri(),\n\t\ttype: \"PUT\",\n\t\theaders: headers,\n\t\tdata: text,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\t// response is textual: \"XMLHttpRequest error code: 412\"\n\t\t\t\tvar status = Number(err.substring(err.indexOf(':') + 2, err.length))\n\t\t\t\tif(status === 412) { // edit conflict\n\t\t\t\t\tvar message = $tw.language.getString(\"Error/EditConflict\");\n\t\t\t\t\tcallback(message);\n\t\t\t\t} else {\n\t\t\t\t\tcallback(err); // fail\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.etag = xhr.getResponseHeader(\"ETag\");\n\t\t\t\tif(self.etag == null) {\n\t\t\t\t\tretrieveETag(self);\n\t\t\t\t}\n\t\t\t\tcallback(null); // success\n\t\t\t}\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nPutSaver.prototype.info = {\n\tname: \"put\",\n\tpriority: 2000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn /^https?:/.test(location.protocol);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new PutSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/tiddlyfox.js": {
            "title": "$:/core/modules/savers/tiddlyfox.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/tiddlyfox.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TiddlyFox file extension\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TiddlyFoxSaver = function(wiki) {\n};\n\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\n\tvar messageBox = document.getElementById(\"tiddlyfox-message-box\");\n\tif(messageBox) {\n\t\t// Get the pathname of this document\n\t\tvar pathname = document.location.toString().split(\"#\")[0];\n\t\t// Replace file://localhost/ with file:///\n\t\tif(pathname.indexOf(\"file://localhost/\") === 0) {\n\t\t\tpathname = \"file://\" + pathname.substr(16);\n\t\t}\n\t\t// Windows path file:///x:/blah/blah --> x:\\blah\\blah\n\t\tif(/^file\\:\\/\\/\\/[A-Z]\\:\\//i.test(pathname)) {\n\t\t\t// Remove the leading slash and convert slashes to backslashes\n\t\t\tpathname = pathname.substr(8).replace(/\\//g,\"\\\\\");\n\t\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\n\t\t} else if(pathname.indexOf(\"file://///\") === 0) {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\//g,\"\\\\\");\n\t\t// Mac/Unix local path file:///path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:///\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(7));\n\t\t// Mac/Unix local path file:/path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:/\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(5));\n\t\t// Otherwise Windows networth path file://server/share/path/path --> \\\\server\\share\\path\\path\n\t\t} else {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\"/\",\"g\"),\"\\\\\");\n\t\t}\n\t\t// Create the message element and put it in the message box\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.setAttribute(\"data-tiddlyfox-path\",decodeURIComponent(pathname));\n\t\tmessage.setAttribute(\"data-tiddlyfox-content\",text);\n\t\tmessageBox.appendChild(message);\n\t\t// Add an event handler for when the file has been saved\n\t\tmessage.addEventListener(\"tiddlyfox-have-saved-file\",function(event) {\n\t\t\tcallback(null);\n\t\t}, false);\n\t\t// Create and dispatch the custom event to the extension\n\t\tvar event = document.createEvent(\"Events\");\n\t\tevent.initEvent(\"tiddlyfox-save-file\",true,false);\n\t\tmessage.dispatchEvent(event);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyFoxSaver.prototype.info = {\n\tname: \"tiddlyfox\",\n\tpriority: 1500,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/tiddlyie.js": {
            "title": "$:/core/modules/savers/tiddlyie.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/tiddlyie.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar TiddlyIESaver = function(wiki) {\n};\n\nTiddlyIESaver.prototype.save = function(text,method,callback) {\n\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\n\tif(typeof(window.TiddlyIE) != \"undefined\") {\n\t\t// Get the pathname of this document\n\t\tvar pathname = unescape(document.location.pathname);\n\t\t// Test for a Windows path of the form /x:/blah...\n\t\tif(/^\\/[A-Z]\\:\\/[^\\/]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\.[^/]+ )\n\t\t\t// Remove the leading slash\n\t\t\tpathname = pathname.substr(1);\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t} else if(document.hostname !== \"\" && /^\\/[^\\/]+\\/[^\\/]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t\t// reconstruct UNC path\n\t\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t\t} else return false;\n\t\t// Prompt the user to save the file\n\t\twindow.TiddlyIE.save(pathname, text);\n\t\t// Callback that we succeeded\n\t\tcallback(null);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyIESaver.prototype.info = {\n\tname: \"tiddlyiesaver\",\n\tpriority: 1500,\n\tcapabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyIESaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/twedit.js": {
            "title": "$:/core/modules/savers/twedit.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/twedit.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TWEdit iOS app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TWEditSaver = function(wiki) {\n};\n\nTWEditSaver.prototype.save = function(text,method,callback) {\n\t// Bail if we're not running under TWEdit\n\tif(typeof DeviceInfo !== \"object\") {\n\t\treturn false;\n\t}\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.pathname);\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Remove the leading \"/Documents\" from path\n\tvar prefix = \"/Documents\";\n\tif(pathname.indexOf(prefix) === 0) {\n\t\tpathname = pathname.substr(prefix.length);\n\t}\n\t// Error handler\n\tvar errorHandler = function(event) {\n\t\t// Error\n\t\tcallback($tw.language.getString(\"Error/SavingToTWEdit\") + \": \" + event.target.error.code);\n\t};\n\t// Get the file system\n\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\n\t\t// Now we've got the filesystem, get the fileEntry\n\t\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\n\t\t\t// Now we've got the fileEntry, create the writer\n\t\t\tfileEntry.createWriter(function(writer) {\n\t\t\t\twriter.onerror = errorHandler;\n\t\t\t\twriter.onwrite = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\twriter.position = 0;\n\t\t\t\twriter.write(text);\n\t\t\t},errorHandler);\n\t\t}, errorHandler);\n\t}, errorHandler);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nTWEditSaver.prototype.info = {\n\tname: \"twedit\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TWEditSaver(wiki);\n};\n\n/////////////////////////// Hack\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\nif($tw.browser) {\n\twindow.version = {title: \"TiddlyWiki\"};\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/savers/upload.js": {
            "title": "$:/core/modules/savers/upload.js",
            "text": "/*\\\ntitle: $:/core/modules/savers/upload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via upload to a server.\n\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar UploadSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nUploadSaver.prototype.save = function(text,method,callback) {\n\t// Get the various parameters we need\n\tvar backupDir = this.wiki.getTextReference(\"$:/UploadBackupDir\") || \".\",\n\t\tusername = this.wiki.getTextReference(\"$:/UploadName\"),\n\t\tpassword = $tw.utils.getPassword(\"upload\"),\n\t\tuploadDir = this.wiki.getTextReference(\"$:/UploadDir\") || \".\",\n\t\tuploadFilename = this.wiki.getTextReference(\"$:/UploadFilename\") || \"index.html\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\treturn false;\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\t\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch(ex) {\n\t\treturn callback($tw.language.getString(\"Error/Caption\") + \":\" + ex);\n\t}\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nUploadSaver.prototype.info = {\n\tname: \"upload\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new UploadSaver(wiki);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "saver"
        },
        "$:/core/modules/server/authenticators/basic.js": {
            "title": "$:/core/modules/server/authenticators/basic.js",
            "text": "/*\\\ntitle: $:/core/modules/server/authenticators/basic.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for WWW basic authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\");\n}\n\nfunction BasicAuthenticator(server) {\n\tthis.server = server;\n\tthis.credentialsData = [];\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nBasicAuthenticator.prototype.init = function() {\n\t// Read the credentials data\n\tthis.credentialsFilepath = this.server.get(\"credentials\");\n\tif(this.credentialsFilepath) {\n\t\tvar resolveCredentialsFilepath = path.resolve(this.server.boot.wikiPath,this.credentialsFilepath);\n\t\tif(fs.existsSync(resolveCredentialsFilepath) && !fs.statSync(resolveCredentialsFilepath).isDirectory()) {\n\t\t\tvar credentialsText = fs.readFileSync(resolveCredentialsFilepath,\"utf8\"),\n\t\t\t\tcredentialsData = $tw.utils.parseCsvStringWithHeader(credentialsText);\n\t\t\tif(typeof credentialsData === \"string\") {\n\t\t\t\treturn \"Error: \" + credentialsData + \" reading credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t\t} else {\n\t\t\t\tthis.credentialsData = credentialsData;\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"Error: Unable to load user credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t}\n\t}\n\t// Add the hardcoded username and password if specified\n\tif(this.server.get(\"username\") && this.server.get(\"password\")) {\n\t\tthis.credentialsData = this.credentialsData || [];\n\t\tthis.credentialsData.push({\n\t\t\tusername: this.server.get(\"username\"),\n\t\t\tpassword: this.server.get(\"password\")\n\t\t});\n\t}\n\treturn this.credentialsData.length > 0;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nBasicAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Extract the incoming username and password from the request\n\tvar header = request.headers.authorization || \"\";\n\tif(!header && state.allowAnon) {\n\t\t// If there's no header and anonymous access is allowed then we don't set authenticatedUsername\n\t\treturn true;\n\t}\n\tvar token = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tincomingUsername = parts[0],\n\t\tincomingPassword = parts[1];\n\t// Check that at least one of the credentials matches\n\tvar matchingCredentials = this.credentialsData.find(function(credential) {\n\t\treturn credential.username === incomingUsername && credential.password === incomingPassword;\n\t});\n\tif(matchingCredentials) {\n\t\t// If so, add the authenticated username to the request state\n\t\tstate.authenticatedUsername = incomingUsername;\n\t\treturn true;\n\t} else {\n\t\t// If not, return an authentication challenge\n\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\n\t\treturn false;\n\t}\n};\n\nexports.AuthenticatorClass = BasicAuthenticator;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "authenticator"
        },
        "$:/core/modules/server/authenticators/header.js": {
            "title": "$:/core/modules/server/authenticators/header.js",
            "text": "/*\\\ntitle: $:/core/modules/server/authenticators/header.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for trusted header authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction HeaderAuthenticator(server) {\n\tthis.server = server;\n\tthis.header = server.get(\"authenticated-user-header\") ? server.get(\"authenticated-user-header\").toLowerCase() : undefined;\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nHeaderAuthenticator.prototype.init = function() {\n\treturn !!this.header;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nHeaderAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Otherwise, authenticate as the username in the specified header\n\tvar username = request.headers[this.header];\n\tif(!username && !state.allowAnon) {\n\t\tresponse.writeHead(401,\"Authorization header required to login to '\" + state.server.servername + \"'\");\n\t\tresponse.end();\n\t\treturn false;\n\t} else {\n\t\t// authenticatedUsername will be undefined for anonymous users\n\t\tstate.authenticatedUsername = username;\n\t\treturn true;\n\t}\n};\n\nexports.AuthenticatorClass = HeaderAuthenticator;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "authenticator"
        },
        "$:/core/modules/server/routes/delete-tiddler.js": {
            "title": "$:/core/modules/server/routes/delete-tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/delete-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nDELETE /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"DELETE\";\n\nexports.path = /^\\/bags\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]);\n\tstate.wiki.deleteTiddler(title);\n\tresponse.writeHead(204, \"OK\", {\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-favicon.js": {
            "title": "$:/core/modules/server/routes/get-favicon.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-favicon.js\ntype: application/javascript\nmodule-type: route\n\nGET /favicon.ico\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/favicon.ico$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"image/x-icon\"});\n\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\tresponse.end(buffer,\"base64\");\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-file.js": {
            "title": "$:/core/modules/server/routes/get-file.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-file.js\ntype: application/javascript\nmodule-type: route\n\nGET /files/:filepath\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/files\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar path = require(\"path\"),\n\t\tfs = require(\"fs\"),\n\t\tutil = require(\"util\"),\n\t\tsuppliedFilename = decodeURIComponent(state.params[0]),\n\t\tfilename = path.resolve(state.boot.wikiPath,\"files\",suppliedFilename),\n\t\textension = path.extname(filename);\n\tfs.readFile(filename,function(err,content) {\n\t\tvar status,content,type = \"text/plain\";\n\t\tif(err) {\n\t\t\tconsole.log(\"Error accessing file \" + filename + \": \" + err.toString());\n\t\t\tstatus = 404;\n\t\t\tcontent = \"File '\" + suppliedFilename + \"' not found\";\n\t\t} else {\n\t\t\tstatus = 200;\n\t\t\tcontent = content;\n\t\t\ttype = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : \"application/octet-stream\");\n\t\t}\n\t\tresponse.writeHead(status,{\n\t\t\t\"Content-Type\": type\n\t\t});\n\t\tresponse.end(content);\n\t});\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-index.js": {
            "title": "$:/core/modules/server/routes/get-index.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-index.js\ntype: application/javascript\nmodule-type: route\n\nGET /\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar zlib = require(\"zlib\");\n\nexports.method = \"GET\";\n\nexports.path = /^\\/$/;\n\nexports.handler = function(request,response,state) {\n\tvar acceptEncoding = request.headers[\"accept-encoding\"];\n\tif(!acceptEncoding) {\n\t\tacceptEncoding = \"\";\n\t}\n\tvar text = state.wiki.renderTiddler(state.server.get(\"root-render-type\"),state.server.get(\"root-tiddler\")),\n\t\tresponseHeaders = {\n\t\t\"Content-Type\": state.server.get(\"root-serve-type\")\n\t};\n\t/*\n\tIf the gzip=yes flag for `listen` is set, check if the user agent permits\n\tcompression. If so, compress our response. Note that we use the synchronous\n\tfunctions from zlib to stay in the imperative style. The current `Server`\n\tdoesn't depend on this, and we may just as well use the async versions.\n\t*/\n\tif(state.server.enableGzip) {\n\t\tif (/\\bdeflate\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"deflate\";\n\t\t\ttext = zlib.deflateSync(text);\n\t\t} else if (/\\bgzip\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"gzip\";\n\t\t\ttext = zlib.gzipSync(text);\n\t\t}\n\t}\n\tresponse.writeHead(200,responseHeaders);\n\tresponse.end(text);\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-login-basic.js": {
            "title": "$:/core/modules/server/routes/get-login-basic.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-login-basic.js\ntype: application/javascript\nmodule-type: route\n\nGET /login-basic -- force a Basic Authentication challenge\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/login-basic$/;\n\nexports.handler = function(request,response,state) {\n\tif(!state.authenticatedUsername) {\n\t\t// Challenge if there's no username\n\t\tresponse.writeHead(401,{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\t\t\n\t} else {\n\t\t// Redirect to the root wiki if login worked\n\t\tresponse.writeHead(302,{\n\t\t\tLocation: \"/\"\n\t\t});\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-status.js": {
            "title": "$:/core/modules/server/routes/get-status.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-status.js\ntype: application/javascript\nmodule-type: route\n\nGET /status\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/status$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar text = JSON.stringify({\n\t\tusername: state.authenticatedUsername || state.server.get(\"anon-username\") || \"\",\n\t\tanonymous: !state.authenticatedUsername,\n\t\tread_only: !state.server.isAuthorized(\"writers\",state.authenticatedUsername),\n\t\tspace: {\n\t\t\trecipe: \"default\"\n\t\t},\n\t\ttiddlywiki_version: $tw.version\n\t});\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-tiddler-html.js": {
            "title": "$:/core/modules/server/routes/get-tiddler-html.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler-html.js\ntype: application/javascript\nmodule-type: route\n\nGET /:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/([^\\/]+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar renderType = tiddler.getFieldString(\"_render_type\"),\n\t\t\trenderTemplate = tiddler.getFieldString(\"_render_template\");\n\t\t// Tiddler fields '_render_type' and '_render_template' overwrite\n\t\t// system wide settings for render type and template\n\t\tif(state.wiki.isSystemTiddler(title)) {\n\t\t\trenderType = renderType || state.server.get(\"system-tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"system-tiddler-render-template\");\n\t\t} else {\n\t\t\trenderType = renderType || state.server.get(\"tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"tiddler-render-template\");\n\t\t}\n\t\tvar text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}});\n\t\t// Naughty not to set a content-type, but it's the easiest way to ensure the browser will see HTML pages as HTML, and accept plain text tiddlers as CSS or JS\n\t\tresponse.writeHead(200);\n\t\tresponse.end(text,\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-tiddler.js": {
            "title": "$:/core/modules/server/routes/get-tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title),\n\t\ttiddlerFields = {},\n\t\tknownFields = [\n\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t];\n\tif(tiddler) {\n\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\ttiddlerFields[name] = value;\n\t\t\t} else {\n\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t}\n\t\t});\n\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\ttiddlerFields.bag = \"default\";\n\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\tresponse.end(JSON.stringify(tiddlerFields),\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/get-tiddlers-json.js": {
            "title": "$:/core/modules/server/routes/get-tiddlers-json.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddlers-json.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers.json?filter=<filter>\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_FILTER = \"[all[tiddlers]!is[system]sort[title]]\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers.json$/;\n\nexports.handler = function(request,response,state) {\n\tvar filter = state.queryParameters.filter || DEFAULT_FILTER;\n\tif(state.wiki.getTiddlerText(\"$:/config/Server/AllowAllExternalFilters\") !== \"yes\") {\n\t\tif(state.wiki.getTiddlerText(\"$:/config/Server/ExternalFilters/\" + filter) !== \"yes\") {\n\t\t\tconsole.log(\"Blocked attempt to GET /recipes/default/tiddlers.json with filter: \" + filter);\n\t\t\tresponse.writeHead(403);\n\t\t\tresponse.end();\n\t\t\treturn;\n\t\t}\n\t}\n\tif(state.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"no\") {\n\t\tfilter += \"+[!is[system]]\";\n\t}\n\tvar excludeFields = (state.queryParameters.exclude || \"text\").split(\",\"),\n\t\ttitles = state.wiki.filterTiddlers(filter);\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar tiddlers = [];\n\t$tw.utils.each(titles,function(title) {\n\t\tvar tiddler = state.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tvar tiddlerFields = tiddler.getFieldStrings({exclude: excludeFields});\n\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\ttiddlers.push(tiddlerFields);\n\t\t}\n\t});\n\tvar text = JSON.stringify(tiddlers);\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/routes/put-tiddler.js": {
            "title": "$:/core/modules/server/routes/put-tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/server/routes/put-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nPUT /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"PUT\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\tfields = JSON.parse(state.data);\n\t// Pull up any subfields in the `fields` object\n\tif(fields.fields) {\n\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\tfields[name] = field;\n\t\t});\n\t\tdelete fields.fields;\n\t}\n\t// Remove any revision field\n\tif(fields.revision) {\n\t\tdelete fields.revision;\n\t}\n\tstate.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title},state.wiki.getModificationFields()));\n\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\tresponse.writeHead(204, \"OK\",{\n\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
            "type": "application/javascript",
            "module-type": "route"
        },
        "$:/core/modules/server/server.js": {
            "title": "$:/core/modules/server/server.js",
            "text": "/*\\\ntitle: $:/core/modules/server/server.js\ntype: application/javascript\nmodule-type: library\n\nServe tiddlers over http\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\"),\n\t\tquerystring = require(\"querystring\");\n}\n\n/*\nA simple HTTP server with regexp-based routes\noptions: variables - optional hashmap of variables to set (a misnomer - they are really constant parameters)\n\t\t routes - optional array of routes to use\n\t\t wiki - reference to wiki object\n*/\nfunction Server(options) {\n\tvar self = this;\n\tthis.routes = options.routes || [];\n\tthis.authenticators = options.authenticators || [];\n\tthis.wiki = options.wiki;\n\tthis.boot = options.boot || $tw.boot;\n\tthis.servername = $tw.utils.transliterateToSafeASCII(this.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\");\n\t// Initialise the variables\n\tthis.variables = $tw.utils.extend({},this.defaultVariables);\n\tif(options.variables) {\n\t\tfor(var variable in options.variables) {\n\t\t\tif(options.variables[variable]) {\n\t\t\t\tthis.variables[variable] = options.variables[variable];\n\t\t\t}\n\t\t}\t\t\n\t}\n\t$tw.utils.extend({},this.defaultVariables,options.variables);\n\t// Initialise CSRF\n\tthis.csrfDisable = this.get(\"csrf-disable\") === \"yes\";\n\t// Initialize Gzip compression\n\tthis.enableGzip = this.get(\"gzip\") === \"yes\";\n\t// Initialise authorization\n\tvar authorizedUserName = (this.get(\"username\") && this.get(\"password\")) ? this.get(\"username\") : \"(anon)\";\n\tthis.authorizationPrincipals = {\n\t\treaders: (this.get(\"readers\") || authorizedUserName).split(\",\").map($tw.utils.trim),\n\t\twriters: (this.get(\"writers\") || authorizedUserName).split(\",\").map($tw.utils.trim)\n\t}\n\t// Load and initialise authenticators\n\t$tw.modules.forEachModuleOfType(\"authenticator\", function(title,authenticatorDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addAuthenticator(authenticatorDefinition.AuthenticatorClass);\n\t});\n\t// Load route handlers\n\t$tw.modules.forEachModuleOfType(\"route\", function(title,routeDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addRoute(routeDefinition);\n\t});\n\t// Initialise the http vs https\n\tthis.listenOptions = null;\n\tthis.protocol = \"http\";\n\tvar tlsKeyFilepath = this.get(\"tls-key\"),\n\t\ttlsCertFilepath = this.get(\"tls-cert\");\n\tif(tlsCertFilepath && tlsKeyFilepath) {\n\t\tthis.listenOptions = {\n\t\t\tkey: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsKeyFilepath),\"utf8\"),\n\t\t\tcert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),\"utf8\")\n\t\t};\n\t\tthis.protocol = \"https\";\n\t}\n\tthis.transport = require(this.protocol);\n}\n\nServer.prototype.defaultVariables = {\n\tport: \"8080\",\n\thost: \"127.0.0.1\",\n\t\"root-tiddler\": \"$:/core/save/all\",\n\t\"root-render-type\": \"text/plain\",\n\t\"root-serve-type\": \"text/html\",\n\t\"tiddler-render-type\": \"text/html\",\n\t\"tiddler-render-template\": \"$:/core/templates/server/static.tiddler.html\",\n\t\"system-tiddler-render-type\": \"text/plain\",\n\t\"system-tiddler-render-template\": \"$:/core/templates/wikified-tiddler\",\n\t\"debug-level\": \"none\",\n\t\"gzip\": \"no\"\n};\n\nServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nServer.prototype.addAuthenticator = function(AuthenticatorClass) {\n\t// Instantiate and initialise the authenticator\n\tvar authenticator = new AuthenticatorClass(this),\n\t\tresult = authenticator.init();\n\tif(typeof result === \"string\") {\n\t\t$tw.utils.error(\"Error: \" + result);\n\t} else if(result) {\n\t\t// Only use the authenticator if it initialised successfully\n\t\tthis.authenticators.push(authenticator);\n\t}\n};\n\nServer.prototype.findMatchingRoute = function(request,state) {\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(state.pathPrefix) {\n\t\t\tif(pathname.substr(0,state.pathPrefix.length) === state.pathPrefix) {\n\t\t\t\tpathname = pathname.substr(state.pathPrefix.length) || \"/\";\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\nServer.prototype.methodMappings = {\n\t\"GET\": \"readers\",\n\t\"OPTIONS\": \"readers\",\n\t\"HEAD\": \"readers\",\n\t\"PUT\": \"writers\",\n\t\"POST\": \"writers\",\n\t\"DELETE\": \"writers\"\n};\n\n/*\nCheck whether a given user is authorized for the specified authorizationType (\"readers\" or \"writers\"). Pass null or undefined as the username to check for anonymous access\n*/\nServer.prototype.isAuthorized = function(authorizationType,username) {\n\tvar principals = this.authorizationPrincipals[authorizationType] || [];\n\treturn principals.indexOf(\"(anon)\") !== -1 || (username && (principals.indexOf(\"(authenticated)\") !== -1 || principals.indexOf(username) !== -1));\n}\n\nServer.prototype.requestHandler = function(request,response,options) {\n\toptions = options || {};\n\t// Compose the state object\n\tvar self = this;\n\tvar state = {};\n\tstate.wiki = options.wiki || self.wiki;\n\tstate.boot = options.boot || self.boot;\n\tstate.server = self;\n\tstate.urlInfo = url.parse(request.url);\n\tstate.queryParameters = querystring.parse(state.urlInfo.query);\n\tstate.pathPrefix = options.pathPrefix || this.get(\"path-prefix\") || \"\";\n\t// Get the principals authorized to access this resource\n\tvar authorizationType = this.methodMappings[request.method] || \"readers\";\n\t// Check for the CSRF header if this is a write\n\tif(!this.csrfDisable && authorizationType === \"writers\" && request.headers[\"x-requested-with\"] !== \"TiddlyWiki\") {\n\t\tresponse.writeHead(403,\"'X-Requested-With' header required to login to '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\t\t\n\t}\n\t// Check whether anonymous access is granted\n\tstate.allowAnon = this.isAuthorized(authorizationType,null);\n\t// Authenticate with the first active authenticator\n\tif(this.authenticators.length > 0) {\n\t\tif(!this.authenticators[0].authenticateRequest(request,response,state)) {\n\t\t\t// Bail if we failed (the authenticator will have sent the response)\n\t\t\treturn;\n\t\t}\t\t\n\t}\n\t// Authorize with the authenticated username\n\tif(!this.isAuthorized(authorizationType,state.authenticatedUsername)) {\n\t\tresponse.writeHead(401,\"'\" + state.authenticatedUsername + \"' is not authorized to access '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Find the route that matches this path\n\tvar route = self.findMatchingRoute(request,state);\n\t// Optionally output debug info\n\tif(self.get(\"debug-level\") !== \"none\") {\n\t\tconsole.log(\"Request path:\",JSON.stringify(state.urlInfo));\n\t\tconsole.log(\"Request headers:\",JSON.stringify(request.headers));\n\t\tconsole.log(\"authenticatedUsername:\",state.authenticatedUsername);\n\t}\n\t// Return a 404 if we didn't find a route\n\tif(!route) {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Receive the request body if necessary and hand off to the route handler\n\tif(route.bodyFormat === \"stream\" || request.method === \"GET\" || request.method === \"HEAD\") {\n\t\t// Let the route handle the request stream itself\n\t\troute.handler(request,response,state);\n\t} else if(route.bodyFormat === \"string\" || !route.bodyFormat) {\n\t\t// Set the encoding for the incoming request\n\t\trequest.setEncoding(\"utf8\");\n\t\tvar data = \"\";\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata += chunk.toString();\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = data;\n\t\t\troute.handler(request,response,state);\n\t\t});\n\t} else if(route.bodyFormat === \"buffer\") {\n\t\tvar data = [];\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata.push(chunk);\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = Buffer.concat(data);\n\t\t\troute.handler(request,response,state);\n\t\t})\n\t} else {\n\t\tresponse.writeHead(400,\"Invalid bodyFormat \" + route.bodyFormat + \" in route \" + route.method + \" \" + route.path.source);\n\t\tresponse.end();\n\t}\n};\n\n/*\nListen for requests\nport: optional port number (falls back to value of \"port\" variable)\nhost: optional host address (falls back to value of \"host\" variable)\nprefix: optional prefix (falls back to value of \"path-prefix\" variable)\n*/\nServer.prototype.listen = function(port,host,prefix) {\n\tvar self = this;\n\t// Handle defaults for port and host\n\tport = port || this.get(\"port\");\n\thost = host || this.get(\"host\");\n\tprefix = prefix || this.get(\"path-prefix\") || \"\";\n\t// Check for the port being a string and look it up as an environment variable\n\tif(parseInt(port,10).toString() !== port) {\n\t\tport = process.env[port] || 8080;\n\t}\n\t// Warn if required plugins are missing\n\tif(!this.wiki.getTiddler(\"$:/plugins/tiddlywiki/tiddlyweb\") || !this.wiki.getTiddler(\"$:/plugins/tiddlywiki/filesystem\")) {\n\t\t$tw.utils.warning(\"Warning: Plugins required for client-server operation (\\\"tiddlywiki/filesystem\\\" and \\\"tiddlywiki/tiddlyweb\\\") are missing from tiddlywiki.info file\");\n\t}\n\t// Create the server\n\tvar server;\n\tif(this.listenOptions) {\n\t\tserver = this.transport.createServer(this.listenOptions,this.requestHandler.bind(this));\n\t} else {\n\t\tserver = this.transport.createServer(this.requestHandler.bind(this));\n\t}\n\t// Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port)\n\tserver.on(\"listening\",function() {\n\t\tvar address = server.address();\n\t\t$tw.utils.log(\"Serving on \" + self.protocol + \"://\" + address.address + \":\" + address.port + prefix,\"brown/orange\");\n\t\t$tw.utils.log(\"(press ctrl-C to exit)\",\"red\");\n\t});\n\t// Listen\n\treturn server.listen(port,host);\n};\n\nexports.Server = Server;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "library"
        },
        "$:/core/modules/browser-messaging.js": {
            "title": "$:/core/modules/browser-messaging.js",
            "text": "/*\\\ntitle: $:/core/modules/browser-messaging.js\ntype: application/javascript\nmodule-type: startup\n\nBrowser message handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"browser-messaging\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*\nLoad a specified url as an iframe and call the callback when it is loaded. If the url is already loaded then the existing iframe instance is used\n*/\nfunction loadIFrame(url,callback) {\n\t// Check if iframe already exists\n\tvar iframeInfo = $tw.browserMessaging.iframeInfoMap[url];\n\tif(iframeInfo) {\n\t\t// We've already got the iframe\n\t\tcallback(null,iframeInfo);\n\t} else {\n\t\t// Create the iframe and save it in the list\n\t\tvar iframe = document.createElement(\"iframe\");\n\t\tiframeInfo = {\n\t\t\turl: url,\n\t\t\tstatus: \"loading\",\n\t\t\tdomNode: iframe\n\t\t};\n\t\t$tw.browserMessaging.iframeInfoMap[url] = iframeInfo;\n\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t// Add the iframe to the DOM and hide it\n\t\tiframe.style.display = \"none\";\n\t\tiframe.setAttribute(\"library\",\"true\");\n\t\tdocument.body.appendChild(iframe);\n\t\t// Set up onload\n\t\tiframe.onload = function() {\n\t\t\tiframeInfo.status = \"loaded\";\n\t\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t\tcallback(null,iframeInfo);\n\t\t};\n\t\tiframe.onerror = function() {\n\t\t\tcallback(\"Cannot load iframe\");\n\t\t};\n\t\ttry {\n\t\t\tiframe.src = url;\n\t\t} catch(ex) {\n\t\t\tcallback(ex);\n\t\t}\n\t}\n}\n\n/*\nUnload library iframe for given url\n*/\nfunction unloadIFrame(url){\n\t$tw.utils.each(document.getElementsByTagName('iframe'), function(iframe) {\n\t\tif(iframe.getAttribute(\"library\") === \"true\" &&\n\t\t  iframe.getAttribute(\"src\") === url) {\n\t\t\tiframe.parentNode.removeChild(iframe);\n\t\t}\n\t});\n}\n\nfunction saveIFrameInfoTiddler(iframeInfo) {\n\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),{\n\t\ttitle: \"$:/temp/ServerConnection/\" + iframeInfo.url,\n\t\ttext: iframeInfo.status,\n\t\ttags: [\"$:/tags/ServerConnection\"],\n\t\turl: iframeInfo.url\n\t},$tw.wiki.getModificationFields()));\n}\n\nexports.startup = function() {\n\t// Initialise the store of iframes we've created\n\t$tw.browserMessaging = {\n\t\tiframeInfoMap: {} // Hashmap by URL of {url:,status:\"loading/loaded\",domNode:}\n\t};\n\t// Listen for widget messages to control loading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\tif(url) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers.json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-info\",\n\t\t\t\t\t\t\tinfoTitlePrefix: paramObject.infoTitlePrefix || \"$:/temp/RemoteAssetInfo/\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for widget messages to control unloading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-unload-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\t$tw.browserMessaging.iframeInfoMap[url] = undefined;\n\t\tif(url) {\n\t\t\tunloadIFrame(url);\n\t\t\t$tw.utils.each(\n\t\t\t\t$tw.wiki.filterTiddlers(\"[[$:/temp/ServerConnection/\" + url + \"]] [prefix[$:/temp/RemoteAssetInfo/\" + url + \"/]]\"),\n\t\t\t\tfunction(title) {\n\t\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-from-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url,\n\t\t\ttitle = paramObject.title;\n\t\tif(url && title) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers/\" + encodeURIComponent(title) + \".json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-tiddler\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for window messages from other windows\n\twindow.addEventListener(\"message\",function listener(event){\n\t\t// console.log(\"browser-messaging: \",document.location.toString())\n\t\t// console.log(\"browser-messaging: Received message from\",event.origin);\n\t\t// console.log(\"browser-messaging: Message content\",event.data);\n\t\tswitch(event.data.verb) {\n\t\t\tcase \"GET-RESPONSE\":\n\t\t\t\tif(event.data.status.charAt(0) === \"2\") {\n\t\t\t\t\tif(event.data.cookies) {\n\t\t\t\t\t\tif(event.data.cookies.type === \"save-info\") {\n\t\t\t\t\t\t\tvar tiddlers = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\t\t\t\t\ttitle: event.data.cookies.infoTitlePrefix + event.data.cookies.url + \"/\" + tiddler.title,\n\t\t\t\t\t\t\t\t\t\"original-title\": tiddler.title,\n\t\t\t\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t\t\t\t\ttype: \"text/vnd.tiddlywiki\",\n\t\t\t\t\t\t\t\t\t\"original-type\": tiddler.type,\n\t\t\t\t\t\t\t\t\t\"plugin-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-plugin-type\": tiddler[\"plugin-type\"],\n\t\t\t\t\t\t\t\t\t\"module-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-module-type\": tiddler[\"module-type\"],\n\t\t\t\t\t\t\t\t\ttags: [\"$:/tags/RemoteAssetInfo\"],\n\t\t\t\t\t\t\t\t\t\"original-tags\": $tw.utils.stringifyList(tiddler.tags || []),\n\t\t\t\t\t\t\t\t\t\"server-url\": event.data.cookies.url\n\t\t\t\t\t\t\t\t},$tw.wiki.getModificationFields()));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if(event.data.cookies.type === \"save-tiddler\") {\n\t\t\t\t\t\t\tvar tiddler = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t},false);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/commands.js": {
            "title": "$:/core/modules/startup/commands.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/commands.js\ntype: application/javascript\nmodule-type: startup\n\nCommand processing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"commands\";\nexports.platforms = [\"node\"];\nexports.after = [\"story\"];\nexports.synchronous = false;\n\nexports.startup = function(callback) {\n\t// On the server, start a commander with the command line arguments\n\tvar commander = new $tw.Commander(\n\t\t$tw.boot.argv,\n\t\tfunction(err) {\n\t\t\tif(err) {\n\t\t\t\treturn $tw.utils.error(\"Error: \" + err);\n\t\t\t}\n\t\t\tcallback();\n\t\t},\n\t\t$tw.wiki,\n\t\t{output: process.stdout, error: process.stderr}\n\t);\n\tcommander.execute();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/CSSescape.js": {
            "title": "$:/core/modules/startup/CSSescape.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/CSSescape.js\ntype: application/javascript\nmodule-type: startup\n\nPolyfill for CSS.escape()\n\n\\*/\n(function(root,factory){\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"css-escape\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n// https://github.com/umdjs/umd/blob/master/returnExports.js\nexports.startup = factory(root);\n}(typeof global != 'undefined' ? global : this, function(root) {\n\n\tif (root.CSS && root.CSS.escape) {\n\t\treturn;\n\t}\n\n\t// https://drafts.csswg.org/cssom/#serialize-an-identifier\n\tvar cssEscape = function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n\n\tif (!root.CSS) {\n\t\troot.CSS = {};\n\t}\n\n\troot.CSS.escape = cssEscape;\n\n}));\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/favicon.js": {
            "title": "$:/core/modules/startup/favicon.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/favicon.js\ntype: application/javascript\nmodule-type: startup\n\nFavicon handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"favicon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\n// Favicon tiddler\nvar FAVICON_TITLE = \"$:/favicon.ico\";\n\nexports.startup = function() {\n\t// Set up the favicon\n\tsetFavicon();\n\t// Reset the favicon when the tiddler changes\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\n\t\t\tsetFavicon();\n\t\t}\n\t});\n};\n\nfunction setFavicon() {\n\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\n\tif(tiddler) {\n\t\tvar faviconLink = document.getElementById(\"faviconLink\");\n\t\tfaviconLink.setAttribute(\"href\",$tw.utils.makeDataUri(tiddler.fields.text,tiddler.fields.type,tiddler.fields._canonical_uri));\n\t}\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/info.js": {
            "title": "$:/core/modules/startup/info.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/info.js\ntype: application/javascript\nmodule-type: startup\n\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"info\";\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_INFO_PLUGIN = \"$:/temp/info-plugin\";\n\nexports.startup = function() {\n\t// Function to bake the info plugin with new tiddlers\n\tvar updateInfoPlugin = function(tiddlerFieldsArray) {\n\t\t// Get the existing tiddlers\n\t\tvar json = $tw.wiki.getTiddlerData(TITLE_INFO_PLUGIN,{tiddlers: {}});\n\t\t// Add the new ones\n\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\tif(fields && fields.title) {\n\t\t\t\tjson.tiddlers[fields.title] = fields;\n\t\t\t}\n\t\t});\n\t\t// Bake the info tiddlers into a plugin. We use the non-standard plugin-type \"info\" because ordinary plugins are only registered asynchronously after being loaded dynamically\n\t\tvar fields = {\n\t\t\ttitle: TITLE_INFO_PLUGIN,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"info\",\n\t\t\ttext: JSON.stringify(json,null,$tw.config.preferences.jsonSpaces)\n\t\t};\n\t\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\n\t};\n\t// Collect up the info tiddlers\n\tvar tiddlerFieldsArray = [];\n\t// Give each info module a chance to provide as many info tiddlers as they want as an array, and give them a callback for dynamically updating them\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tArray.prototype.push.apply(tiddlerFieldsArray,moduleExports.getInfoTiddlerFields(updateInfoPlugin));\n\t\t}\n\t});\n\tupdateInfoPlugin(tiddlerFieldsArray);\n\tvar changes = $tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);\n\t$tw.wiki.registerPluginTiddlers(\"info\",[TITLE_INFO_PLUGIN]);\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/load-modules.js": {
            "title": "$:/core/modules/startup/load-modules.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/load-modules.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"load-modules\";\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Load modules\n\t$tw.modules.applyMethods(\"utils\",$tw.utils);\n\tif($tw.node) {\n\t\t$tw.modules.applyMethods(\"utils-node\",$tw.utils);\n\t}\n\t$tw.modules.applyMethods(\"global\",$tw);\n\t$tw.modules.applyMethods(\"config\",$tw.config);\n\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\"tiddlerfield\");\n\t$tw.modules.applyMethods(\"tiddlermethod\",$tw.Tiddler.prototype);\n\t$tw.modules.applyMethods(\"wikimethod\",$tw.Wiki.prototype);\n\t$tw.wiki.addIndexersToWiki();\n\t$tw.modules.applyMethods(\"tiddlerdeserializer\",$tw.Wiki.tiddlerDeserializerModules);\n\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\"macro\");\n\t$tw.wiki.initParsers();\n\t$tw.Commander.initCommands();\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/password.js": {
            "title": "$:/core/modules/startup/password.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/password.js\ntype: application/javascript\nmodule-type: startup\n\nPassword handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"password\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t$tw.rootWidget.addEventListener(\"tm-set-password\",function(event) {\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: $tw.language.getString(\"Encryption/PromptSetPassword\"),\n\t\t\tnoUserName: true,\n\t\t\tsubmitText: $tw.language.getString(\"Encryption/SetPassword\"),\n\t\t\tcanCancel: true,\n\t\t\trepeatPassword: true,\n\t\t\tcallback: function(data) {\n\t\t\t\tif(data) {\n\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t}\n\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t}\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-clear-password\",function(event) {\n\t\tif($tw.browser) {\n\t\t\tif(!confirm($tw.language.getString(\"Encryption/ConfirmClearPassword\"))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.crypto.setPassword(null);\n\t});\n\t// Ensure that $:/isEncrypted is maintained properly\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,\"$:/isEncrypted\")) {\n\t\t\t$tw.crypto.updateCryptoStateTiddler();\n\t\t}\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/plugins.js": {
            "title": "$:/core/modules/startup/plugins.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/plugins.js\ntype: application/javascript\nmodule-type: startup\n\nStartup logic concerned with managing plugins\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"plugins\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = \"$:/status/RequireReloadDueToPluginChange\";\n\nvar PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = \"$:/config/RegisterPluginType/\";\n\nexports.startup = function() {\n\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"no\"});\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Work out which of the changed tiddlers are plugins that we need to reregister\n\t\tvar changesToProcess = [],\n\t\t\trequireReloadDueToPluginChange = false;\n\t\t$tw.utils.each(Object.keys(changes),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\t\trequiresReload = $tw.wiki.doesPluginRequireReload(title);\n\t\t\tif(requiresReload) {\n\t\t\t\trequireReloadDueToPluginChange = true;\n\t\t\t} else if(tiddler) {\n\t\t\t\tvar pluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields[\"plugin-type\"] || \"\"),\"no\") === \"yes\") {\n\t\t\t\t\tchangesToProcess.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t// Issue warning if any of the tiddlers require a reload\n\t\tif(requireReloadDueToPluginChange) {\n\t\t\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"yes\"});\n\t\t}\n\t\t// Read or delete the plugin info of the changed tiddlers\n\t\tif(changesToProcess.length > 0) {\n\t\t\tvar changes = $tw.wiki.readPluginInfo(changesToProcess);\n\t\t\tif(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) {\n\t\t\t\tvar changedShadowTiddlers = {};\n\t\t\t\t// Collect the shadow tiddlers of any deleted plugins\n\t\t\t\t$tw.utils.each(changes.deletedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = true;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Collect the shadow tiddlers of any modified plugins\n\t\t\t\t$tw.utils.each(changes.modifiedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = false;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// (Re-)register any modified plugins\n\t\t\t\t$tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins);\n\t\t\t\t// Unregister any deleted plugins\n\t\t\t\t$tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins);\n\t\t\t\t// Unpack the shadow tiddlers\n\t\t\t\t$tw.wiki.unpackPluginTiddlers();\n\t\t\t\t// Queue change events for the changed shadow tiddlers\n\t\t\t\t$tw.utils.each(Object.keys(changedShadowTiddlers),function(title) {\n\t\t\t\t\t$tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title]);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/render.js": {
            "title": "$:/core/modules/startup/render.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/render.js\ntype: application/javascript\nmodule-type: startup\n\nTitle, stylesheet and page rendering\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"render\";\nexports.platforms = [\"browser\"];\nexports.after = [\"story\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar PAGE_TITLE_TITLE = \"$:/core/wiki/title\";\nvar PAGE_STYLESHEET_TITLE = \"$:/core/ui/PageStylesheet\";\nvar PAGE_TEMPLATE_TITLE = \"$:/core/ui/RootTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT_TITLE = \"$:/config/Drafts/TypingTimeout\";\nvar THROTTLE_REFRESH_TIMEOUT = 400;\n\nexports.startup = function() {\n\t// Set up the title\n\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE,{document: $tw.fakeDocument, parseAsInline: true});\n\t$tw.titleContainer = $tw.fakeDocument.createElement(\"div\");\n\t$tw.titleWidgetNode.render($tw.titleContainer,null);\n\tdocument.title = $tw.titleContainer.textContent;\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\n\t\t\tdocument.title = $tw.titleContainer.textContent;\n\t\t}\n\t});\n\t// Set up the styles\n\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\n\t$tw.styleContainer = $tw.fakeDocument.createElement(\"style\");\n\t$tw.styleWidgetNode.render($tw.styleContainer,null);\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"styleRefresh\",function(changes) {\n\t\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\n\t\t\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\t\t}\n\t}));\n\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\n\t$tw.perf.report(\"mainRender\",function() {\n\t\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget, recursionMarker: \"no\"});\n\t\t$tw.pageContainer = document.createElement(\"div\");\n\t\t$tw.utils.addClass($tw.pageContainer,\"tc-page-container-wrapper\");\n\t\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\n\t\t$tw.pageWidgetNode.render($tw.pageContainer,null);\n   \t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t})();\n\t// Remove any splash screen elements\n\tvar removeList = document.querySelectorAll(\".tc-remove-when-wiki-loaded\");\n\t$tw.utils.each(removeList,function(removeItem) {\n\t\tif(removeItem.parentNode) {\n\t\t\tremoveItem.parentNode.removeChild(removeItem);\n\t\t}\n\t});\n\t// Prepare refresh mechanism\n\tvar deferredChanges = Object.create(null),\n\t\ttimerId;\n\tfunction refresh() {\n\t\t// Process the refresh\n\t\t$tw.hooks.invokeHook(\"th-page-refreshing\");\n\t\t$tw.pageWidgetNode.refresh(deferredChanges);\n\t\tdeferredChanges = Object.create(null);\n\t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t}\n\t// Add the change event handler\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"mainRefresh\",function(changes) {\n\t\t// Check if only tiddlers that are throttled have changed\n\t\tvar onlyThrottledTiddlersHaveChanged = true;\n\t\tfor(var title in changes) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(!tiddler || !(tiddler.hasField(\"draft.of\") || tiddler.hasField(\"throttle.refresh\"))) {\n\t\t\t\tonlyThrottledTiddlersHaveChanged = false;\n\t\t\t}\n\t\t}\n\t\t// Defer the change if only drafts have changed\n\t\tif(timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t}\n\t\ttimerId = null;\n\t\tif(onlyThrottledTiddlersHaveChanged) {\n\t\t\tvar timeout = parseInt($tw.wiki.getTiddlerText(DRAFT_TIDDLER_TIMEOUT_TITLE,\"\"),10);\n\t\t\tif(isNaN(timeout)) {\n\t\t\t\ttimeout = THROTTLE_REFRESH_TIMEOUT;\n\t\t\t}\n\t\t\ttimerId = setTimeout(refresh,timeout);\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t} else {\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t\trefresh();\n\t\t}\n\t}));\n\t// Fix up the link between the root widget and the page container\n\t$tw.rootWidget.domNodes = [$tw.pageContainer];\n\t$tw.rootWidget.children = [$tw.pageWidgetNode];\n\t// Run any post-render startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/PostRender\");\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/rootwidget.js": {
            "title": "$:/core/modules/startup/rootwidget.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/rootwidget.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"rootwidget\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Install the modal message mechanism\n\t$tw.modal = new $tw.utils.Modal($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-modal\",function(event) {\n\t\t$tw.modal.display(event.param,{variables: event.paramObject, event: event});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-show-switcher\",function(event) {\n\t\t$tw.modal.display(\"$:/core/ui/SwitcherModal\",{variables: event.paramObject, event: event});\n\t});\t\n\t// Install the notification  mechanism\n\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-notify\",function(event) {\n\t\t$tw.notifier.display(event.param,{variables: event.paramObject});\n\t});\n\t// Install the copy-to-clipboard  mechanism\n\t$tw.rootWidget.addEventListener(\"tm-copy-to-clipboard\",function(event) {\n\t\t$tw.utils.copyToClipboard(event.param);\n\t});\n\t// Install the tm-focus-selector message\n\t$tw.rootWidget.addEventListener(\"tm-focus-selector\",function(event) {\n\t\tvar selector = event.param || \"\",\n\t\t\telement;\n\t\ttry {\n\t\t\telement = document.querySelector(selector);\n\t\t} catch(e) {\n\t\t\tconsole.log(\"Error in selector: \",selector)\n\t\t}\n\t\tif(element && element.focus) {\n\t\t\telement.focus(event.paramObject);\n\t\t}\n\t});\n\t// Install the scroller\n\t$tw.pageScroller = new $tw.utils.PageScroller();\n\t$tw.rootWidget.addEventListener(\"tm-scroll\",function(event) {\n\t\t$tw.pageScroller.handleEvent(event);\n\t});\n\tvar fullscreen = $tw.utils.getFullScreenApis();\n\tif(fullscreen) {\n\t\t$tw.rootWidget.addEventListener(\"tm-full-screen\",function(event) {\n\t\t\tvar fullScreenDocument = event.event ? event.event.target.ownerDocument : document;\n\t\t\tif(event.param === \"enter\") {\n\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t} else if(event.param === \"exit\") {\n\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tif(fullScreenDocument[fullscreen._fullscreenElement]) {\n\t\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t\t} else {\n\t\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\t// If we're being viewed on a data: URI then give instructions for how to save\n\tif(document.location.protocol === \"data:\") {\n\t\t$tw.rootWidget.dispatchEvent({\n\t\t\ttype: \"tm-modal\",\n\t\t\tparam: \"$:/language/Modals/SaveInstructions\"\n\t\t});\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup.js": {
            "title": "$:/core/modules/startup.js",
            "text": "/*\\\ntitle: $:/core/modules/startup.js\ntype: application/javascript\nmodule-type: startup\n\nMiscellaneous startup logic for both the client and server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\n// Set to `true` to enable performance instrumentation\nvar PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE = \"$:/config/Performance/Instrumentation\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.startup = function() {\n\tvar modules,n,m,f;\n\t// Minimal browser detection\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t\t$tw.browser.isFirefox = !!document.mozFullScreenEnabled;\n\t}\n\t// Platform detection\n\t$tw.platform = {};\n\tif($tw.browser) {\n\t\t$tw.platform.isMac = /Mac/.test(navigator.platform);\n\t\t$tw.platform.isWindows = /win/i.test(navigator.platform);\n\t\t$tw.platform.isLinux = /Linux/i.test(navigator.platform);\n\t} else {\n\t\tswitch(require(\"os\").platform()) {\n\t\t\tcase \"darwin\":\n\t\t\t\t$tw.platform.isMac = true;\n\t\t\t\tbreak;\n\t\t\tcase \"win32\":\n\t\t\t\t$tw.platform.isWindows = true;\n\t\t\t\tbreak;\n\t\t\tcase \"freebsd\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t\tcase \"linux\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t// Initialise version\n\t$tw.version = $tw.utils.extractVersionInfo();\n\t// Set up the performance framework\n\t$tw.perf = new $tw.Performance($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,\"no\") === \"yes\");\n\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\n\t$tw.rootWidget = new widget.widget({\n\t\ttype: \"widget\",\n\t\tchildren: []\n\t},{\n\t\twiki: $tw.wiki,\n\t\tdocument: $tw.browser ? document : $tw.fakeDocument\n\t});\n\t// Execute any startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction\");\n\tif($tw.browser) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Browser\");\t\t\n\t}\n\tif($tw.node) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Node\");\t\t\n\t}\n\t// Kick off the language manager and switcher\n\t$tw.language = new $tw.Language();\n\t$tw.languageSwitcher = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"language\",\n\t\tcontrollerTitle: \"$:/language\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/languages/en-GB\"\n\t\t],\n\t\tonSwitch: function(plugins) {\n\t\t\tif($tw.browser) {\n\t\t\t\tvar pluginTiddler = $tw.wiki.getTiddler(plugins[0]);\n\t\t\t\tif(pluginTiddler) {\n\t\t\t\t\tdocument.documentElement.setAttribute(\"dir\",pluginTiddler.getFieldString(\"text-direction\") || \"auto\");\n\t\t\t\t} else {\n\t\t\t\t\tdocument.documentElement.removeAttribute(\"dir\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Kick off the theme manager\n\t$tw.themeManager = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"theme\",\n\t\tcontrollerTitle: \"$:/theme\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/themes/tiddlywiki/snowwhite\",\n\t\t\t\"$:/themes/tiddlywiki/vanilla\"\n\t\t]\n\t});\n\t// Kick off the keyboard manager\n\t$tw.keyboardManager = new $tw.KeyboardManager();\n\t// Listen for shortcuts\n\tif($tw.browser) {\n\t\t$tw.utils.addEventListeners(document,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t}\n\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\n\t$tw.wiki.clearTiddlerEventQueue();\n\t// Find a working syncadaptor\n\t$tw.syncadaptor = undefined;\n\t$tw.modules.forEachModuleOfType(\"syncadaptor\",function(title,module) {\n\t\tif(!$tw.syncadaptor && module.adaptorClass) {\n\t\t\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\n\t\t}\n\t});\n\t// Set up the syncer object if we've got a syncadaptor\n\tif($tw.syncadaptor) {\n\t\t$tw.syncer = new $tw.Syncer({wiki: $tw.wiki, syncadaptor: $tw.syncadaptor});\n\t}\n\t// Setup the saver handler\n\t$tw.saverHandler = new $tw.SaverHandler({\n\t\twiki: $tw.wiki,\n\t\tdirtyTracking: !$tw.syncadaptor,\n\t\tpreloadDirty: $tw.boot.preloadDirty || []\n\t});\n\t// Host-specific startup\n\tif($tw.browser) {\n\t\t// Install the popup manager\n\t\t$tw.popup = new $tw.utils.Popup();\n\t\t// Install the animator\n\t\t$tw.anim = new $tw.utils.Animator();\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/story.js": {
            "title": "$:/core/modules/startup/story.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\nvar CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD = \"$:/config/Navigation/Permalinkview/CopyToClipboard\"; // Can be \"yes\" (default) or \"no\"\nvar CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/Permalinkview/UpdateAddressBar\"; // Can be \"yes\" (default) or \"no\"\n\n\n// Links to help, if there is no param\nvar HELP_OPEN_EXTERNAL_WINDOW = \"http://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window\";\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers({\n\t\tdisableHistory: $tw.boot.disableStartupNavigation\n\t});\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for tm-open-external-window message\n\t\t$tw.rootWidget.addEventListener(\"tm-open-external-window\",function(event) {\n\t\t\tvar paramObject = event.paramObject || {},\n\t\t\t\tstrUrl = event.param || HELP_OPEN_EXTERNAL_WINDOW,\n\t\t\t\tstrWindowName = paramObject.windowName,\n\t\t\t\tstrWindowFeatures = paramObject.windowFeatures;\n\t\t\twindow.open(strUrl, strWindowName, strWindowFeatures);\n\t\t});\n\t\t// Listen for the tm-print message\n\t\t$tw.rootWidget.addEventListener(\"tm-print\",function(event) {\n\t\t\t(event.event.view || window).print();\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\"\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\"\n\t\t\t});\t\t\t\t\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndisableHistory: if true $:/History is NOT updated\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = decodeURIComponent(hash.trim());\n\t\t} else {\n\t\t\ttarget = decodeURIComponent(hash.substr(0,split).trim());\n\t\t\tstoryFilter = decodeURIComponent(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t// Invoke any hooks that want to change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// Update history\n\tvar story = new $tw.Story({\n\t\twiki: $tw.wiki,\n\t\tstoryTitle: DEFAULT_STORY_TITLE,\n\t\thistoryTitle: DEFAULT_HISTORY_TITLE\n\t});\n\tif(!options.disableHistory) {\n\t\t// If a target tiddler was specified add it to the history stack\n\t\tif(target && target !== \"\") {\n\t\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t\t}\n\t\t\tstory.addToHistory(target);\n\t\t} else if(storyList.length > 0) {\n\t\t\tstory.addToHistory(storyList[0]);\n\t\t}\t\t\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.copyToClipboard: \"permalink\", \"permaview\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\t// Get the story and the history stack\n\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\ttargetTiddler = \"\";\n\tif(options.targetTiddler) {\n\t\ttargetTiddler = options.targetTiddler;\n\t} else {\n\t\t// The target tiddler is the one at the top of the stack\n\t\tif(historyList.length > 0) {\n\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t}\n\t\t// Blank the target tiddler if it isn't present in the story\n\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\ttargetTiddler = \"\";\n\t\t}\n\t}\n\t// Assemble the location hash\n\tswitch(options.updateAddressBar) {\n\t\tcase \"permalink\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t\tbreak;\n\t}\n\t// Copy URL to the clipboard\n\tswitch(options.copyToClipboard) {\n\t\tcase \"permalink\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler));\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList)));\n\t\t\tbreak;\n\t}\n\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\tif(options.updateHistory === \"yes\") {\n\t\t\t// Assign the location hash so that history is updated\n\t\t\twindow.location.hash = $tw.locationHash;\n\t\t} else {\n\t\t\t// We use replace so that browser history isn't affected\n\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t}\n\t}\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/startup/windows.js": {
            "title": "$:/core/modules/startup/windows.js",
            "text": "/*\\\ntitle: $:/core/modules/startup/windows.js\ntype: application/javascript\nmodule-type: startup\n\nSetup root widget handlers for the messages concerned with opening external browser windows\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"windows\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Global to keep track of open windows (hashmap by title)\n$tw.windows = {};\n\nexports.startup = function() {\n\t// Handle open window message\n\t$tw.rootWidget.addEventListener(\"tm-open-window\",function(event) {\n\t\t// Get the parameters\n\t\tvar refreshHandler,\n\t\t\ttitle = event.param || event.tiddlerTitle,\n\t\t\tparamObject = event.paramObject || {},\n\t\t\twindowTitle = paramObject.windowTitle || title,\n\t\t\ttemplate = paramObject.template || \"$:/core/templates/single.tiddler.window\",\n\t\t\twidth = paramObject.width || \"700\",\n\t\t\theight = paramObject.height || \"600\",\n\t\t\tvariables = $tw.utils.extend({},paramObject,{currentTiddler: title});\n\t\t// Open the window\n\t\tvar srcWindow,\n\t\t    srcDocument;\n\t\t// In case that popup blockers deny opening a new window\n\t\ttry {\n\t\t\tsrcWindow = window.open(\"\",\"external-\" + title,\"scrollbars,width=\" + width + \",height=\" + height),\n\t\t\tsrcDocument = srcWindow.document;\n\t\t}\n\t\tcatch(e) {\n\t\t\treturn;\n\t\t}\n\t\t$tw.windows[title] = srcWindow;\n\t\t// Check for reopening the same window\n\t\tif(srcWindow.haveInitialisedWindow) {\n\t\t\treturn;\n\t\t}\n\t\t// Initialise the document\n\t\tsrcDocument.write(\"<html><head></head><body class='tc-body tc-single-tiddler-window'></body></html>\");\n\t\tsrcDocument.close();\n\t\tsrcDocument.title = windowTitle;\n\t\tsrcWindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tdelete $tw.windows[title];\n\t\t\t$tw.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t},false);\n\t\t// Set up the styles\n\t\tvar styleWidgetNode = $tw.wiki.makeTranscludeWidget(\"$:/core/ui/PageStylesheet\",{\n\t\t\t\tdocument: $tw.fakeDocument,\n\t\t\t\tvariables: variables,\n\t\t\t\timportPageMacros: true}),\n\t\t\tstyleContainer = $tw.fakeDocument.createElement(\"style\");\n\t\tstyleWidgetNode.render(styleContainer,null);\n\t\tvar styleElement = srcDocument.createElement(\"style\");\n\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\tsrcDocument.head.insertBefore(styleElement,srcDocument.head.firstChild);\n\t\t// Render the text of the tiddler\n\t\tvar parser = $tw.wiki.parseTiddler(template),\n\t\t\twidgetNode = $tw.wiki.makeWidget(parser,{document: srcDocument, parentWidget: $tw.rootWidget, variables: variables});\n\t\twidgetNode.render(srcDocument.body,srcDocument.body.firstChild);\n\t\t// Function to handle refreshes\n\t\trefreshHandler = function(changes) {\n\t\t\tif(styleWidgetNode.refresh(changes,styleContainer,null)) {\n\t\t\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\t\t}\n\t\t\twidgetNode.refresh(changes);\n\t\t};\n\t\t$tw.wiki.addEventListener(\"change\",refreshHandler);\n\t\t// Listen for keyboard shortcuts\n\t\t$tw.utils.addEventListeners(srcDocument,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t\tsrcWindow.document.documentElement.addEventListener(\"click\",$tw.popup,true);\n\t\tsrcWindow.haveInitialisedWindow = true;\n\t});\n\t// Close open windows when unloading main window\n\t$tw.addUnloadTask(function() {\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t});\n\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "startup"
        },
        "$:/core/modules/story.js": {
            "title": "$:/core/modules/story.js",
            "text": "/*\\\ntitle: $:/core/modules/story.js\ntype: application/javascript\nmodule-type: global\n\nLightweight object for managing interactions with the story and history lists.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nConstruct Story object with options:\nwiki: reference to wiki object to use to resolve tiddler titles\nstoryTitle: title of story list tiddler\nhistoryTitle: title of history list tiddler\n*/\nfunction Story(options) {\n\toptions = options || {};\n\tthis.wiki = options.wiki || $tw.wiki;\n\tthis.storyTitle = options.storyTitle || \"$:/StoryList\";\n\tthis.historyTitle = options.historyTitle || \"$:/HistoryList\";\n};\n\nStory.prototype.navigateTiddler = function(navigateTo,navigateFromTitle,navigateFromClientRect) {\n\tthis.addToStory(navigateTo,navigateFromTitle);\n\tthis.addToHistory(navigateTo,navigateFromClientRect);\n};\n\nStory.prototype.getStoryList = function() {\n\treturn this.wiki.getTiddlerList(this.storyTitle) || [];\n};\n\nStory.prototype.addToStory = function(navigateTo,navigateFromTitle,options) {\n\toptions = options || {};\n\tvar storyList = this.getStoryList();\n\t// See if the tiddler is already there\n\tvar slot = storyList.indexOf(navigateTo);\n\t// Quit if it already exists in the story river\n\tif(slot >= 0) {\n\t\treturn;\n\t}\n\t// First we try to find the position of the story element we navigated from\n\tvar fromIndex = storyList.indexOf(navigateFromTitle);\n\tif(fromIndex >= 0) {\n\t\t// The tiddler is added from inside the river\n\t\t// Determine where to insert the tiddler; Fallback is \"below\"\n\t\tswitch(options.openLinkFromInsideRiver) {\n\t\t\tcase \"top\":\n\t\t\t\tslot = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tslot = storyList.length;\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\tslot = fromIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"below\": // Intentional fall-through\n\t\t\tdefault:\n\t\t\t\tslot = fromIndex + 1;\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \"top\"\n\t\tif(options.openLinkFromOutsideRiver === \"bottom\") {\n\t\t\t// Insert at bottom\n\t\t\tslot = storyList.length;\n\t\t} else {\n\t\t\t// Insert at top\n\t\t\tslot = 0;\n\t\t}\n\t}\n\t// Add the tiddler\n\tstoryList.splice(slot,0,navigateTo);\n\t// Save the story\n\tthis.saveStoryList(storyList);\n};\n\nStory.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList},\n\t\tthis.wiki.getModificationFields()\n\t));\n};\n\nStory.prototype.addToHistory = function(navigateTo,navigateFromClientRect) {\n\tvar titles = $tw.utils.isArray(navigateTo) ? navigateTo : [navigateTo];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: navigateFromClientRect});\n\t});\n\tthis.wiki.setTiddlerData(this.historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\nStory.prototype.storyCloseTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCloseAllTiddlers = function() {\n// TBD\n};\n\nStory.prototype.storyCloseOtherTiddlers = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyEditTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyDeleteTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storySaveTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCancelTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyNewTiddler = function(targetTitle) {\n// TBD\n};\n\nexports.Story = Story;\n\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/storyviews/classic.js": {
            "title": "$:/core/modules/storyviews/classic.js",
            "text": "/*\\\ntitle: $:/core/modules/storyviews/classic.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ClassicStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration()\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\tif(duration) {\n\t\t// Scroll the node into view\n\t\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\t\n\t} else {\n\t\ttargetElement.scrollIntoView();\n\t}\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Reset the margin once the transition is over\n\t\tsetTimeout(function() {\n\t\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t\t{transition: \"none\"},\n\t\t\t\t{marginBottom: \"\"}\n\t\t\t]);\n\t\t},duration);\n\t\t// Set up the initial position of the element\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t// Transition to the final position\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t]);\n\t}\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode(),\n\t\t\tremoveElement = function() {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t};\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\tremoveElement();\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar currWidth = targetElement.offsetWidth,\n\t\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Remove the dom nodes of the widget at the end of the transition\n\t\tsetTimeout(removeElement,duration);\n\t\t// Animate the closure\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"translateX(0px)\"},\n\t\t\t{marginBottom:  currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n};\n\nexports.classic = ClassicStoryView;\n\n})();",
            "type": "application/javascript",
            "module-type": "storyview"
        },
        "$:/core/modules/storyviews/pop.js": {
            "title": "$:/core/modules/storyviews/pop.js",
            "text": "/*\\\ntitle: $:/core/modules/storyviews/pop.js\ntype: application/javascript\nmodule-type: storyview\n\nAnimates list insertions and removals\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PopStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nPopStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nPopStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Reset once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"none\"}\n\t\t]);\n\t\t$tw.utils.setStyle(widget.document.body,[\n\t\t\t{\"overflow-x\": \"\"}\n\t\t]);\n\t},duration);\n\t// Prevent the page from overscrolling due to the zoom factor\n\t$tw.utils.setStyle(widget.document.body,[\n\t\t{\"overflow-x\": \"hidden\"}\n\t]);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(2)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nPopStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\tif(targetElement && targetElement.parentNode) {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t}\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Remove the element at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(0.1)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.pop = PopStoryView;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "storyview"
        },
        "$:/core/modules/storyviews/zoomin.js": {
            "title": "$:/core/modules/storyviews/zoomin.js",
            "text": "/*\\\ntitle: $:/core/modules/storyviews/zoomin.js\ntype: application/javascript\nmodule-type: storyview\n\nZooms between individual tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ZoominListView = function(listWidget) {\n\tvar self = this;\n\tthis.listWidget = listWidget;\n\t// Get the index of the tiddler that is at the top of the history\n\tvar history = this.listWidget.wiki.getTiddlerDataCached(this.listWidget.historyTitle,[]),\n\t\ttargetTiddler;\n\tif(history.length > 0) {\n\t\ttargetTiddler = history[history.length-1].title;\n\t}\n\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\n\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\n\t\tvar domNode = itemWidget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(domNode instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\tif((targetTiddler && targetTiddler !== itemWidget.parseTreeNode.itemTitle) || (!targetTiddler && index)) {\n\t\t\tdomNode.style.display = \"none\";\n\t\t} else {\n\t\t\tself.currentTiddlerDomNode = domNode;\n\t\t}\n\t\t$tw.utils.addClass(domNode,\"tc-storyview-zoomin-tiddler\");\n\t});\n};\n\nZoominListView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\t\tlistElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the new tiddler be position absolute and visible so that we can measure it\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"0 0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t// Get the position of the source node, or use the centre of the window as the source position\n\tvar sourceBounds = historyInfo.fromPageRect || {\n\t\t\tleft: window.innerWidth/2 - 2,\n\t\t\ttop: window.innerHeight/2 - 2,\n\t\t\twidth: window.innerWidth/8,\n\t\t\theight: window.innerHeight/8\n\t\t};\n\t// Try to find the title node in the target tiddler\n\tvar titleDomNode = findTitleDomNode(listItemWidget) || listItemWidget.findFirstDomNode(),\n\t\tzoomBounds = titleDomNode.getBoundingClientRect();\n\t// Compute the transform for the target tiddler to make the title lie over the source rectange\n\tvar targetBounds = targetElement.getBoundingClientRect(),\n\t\tscale = sourceBounds.width / zoomBounds.width,\n\t\tx = sourceBounds.left - targetBounds.left - (zoomBounds.left - targetBounds.left) * scale,\n\t\ty = sourceBounds.top - targetBounds.top - (zoomBounds.top - targetBounds.top) * scale;\n\t// Transform the target tiddler to its starting position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(targetElement);\n\t// Apply the ending transitions with a timeout to ensure that the previously applied transformations are applied first\n\tvar self = this,\n\t\tprevCurrentTiddler = this.currentTiddlerDomNode;\n\tthis.currentTiddlerDomNode = targetElement;\n\t// Transform the target tiddler to its natural size\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{zIndex: \"500\"},\n\t]);\n\t// Transform the previous tiddler out of the way and then hide it\n\tif(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {\n\t\tscale = zoomBounds.width / sourceBounds.width;\n\t\tx =  zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;\n\t\ty =  zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;\n\t\t$tw.utils.setStyle(prevCurrentTiddler,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transformOrigin: \"0 0\"},\n\t\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"},\n\t\t\t{zIndex: \"0\"}\n\t\t]);\n\t\t// Hide the tiddler when the transition has finished\n\t\tsetTimeout(function() {\n\t\t\tif(self.currentTiddlerDomNode !== prevCurrentTiddler) {\n\t\t\t\tprevCurrentTiddler.style.display = \"none\";\n\t\t\t}\n\t\t},duration);\n\t}\n\t// Scroll the target into view\n//\t$tw.pageScroller.scrollIntoView(targetElement);\n};\n\n/*\nFind the first child DOM node of a widget that has the class \"tc-title\"\n*/\nfunction findTitleDomNode(widget,targetClass) {\n\ttargetClass = targetClass || \"tc-title\";\n\tvar domNode = widget.findFirstDomNode();\n\tif(domNode && domNode.querySelector) {\n\t\treturn domNode.querySelector(\".\" + targetClass);\n\t}\n\treturn null;\n}\n\nZoominListView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the newly inserted node position absolute and hidden\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"none\"}\n\t]);\n};\n\nZoominListView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Abandon if hidden\n\tif(targetElement.style.display != \"block\" ) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Set up the tiddler that is being closed\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\t// We'll move back to the previous or next element in the story\n\tvar toWidget = widget.previousSibling();\n\tif(!toWidget) {\n\t\ttoWidget = widget.nextSibling();\n\t}\n\tvar toWidgetDomNode = toWidget && toWidget.findFirstDomNode();\n\t// Set up the tiddler we're moving back in\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.addClass(toWidgetDomNode,\"tc-storyview-zoomin-tiddler\");\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{display: \"block\"},\n\t\t\t{transformOrigin: \"50% 50%\"},\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(10)\"},\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0\"},\n\t\t\t{zIndex: \"500\"}\n\t\t]);\n\t\tthis.currentTiddlerDomNode = toWidgetDomNode;\n\t}\n\t// Animate them both\n\t// Force layout\n\t$tw.utils.forceLayout(this.listWidget.parentDomNode);\n\t// First, the tiddler we're closing\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(0.1)\"},\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"0\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\tsetTimeout(removeElement,duration);\n\t// Now the tiddler we're going back to\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t\t{opacity: \"1\"}\n\t\t]);\n\t}\n\treturn true; // Indicate that we'll delete the DOM node\n};\n\nexports.zoomin = ZoominListView;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "storyview"
        },
        "$:/core/modules/syncer.js": {
            "title": "$:/core/modules/syncer.js",
            "text": "/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store and synchronises them to a remote data store represented as a \"sync adaptor\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDefaults\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleIsAnonymous = \"$:/status/IsAnonymous\";\nSyncer.prototype.titleIsReadOnly = \"$:/status/IsReadOnly\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSyncPollingInterval = \"$:/config/SyncPollingInterval\";\nSyncer.prototype.titleSyncDisableLazyLoading = \"$:/config/SyncDisableLazyLoading\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.titleSyncThrottleInterval = \"$:/config/SyncThrottleInterval\";\nSyncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\nSyncer.prototype.errorRetryInterval = 5 * 1000; // Interval to retry after an error\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\n\n/*\nInstantiate the syncer with the following options:\nsyncadaptor: reference to syncadaptor to be used\nwiki: wiki to be synced\n*/\nfunction Syncer(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\t// Save parameters\n\tthis.syncadaptor = options.syncadaptor;\n\tthis.disableUI = !!options.disableUI;\n\tthis.titleIsLoggedIn = options.titleIsLoggedIn || this.titleIsLoggedIn;\n\tthis.titleUserName = options.titleUserName || this.titleUserName;\n\tthis.titleSyncFilter = options.titleSyncFilter || this.titleSyncFilter;\n\tthis.titleSavedNotification = options.titleSavedNotification || this.titleSavedNotification;\n\tthis.taskTimerInterval = options.taskTimerInterval || this.taskTimerInterval;\n\tthis.throttleInterval = options.throttleInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncThrottleInterval,\"\"),10) || this.throttleInterval;\n\tthis.errorRetryInterval = options.errorRetryInterval || this.errorRetryInterval;\n\tthis.fallbackInterval = options.fallbackInterval || this.fallbackInterval;\n\tthis.pollTimerInterval = options.pollTimerInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncPollingInterval,\"\"),10) || this.pollTimerInterval;\n\tthis.logging = \"logging\" in options ? options.logging : true;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\")  + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\"),{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging,\n\t\tsaveHistory: true\n\t});\n\t// Make another logger for connection errors\n\tthis.loggerConnection = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\")  + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\") + \"-connection\",{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging\n\t});\n\t// Ask the syncadaptor to use the main logger\n\tif(this.syncadaptor.setLoggerSaveBuffer) {\n\t\tthis.syncadaptor.setLoggerSaveBuffer(this.logger);\n\t}\n\t// Compile the dirty tiddler filter\n\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t// Record information for known tiddlers\n\tthis.readTiddlerInfo();\n\tthis.titlesToBeLoaded = {}; // Hashmap of titles of tiddlers that need loading from the server\n\tthis.titlesHaveBeenLazyLoaded = {}; // Hashmap of titles of tiddlers that have already been lazily loaded from the server\n\t// Timers\n\tthis.taskTimerId = null; // Timer for task dispatch\n\tthis.pollTimerId = null; // Timer for polling server\n\t// Number of outstanding requests\n\tthis.numTasksInProgress = 0;\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Filter the changes to just include ones that are being synced\n\t\tvar filteredChanges = self.getSyncedTiddlers(function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t\tif(filteredChanges.length > 0) {\n\t\t\tself.processTaskQueue();\n\t\t} else {\n\t\t\t// Look for deletions of tiddlers we're already syncing\t\n\t\t\tvar outstandingDeletion = false\n\t\t\t$tw.utils.each(changes,function(change,title,object) {\n\t\t\t\tif(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) {\n\t\t\t\t\toutstandingDeletion = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(outstandingDeletion) {\n\t\t\t\tself.processTaskQueue();\n\t\t\t}\n\t\t}\n\t});\n\t// Browser event handlers\n\tif($tw.browser && !this.disableUI) {\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t\t// Listen out for login/logout/refresh events in the browser\n\t\t$tw.rootWidget.addEventListener(\"tm-login\",function(event) {\n\t\t\tvar username = event && event.paramObject && event.paramObject.username,\n\t\t\t\tpassword = event && event.paramObject && event.paramObject.password;\n\t\t\tif(username && password) {\n\t\t\t\t// Login with username and password\n\t\t\t\tself.login(username,password,function() {});\n\t\t\t} else {\n\t\t\t\t// No username and password, so we display a prompt\n\t\t\t\tself.handleLoginEvent();\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-copy-syncer-logs-to-clipboard\",function() {\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getSystemInfo() + \"\\n\\nLog:\\n\" + self.logger.getBuffer());\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tif(!this.disableUI && this.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== \"yes\") {\n\t\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\t\tself.handleLazyLoadEvent(title);\n\t\t});\t\t\n\t}\n\t// Get the login status\n\tthis.getStatus(function(err,isLoggedIn) {\n\t\t// Do a sync from the server\n\t\tself.syncFromServer();\n\t});\n}\n\n/*\nShow a generic network error alert\n*/\nSyncer.prototype.displayError = function(msg,err) {\n\tif(err === ($tw.language.getString(\"Error/XMLHttpRequest\") + \": 0\")) {\n\t\tthis.loggerConnection.alert($tw.language.getString(\"Error/NetworkErrorAlert\"));\n\t\tthis.logger.log(msg + \":\",err);\n\t} else {\n\t\tthis.logger.alert(msg + \":\",err);\n\t}\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getSyncedTiddlers = function(source) {\n\treturn this.filterFn.call(this.wiki,source);\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getTiddlerRevision = function(title) {\n\tif(this.syncadaptor && this.syncadaptor.getTiddlerRevision) {\n\t\treturn this.syncadaptor.getTiddlerRevision(title);\n\t} else {\n\t\treturn this.wiki.getTiddler(title).fields.revision;\t\n\t} \n};\n\n/*\nRead (or re-read) the latest tiddler info from the store\n*/\nSyncer.prototype.readTiddlerInfo = function() {\n\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\n\t// \"revision\" is the revision of the tiddler last seen on the server, and \"changecount\" is the corresponding local changecount\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.getSyncedTiddlers();\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tself.tiddlerInfo[title] = {\n\t\t\t\trevision: self.getTiddlerRevision(title),\n\t\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t\t};\n\t\t}\n\t});\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\tthis.logger.log(\"Checking dirty status\");\n\t// Check tiddlers that are in the store and included in the filter function\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(this.wiki.tiddlerExists(title)) {\n\t\t\tif(tiddlerInfo) {\n\t\t\t\t// If the tiddler is known on the server and has been modified locally then it needs to be saved to the server\n\t\t\t\tif(this.wiki.getChangeCount(title) > tiddlerInfo.changeCount) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If the tiddler isn't known on the server then it needs to be saved to the server\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\t// Check tiddlers that are known from the server but not currently in the store\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\tif(!this.wiki.tiddlerExists(titles[index])) {\n\t\t\t// There must be a pending delete\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSyncer.prototype.updateDirtyStatus = function() {\n\tif($tw.browser && !this.disableUI) {\n\t\tvar dirty = this.isDirty();\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",dirty);\n\t\tif(!dirty) {\n\t\t\tthis.loggerConnection.clearAlerts();\n\t\t}\n\t}\n};\n\n/*\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\n*/\nSyncer.prototype.storeTiddler = function(tiddlerFields) {\n\t// Save the tiddler\n\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: this.getTiddlerRevision(tiddlerFields.title),\n\t\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\n\t\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title)\n\t};\n};\n\nSyncer.prototype.getStatus = function(callback) {\n\tvar self = this;\n\t// Check if the adaptor supports getStatus()\n\tif(this.syncadaptor && this.syncadaptor.getStatus) {\n\t\t// Mark us as not logged in\n\t\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \"no\"});\n\t\t// Get login status\n\t\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\t// Set the various status tiddlers\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsAnonymous,text: isAnonymous ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\t\tif(isLoggedIn) {\n\t\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tif(callback) {\n\t\t\t\tcallback(err,isLoggedIn,username);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null,true,\"UNAUTHENTICATED\");\n\t}\n};\n\n/*\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\n*/\nSyncer.prototype.syncFromServer = function() {\n\tvar self = this,\n\t\tcancelNextSync = function() {\n\t\t\tif(self.pollTimerId) {\n\t\t\t\tclearTimeout(self.pollTimerId);\n\t\t\t\tself.pollTimerId = null;\n\t\t\t}\n\t\t},\n\t\ttriggerNextSync = function() {\n\t\t\tself.pollTimerId = setTimeout(function() {\n\t\t\t\tself.pollTimerId = null;\n\t\t\t\tself.syncFromServer.call(self);\n\t\t\t},self.pollTimerInterval);\n\t\t},\n\t\tsyncSystemFromServer = (self.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"yes\" ? true : false);\n\tif(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) {\n\t\tthis.logger.log(\"Retrieving updated tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getUpdatedTiddlers(self,function(err,updates) {\n\t\t\ttriggerNextSync();\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(updates) {\n\t\t\t\t$tw.utils.each(updates.modifications,function(title) {\n\t\t\t\t\tself.titlesToBeLoaded[title] = true;\n\t\t\t\t});\n\t\t\t\t$tw.utils.each(updates.deletions,function(title) {\n\t\t\t\t\tif(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) {\n\t\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(updates.modifications.length > 0 || updates.deletions.length > 0) {\n\t\t\t\t\tself.processTaskQueue();\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t} else if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.logger.log(\"Retrieving skinny tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\ttriggerNextSync();\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Keep track of which tiddlers we already know about have been reported this time\n\t\t\tvar previousTitles = Object.keys(self.tiddlerInfo);\n\t\t\t// Process each incoming tiddler\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t// Get the incoming tiddler fields, and the existing tiddler\n\t\t\t\tvar tiddlerFields = tiddlers[t],\n\t\t\t\t\tincomingRevision = tiddlerFields.revision + \"\",\n\t\t\t\t\ttiddler = self.wiki.tiddlerExists(tiddlerFields.title) && self.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.tiddlerInfo[tiddlerFields.title],\n\t\t\t\t\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null,\n\t\t\t\t\tindexInPreviousTitles = previousTitles.indexOf(tiddlerFields.title);\n\t\t\t\tif(indexInPreviousTitles !== -1) {\n\t\t\t\t\tpreviousTitles.splice(indexInPreviousTitles,1);\n\t\t\t\t}\n\t\t\t\t// Ignore the incoming tiddler if it's the same as the revision we've already got\n\t\t\t\tif(currRevision !== incomingRevision) {\n\t\t\t\t\t// Only load the skinny version if we don't already have a fat version of the tiddler\n\t\t\t\t\tif(!tiddler || tiddler.fields.text === undefined) {\n\t\t\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\tself.titlesToBeLoaded[tiddlerFields.title] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Delete any tiddlers that were previously reported but missing this time\n\t\t\t$tw.utils.each(previousTitles,function(title) {\n\t\t\t\tif(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) {\n\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t});\n\t\t\tself.processTaskQueue();\n\t\t});\n\t}\n};\n\n/*\nForce load a tiddler from the server\n*/\nSyncer.prototype.enqueueLoadTiddler = function(title) {\n\tthis.titlesToBeLoaded[title] = true;\n\tthis.processTaskQueue();\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Ignore if the syncadaptor doesn't handle it\n\tif(!this.syncadaptor.supportsLazyLoading) {\n\t\treturn;\n\t}\n\t// Don't lazy load the same tiddler twice\n\tif(!this.titlesHaveBeenLazyLoaded[title]) {\n\t\t// Don't lazy load if the tiddler isn't included in the sync filter\n\t\tif(this.getSyncedTiddlers().indexOf(title) !== -1) {\n\t\t\t// Mark the tiddler as needing loading, and having already been lazily loaded\n\t\t\tthis.titlesToBeLoaded[title] = true;\n\t\t\tthis.titlesHaveBeenLazyLoaded[title] = true;\n\t\t}\n\t}\n};\n\n/*\nDispay a password prompt and allow the user to login\n*/\nSyncer.prototype.handleLoginEvent = function() {\n\tvar self = this;\n\tthis.getStatus(function(err,isLoggedIn,username) {\n\t\tif(!err && !isLoggedIn) {\n\t\t\tif(self.syncadaptor && self.syncadaptor.displayLoginPrompt) {\n\t\t\t\tself.syncadaptor.displayLoginPrompt(self);\n\t\t\t} else {\n\t\t\t\tself.displayLoginPrompt();\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nDispay a password prompt\n*/\nSyncer.prototype.displayLoginPrompt = function() {\n\tvar self = this;\n\tvar promptInfo = $tw.passwordPrompt.createPrompt({\n\t\tserviceName: $tw.language.getString(\"LoginToTiddlySpace\"),\n\t\tcallback: function(data) {\n\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\tself.syncFromServer();\n\t\t\t});\n\t\t\treturn true; // Get rid of the password prompt\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(err,isLoggedIn);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tcallback(null,true);\n\t}\n};\n\n/*\nAttempt to log out of TiddlyWeb\n*/\nSyncer.prototype.handleLogoutEvent = function() {\n\tthis.logger.log(\"Attempting to logout\");\n\tvar self = this;\n\tif(this.syncadaptor.logout) {\n\t\tthis.syncadaptor.logout(function(err) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\tself.getStatus();\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nImmediately refresh from the server\n*/\nSyncer.prototype.handleRefreshEvent = function() {\n\tthis.syncFromServer();\n};\n\n/*\nProcess the next task\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if the sync adaptor is fully initialised and we're not already performing\n\t// a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif((!this.syncadaptor.isReady || this.syncadaptor.isReady()) && this.numTasksInProgress === 0) {\n\t\t// Choose the next task to perform\n\t\tvar task = this.chooseNextTask();\n\t\t// Perform the task if we had one\n\t\tif(typeof task === \"object\" && task !== null) {\n\t\t\tthis.numTasksInProgress += 1;\n\t\t\ttask.run(function(err) {\n\t\t\t\tself.numTasksInProgress -= 1;\n\t\t\t\tif(err) {\n\t\t\t\t\tself.displayError(\"Sync error while processing \" + task.type + \" of '\" + task.title + \"'\",err);\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\tself.triggerTimeout(self.errorRetryInterval);\n\t\t\t\t} else {\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\t// Process the next task\n\t\t\t\t\tself.processTaskQueue.call(self);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// No task is ready so update the status\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// And trigger a timeout if there is a pending task\n\t\t\tif(task === true) {\n\t\t\t\tthis.triggerTimeout();\t\t\t\t\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthis.updateDirtyStatus();\t\t\n\t}\n};\n\nSyncer.prototype.triggerTimeout = function(interval) {\n\tvar self = this;\n\tif(!this.taskTimerId) {\n\t\tthis.taskTimerId = setTimeout(function() {\n\t\t\tself.taskTimerId = null;\n\t\t\tself.processTaskQueue.call(self);\n\t\t},interval || self.taskTimerInterval);\n\t}\n};\n\n/*\nChoose the next sync task. We prioritise saves, then deletes, then loads from the server\n\nReturns either a task object, null if there's no upcoming tasks, or the boolean true if there are pending tasks that aren't yet due\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar thresholdLastSaved = (new Date()) - this.throttleInterval,\n\t\thavePending = null;\n\t// First we look for tiddlers that have been modified locally and need saving back to the server\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title),\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(tiddler) {\n\t\t\t// If the tiddler is not known on the server, or has been modified locally no more recently than the threshold then it needs to be saved to the server\n\t\t\tvar hasChanged = !tiddlerInfo || this.wiki.getChangeCount(title) > tiddlerInfo.changeCount,\n\t\t\t\tisReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved;\n\t\t\tif(hasChanged) {\n\t\t\t\tif(isReadyToSave) {\n\t\t\t\t\treturn new SaveTiddlerTask(this,title); \t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\thavePending = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Second, we check tiddlers that are known from the server but not currently in the store, and so need deleting on the server\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\ttitle = titles[index];\n\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\treturn new DeleteTiddlerTask(this,title);\n\t\t}\n\t}\n\t// Check for tiddlers that need loading\n\ttitle = Object.keys(this.titlesToBeLoaded)[0];\n\tif(title) {\n\t\tdelete this.titlesToBeLoaded[title];\n\t\treturn new LoadTiddlerTask(this,title);\n\t}\n\t// No tasks are ready\n\treturn havePending;\n};\n\nfunction SaveTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"save\";\n}\n\nSaveTiddlerTask.prototype.run = function(callback) {\n\tvar self = this,\n\t\tchangeCount = this.syncer.wiki.getChangeCount(this.title),\n\t\ttiddler = this.syncer.wiki.tiddlerExists(this.title) && this.syncer.wiki.getTiddler(this.title);\n\tthis.syncer.logger.log(\"Dispatching 'save' task:\",this.title);\n\tif(tiddler) {\n\t\tthis.syncer.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t// If there's an error, exit without changing any internal state\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Adjust the info stored about this tiddler\n\t\t\tself.syncer.tiddlerInfo[self.title] = {\n\t\t\t\tchangeCount: changeCount,\n\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\trevision: revision,\n\t\t\t\ttimestampLastSaved: new Date()\n\t\t\t};\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t},{\n\t\t\ttiddlerInfo: self.syncer.tiddlerInfo[self.title]\n\t\t});\n\t} else {\n\t\tthis.syncer.logger.log(\" Not Dispatching 'save' task:\",this.title,\"tiddler does not exist\");\n\t\t$tw.utils.nextTick(callback(null));\n\t}\n};\n\nfunction DeleteTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"delete\";\n}\n\nDeleteTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'delete' task:\",this.title);\n\tthis.syncer.syncadaptor.deleteTiddler(this.title,function(err) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Remove the info stored about this tiddler\n\t\tdelete self.syncer.tiddlerInfo[self.title];\n\t\tif($tw.boot.files){\n\t\t\t// Remove the tiddler from $tw.boot.files\n\t\t\tdelete $tw.boot.files[self.title];\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t},{\n\t\ttiddlerInfo: self.syncer.tiddlerInfo[this.title]\n\t});\n};\n\nfunction LoadTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"load\";\n}\n\nLoadTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'load' task:\",this.title);\n\tthis.syncer.syncadaptor.loadTiddler(this.title,function(err,tiddlerFields) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Update the info stored about this tiddler\n\t\tif(tiddlerFields) {\n\t\t\tself.syncer.storeTiddler(tiddlerFields);\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t});\n};\n\nexports.Syncer = Syncer;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/tiddler.js": {
            "title": "$:/core/modules/tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/tiddler.js\ntype: application/javascript\nmodule-type: tiddlermethod\n\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.hasTag = function(tag) {\n\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\n};\n\nexports.isPlugin = function() {\n\treturn this.fields.type === \"application/json\" && this.hasField(\"plugin-type\");\n};\n\nexports.isDraft = function() {\n\treturn this.hasField(\"draft.of\");\n};\n\nexports.getFieldString = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn \"\";\n\t}\n\t// Parse the field with the associated module (if any)\n\tvar fieldModule = $tw.Tiddler.fieldModules[field];\n\tif(fieldModule && fieldModule.stringify) {\n\t\treturn fieldModule.stringify.call(this,value);\n\t} else {\n\t\treturn value.toString();\n\t}\n};\n\n/*\nGet the value of a field as a list\n*/\nexports.getFieldList = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn [];\n\t}\n\treturn $tw.utils.parseStringArray(value);\n};\n\n/*\nGet all the fields as a hashmap of strings. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStrings = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [];\n\tvar fields = {};\n\tfor(var field in this.fields) {\n\t\tif($tw.utils.hop(this.fields,field)) {\n\t\t\tif(exclude.indexOf(field) === -1) {\n\t\t\t\tfields[field] = this.getFieldString(field);\n\t\t\t}\n\t\t}\n\t}\n\treturn fields;\n};\n\n/*\nGet all the fields as a name:value block. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStringBlock = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [],\n\t\tfields = Object.keys(this.fields).sort(),\n\t\tresult = [];\n\tfor(var t=0; t<fields.length; t++) {\n\t\tvar field = fields[t];\n\t\tif(exclude.indexOf(field) === -1) {\n\t\t\tresult.push(field + \": \" + this.getFieldString(field));\n\t\t}\n\t}\n\treturn result.join(\"\\n\");\n};\n\nexports.getFieldDay = function(field) {\n\tif(this.cache && this.cache.day && $tw.utils.hop(this.cache.day,field) ) {\n\t\treturn this.cache.day[field];\n\t}\n\tvar day = \"\";\n\tif(this.fields[field]) {\n\t\tday = (new Date($tw.utils.parseDate(this.fields[field]))).setHours(0,0,0,0);\n\t}\n\tthis.cache.day = this.cache.day || {};\n\tthis.cache.day[field] = day;\n\treturn day;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "tiddlermethod"
        },
        "$:/core/modules/upgraders/plugins.js": {
            "title": "$:/core/modules/upgraders/plugins.js",
            "text": "/*\\\ntitle: $:/core/modules/upgraders/plugins.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that checks that plugins are newer than any already installed version\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar BLOCKED_PLUGINS = {\n\t\"$:/themes/tiddlywiki/stickytitles\": {\n\t\tversions: [\"*\"]\n\t},\n\t\"$:/plugins/tiddlywiki/fullscreen\": {\n\t\tversions: [\"*\"]\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tupgradeLibrary,\n\t\tgetLibraryTiddler = function(title) {\n\t\t\tif(!upgradeLibrary) {\n\t\t\t\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\n\t\t\t\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\n\t\t\t}\n\t\t\treturn upgradeLibrary.tiddlers[title];\n\t\t};\n\n\t// Go through all the incoming tiddlers\n\t$tw.utils.each(titles,function(title) {\n\t\tvar incomingTiddler = tiddlers[title];\n\t\t// Check if we're dealing with a plugin\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"]) {\n\t\t\t// Check whether the plugin contains JS modules\n\t\t\tvar requiresReload = wiki.doesPluginInfoRequireReload(JSON.parse(incomingTiddler.text)) ? (wiki.getTiddlerText(\"$:/language/ControlPanel/Plugins/PluginWillRequireReload\") + \" \") : \"\";\n\t\t\tmessages[title] = requiresReload;\n\t\t\tif(incomingTiddler.version) {\n\t\t\t\t// Upgrade the incoming plugin if it is in the upgrade library\n\t\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\t\tmessages[title] = requiresReload + $tw.language.getString(\"Import/Upgrader/Plugins/Upgraded\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Version\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Check whether the plugin is on the blocked list\n\t\t\tvar blockInfo = BLOCKED_PLUGINS[title];\n\t\t\tif(blockInfo) {\n\t\t\t\tif(blockInfo.versions.indexOf(\"*\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Incompatible\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "upgrader"
        },
        "$:/core/modules/upgraders/system.js": {
            "title": "$:/core/modules/upgraders/system.js",
            "text": "/*\\\ntitle: $:/core/modules/upgraders/system.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_LIST = [\"$:/StoryList\",\"$:/HistoryList\"],\n\tDONT_IMPORT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\",\"$:/Import\"],\n\tWARN_IMPORT_PREFIX_LIST = [\"$:/core/modules/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tshowAlert = false;\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\n\t\t\ttiddlers[title] = Object.create(null);\n\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Suppressed\");\n\t\t} else {\n\t\t\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/State/Suppressed\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(var t=0; t<WARN_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = WARN_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix && wiki.isShadowTiddler(title)) {\n\t\t\t\t\tshowAlert = true;\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Warning\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tif(showAlert) {\n\t\tvar logger = new $tw.utils.Logger(\"import\");\n\t\tlogger.alert($tw.language.getString(\"Import/Upgrader/System/Alert\"));\n\t}\n\treturn messages;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "upgrader"
        },
        "$:/core/modules/upgraders/themetweaks.js": {
            "title": "$:/core/modules/upgraders/themetweaks.js",
            "text": "/*\\\ntitle: $:/core/modules/upgraders/themetweaks.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\n\nPreviously, theme tweaks were stored in two data tiddlers:\n\n* $:/themes/tiddlywiki/vanilla/metrics\n* $:/themes/tiddlywiki/vanilla/settings\n\nNow, each tweak is stored in its own separate tiddler.\n\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MAPPINGS = {\n\t\"$:/themes/tiddlywiki/vanilla/metrics\": {\n\t\t\"fontsize\": \"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\n\t\t\"lineheight\": \"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\n\t\t\"storyleft\": \"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\n\t\t\"storytop\": \"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\n\t\t\"storyright\": \"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\n\t\t\"storywidth\": \"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\n\t\t\"tiddlerwidth\": \"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"\n\t},\n\t\"$:/themes/tiddlywiki/vanilla/settings\": {\n\t\t\"fontfamily\": \"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tvar mapping = MAPPINGS[title];\n\t\tif(mapping) {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\n\t\t\t\ttiddlerData = wiki.getTiddlerDataCached(tiddler,{});\n\t\t\tfor(var index in mapping) {\n\t\t\t\tvar mappedTitle = mapping[index];\n\t\t\t\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\n\t\t\t\t\ttiddlers[mappedTitle] = {\n\t\t\t\t\t\ttitle: mappedTitle,\n\t\t\t\t\t\ttext: tiddlerData[index]\n\t\t\t\t\t};\n\t\t\t\t\tmessages[mappedTitle] = $tw.language.getString(\"Import/Upgrader/ThemeTweaks/Created\",{variables: {\n\t\t\t\t\t\tfrom: title + \"##\" + index\n\t\t\t\t\t}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "upgrader"
        },
        "$:/core/modules/utils/base64-utf8/base64-utf8.module.js": {
            "text": "(function(){// From https://gist.github.com/Nijikokun/5192472\n//\n// UTF8 Module\n//\n// Cleaner and modularized utf-8 encoding and decoding library for javascript.\n//\n// copyright: MIT\n// author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com\n!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"utf8\",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if(\"string\"!=typeof r)return r;r=r.replace(/\\r\\n/g,\"\\n\");for(var e,o=\"\",t=0;t<r.length;t++)if((e=r.charCodeAt(t))<128)o+=String.fromCharCode(e);else if(e>127&&e<2048)o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128);else if(e>55295&&e<57344&&r.length>t+1){var i=e,n=r.charCodeAt(t+1);t++;var d=65536+(i-55296<<10|n-56320);o+=String.fromCharCode(d>>18|240),o+=String.fromCharCode(d>>12&63|128),o+=String.fromCharCode(d>>6&63|128),o+=String.fromCharCode(63&d|128)}else o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128);return o},decode:function(r){if(\"string\"!=typeof r)return r;for(var e=\"\",o=0,t=0;o<r.length;)if((t=r.charCodeAt(o))<128)e+=String.fromCharCode(t),o++;else if(t>191&&t<224)e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2;else if(t>223&&t<240)e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3;else{var i=(7&t)<<18|(63&r.charCodeAt(o+1))<<12|(63&r.charCodeAt(o+2))<<6|63&r.charCodeAt(o+3);e+=String.fromCharCode(55296+(i-65536>>10))+String.fromCharCode(56320+(i-65536&1023)),o+=4}return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var i=0;i<t.length;i++)o[t[i]]=o.require(t[i]);o.module.exports=e.apply(o)}else void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"base64\",t||[],e):o.base64=e.apply(o)}(0,function(r){var e=r||this.utf8,o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";return{encode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=e.encode(r);for(var t,i,n,d,f,a,h,C=\"\",c=0;c<r.length;)d=(t=r.charCodeAt(c++))>>2,f=(3&t)<<4|(i=r.charCodeAt(c++))>>4,a=(15&i)<<2|(n=r.charCodeAt(c++))>>6,h=63&n,isNaN(i)?a=h=64:isNaN(n)&&(h=64),C+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return C},decode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");for(var t,i,n,d,f,a,h=\"\",C=0;C<r.length;)t=o.indexOf(r.charAt(C++))<<2|(d=o.indexOf(r.charAt(C++)))>>4,i=(15&d)<<4|(f=o.indexOf(r.charAt(C++)))>>2,n=(3&f)<<6|(a=o.indexOf(r.charAt(C++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(i)),64!=a&&(h+=String.fromCharCode(n));return e.decode(h)}}},this,[\"utf8\"]);}).call(exports);",
            "type": "application/javascript",
            "title": "$:/core/modules/utils/base64-utf8/base64-utf8.module.js",
            "module-type": "library"
        },
        "$:/core/modules/utils/crypto.js": {
            "title": "$:/core/modules/utils/crypto.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/crypto.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions related to crypto.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for an encrypted store area in the text of a TiddlyWiki file\n*/\nexports.extractEncryptedStoreArea = function(text) {\n\tvar encryptedStoreAreaStartMarker = \"<pre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">\",\n\t\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\n\tif(encryptedStoreAreaStart !== -1) {\n\t\tvar encryptedStoreAreaEnd = text.indexOf(\"</pre>\",encryptedStoreAreaStart);\n\t\tif(encryptedStoreAreaEnd !== -1) {\n\t\t\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd-1));\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\n*/\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\n\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\n\tif(decryptedText) {\n\t\tvar json = JSON.parse(decryptedText),\n\t\t\ttiddlers = [];\n\t\tfor(var title in json) {\n\t\t\tif(title !== \"$:/isEncrypted\") {\n\t\t\t\ttiddlers.push(json[title]);\n\t\t\t}\n\t\t}\n\t\treturn tiddlers;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\ncallback: function(tiddlers) called with the array of decrypted tiddlers\n\nThe following configuration settings are supported:\n\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\n*/\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\n\t// Try to decrypt with the current password\n\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\n\tif(tiddlers) {\n\t\tcallback(tiddlers);\n\t} else {\n\t\t// Prompt for a new password and keep trying\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: \"Enter a password to decrypt the imported TiddlyWiki\",\n\t\t\tnoUserName: true,\n\t\t\tcanCancel: true,\n\t\t\tsubmitText: \"Decrypt\",\n\t\t\tcallback: function(data) {\n\t\t\t\t// Exit if the user cancelled\n\t\t\t\tif(!data) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Attempt to decrypt the tiddlers\n\t\t\t\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tif($tw.config.usePasswordVault) {\n\t\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t\t}\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t\t// Exit and remove the password prompt\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\t// We didn't decrypt everything, so continue to prompt for password\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/csv.js": {
            "title": "$:/core/modules/utils/csv.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/csv.js\ntype: application/javascript\nmodule-type: utils\n\nA barebones CSV parser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a CSV string with a header row and return an array of hashmaps.\n*/\nexports.parseCsvStringWithHeader = function(text,options) {\n\toptions = options || {};\n\tvar separator = options.separator || \",\",\n\t\trows = text.split(/\\r?\\n/mg).map(function(row) {\n\t\t\treturn $tw.utils.trim(row);\n\t\t}).filter(function(row) {\n\t\t\treturn row !== \"\";\n\t\t});\n\tif(rows.length < 1) {\n\t\treturn \"Missing header row\";\n\t}\n\tvar headings = rows[0].split(separator),\n\t\tresults = [];\n\tfor(var row=1; row<rows.length; row++) {\n\t\tvar columns = rows[row].split(separator),\n\t\t\tcolumnResult = Object.create(null);\n\t\tif(columns.length !== headings.length) {\n\t\t\treturn \"Malformed CSV row '\" + rows[row] + \"'\";\n\t\t}\n\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\tvar columnName = headings[column];\n\t\t\tcolumnResult[columnName] = $tw.utils.trim(columns[column] || \"\");\n\t\t}\n\t\tresults.push(columnResult);\t\t\t\n\t}\n\treturn results;\n}\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/diff-match-patch/diff_match_patch.js": {
            "text": "(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=.5;this.Patch_Margin=4;this.Match_MaxBits=32}var DIFF_DELETE=-1,DIFF_INSERT=1,DIFF_EQUAL=0;\ndiff_match_patch.prototype.diff_main=function(a,b,c,d){\"undefined\"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error(\"Null input. (diff_main)\");if(a==b)return a?[[DIFF_EQUAL,a]]:[];\"undefined\"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);f=this.diff_commonSuffix(a,b);var g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,\nb,e,d);c&&a.unshift([DIFF_EQUAL,c]);g&&a.push([DIFF_EQUAL,g]);this.diff_cleanupMerge(a);return a};\ndiff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[DIFF_INSERT,b]];if(!b)return[[DIFF_DELETE,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[DIFF_INSERT,e.substring(0,g)],[DIFF_EQUAL,f],[DIFF_INSERT,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=DIFF_DELETE),c):1==f.length?[[DIFF_DELETE,a],[DIFF_INSERT,b]]:(e=this.diff_halfMatch_(a,b))?(b=e[1],f=e[3],a=e[4],e=this.diff_main(e[0],e[2],c,d),c=this.diff_main(b,f,c,d),e.concat([[DIFF_EQUAL,\na]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,d):this.diff_bisect_(a,b,d)};\ndiff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([DIFF_EQUAL,\"\"]);for(var e=d=b=0,f=\"\",g=\"\";b<a.length;){switch(a[b][0]){case DIFF_INSERT:e++;g+=a[b][1];break;case DIFF_DELETE:d++;f+=a[b][1];break;case DIFF_EQUAL:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=\nd.length}d=e=0;g=f=\"\"}b++}a.pop();return a};\ndiff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=2*f,h=Array(g),l=Array(g),k=0;k<g;k++)h[k]=-1,l[k]=-1;h[f+1]=0;l[f+1]=0;k=d-e;for(var m=0!=k%2,p=0,x=0,w=0,q=0,t=0;t<f&&!((new Date).getTime()>c);t++){for(var v=-t+p;v<=t-x;v+=2){var n=f+v;var r=v==-t||v!=t&&h[n-1]<h[n+1]?h[n+1]:h[n-1]+1;for(var y=r-v;r<d&&y<e&&a.charAt(r)==b.charAt(y);)r++,y++;h[n]=r;if(r>d)x+=2;else if(y>e)p+=2;else if(m&&(n=f+k-v,0<=n&&n<g&&-1!=l[n])){var u=d-l[n];if(r>=\nu)return this.diff_bisectSplit_(a,b,r,y,c)}}for(v=-t+w;v<=t-q;v+=2){n=f+v;u=v==-t||v!=t&&l[n-1]<l[n+1]?l[n+1]:l[n-1]+1;for(r=u-v;u<d&&r<e&&a.charAt(d-u-1)==b.charAt(e-r-1);)u++,r++;l[n]=u;if(u>d)q+=2;else if(r>e)w+=2;else if(!m&&(n=f+k-v,0<=n&&n<g&&-1!=h[n]&&(r=h[n],y=f+r-n,u=d-u,r>=u)))return this.diff_bisectSplit_(a,b,r,y,c)}}return[[DIFF_DELETE,a],[DIFF_INSERT,b]]};\ndiff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};\ndiff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b=\"\",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf(\"\\n\",c);-1==f&&(f=a.length-1);var h=a.substring(c,f+1);c=f+1;(e.hasOwnProperty?e.hasOwnProperty(h):void 0!==e[h])?b+=String.fromCharCode(e[h]):(b+=String.fromCharCode(g),e[h]=g,d[g++]=h)}return b}var d=[],e={};d[0]=\"\";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};\ndiff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join(\"\")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;d=0;for(var e=1;;){var f=a.substring(c-e);f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};\ndiff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g=\"\",h,k,l,m;-1!=(e=b.indexOf(d,e+1));){var p=f.diff_commonPrefix(a.substring(c),b.substring(e)),u=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<u+p&&(g=b.substring(e-u,e)+b.substring(e,e+p),h=a.substring(0,c-u),k=a.substring(c+p),l=b.substring(0,e-u),m=b.substring(e+p))}return 2*g.length>=a.length?[h,k,l,m,g]:null}if(0>=this.Diff_Timeout)return null;\nvar d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4));d=c(d,e,Math.ceil(d.length/2));if(g||d)g=d?g?g[4].length>d[4].length?g:d:d:g;else return null;if(a.length>b.length){d=g[0];e=g[1];var h=g[2];var l=g[3]}else h=g[0],l=g[1],d=g[2],e=g[3];return[d,e,h,l,g[4]]};\ndiff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,l=0,k=0;f<a.length;)a[f][0]==DIFF_EQUAL?(c[d++]=f,g=l,h=k,k=l=0,e=a[f][1]):(a[f][0]==DIFF_INSERT?l+=a[f][1].length:k+=a[f][1].length,e&&e.length<=Math.max(g,h)&&e.length<=Math.max(l,k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,d--,f=0<d?c[d-1]:-1,k=l=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(a[f-1][0]==\nDIFF_DELETE&&a[f][0]==DIFF_INSERT){b=a[f-1][1];c=a[f][1];d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[DIFF_EQUAL,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[DIFF_EQUAL,b.substring(0,e)]),a[f-1][0]=DIFF_INSERT,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=DIFF_DELETE,a[f+1][1]=b.substring(e),f++;f++}f++}};\ndiff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_);c=g&&c.match(diff_match_patch.linebreakRegex_);d=h&&d.match(diff_match_patch.linebreakRegex_);var k=c&&a.match(diff_match_patch.blanklineEndRegex_),l=d&&b.match(diff_match_patch.blanklineStartRegex_);\nreturn k||l?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(a[c-1][0]==DIFF_EQUAL&&a[c+1][0]==DIFF_EQUAL){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g){var h=e.substring(e.length-g);d=d.substring(0,d.length-g);e=h+e.substring(0,e.length-g);f=h+f}g=d;h=e;for(var l=f,k=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){d+=e.charAt(0);e=e.substring(1)+f.charAt(0);f=f.substring(1);var m=b(d,e)+b(e,f);m>=k&&(k=m,g=d,h=e,l=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-\n1,1),c--),a[c][1]=h,l?a[c+1][1]=l:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\\s/;diff_match_patch.linebreakRegex_=/[\\r\\n]/;diff_match_patch.blanklineEndRegex_=/\\n\\r?\\n$/;diff_match_patch.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;\ndiff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,l=!1,k=!1;f<a.length;)a[f][0]==DIFF_EQUAL?(a[f][1].length<this.Diff_EditCost&&(l||k)?(c[d++]=f,g=l,h=k,e=a[f][1]):(d=0,e=null),l=k=!1):(a[f][0]==DIFF_DELETE?k=!0:l=!0,e&&(g&&h&&l&&k||e.length<this.Diff_EditCost/2&&3==g+h+l+k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,e=null,g&&h?(l=k=!0,d=0):(d--,f=0<d?c[d-1]:-1,l=k=!1),b=!0)),f++;b&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([DIFF_EQUAL,\"\"]);for(var b=0,c=0,d=0,e=\"\",f=\"\",g;b<a.length;)switch(a[b][0]){case DIFF_INSERT:d++;f+=a[b][1];b++;break;case DIFF_DELETE:c++;e+=a[b][1];b++;break;case DIFF_EQUAL:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&a[b-c-d-1][0]==DIFF_EQUAL?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[DIFF_EQUAL,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-\ng)+a[b][1],f=f.substring(0,f.length-g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[DIFF_INSERT,f]):0===d?a.splice(b-c,c+d,[DIFF_DELETE,e]):a.splice(b-c-d,c+d,[DIFF_DELETE,e],[DIFF_INSERT,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&a[b-1][0]==DIFF_EQUAL?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=\"\"}\"\"===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)a[b-1][0]==DIFF_EQUAL&&a[b+1][0]==DIFF_EQUAL&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,\na[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){a[g][0]!==DIFF_INSERT&&(c+=a[g][1].length);a[g][0]!==DIFF_DELETE&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&a[g][0]===DIFF_DELETE?f:f+(b-e)};\ndiff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\\n/g,g=0;g<a.length;g++){var h=a[g][0],l=a[g][1].replace(c,\"&amp;\").replace(d,\"&lt;\").replace(e,\"&gt;\").replace(f,\"&para;<br>\");switch(h){case DIFF_INSERT:b[g]='<ins style=\"background:#e6ffe6;\">'+l+\"</ins>\";break;case DIFF_DELETE:b[g]='<del style=\"background:#ffe6e6;\">'+l+\"</del>\";break;case DIFF_EQUAL:b[g]=\"<span>\"+l+\"</span>\"}}return b.join(\"\")};\ndiff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_INSERT&&(b[c]=a[c][1]);return b.join(\"\")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_DELETE&&(b[c]=a[c][1]);return b.join(\"\")};\ndiff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][1];switch(a[e][0]){case DIFF_INSERT:c+=f.length;break;case DIFF_DELETE:d+=f.length;break;case DIFF_EQUAL:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};\ndiff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case DIFF_INSERT:b[c]=\"+\"+encodeURI(a[c][1]);break;case DIFF_DELETE:b[c]=\"-\"+a[c][1].length;break;case DIFF_EQUAL:b[c]=\"=\"+a[c][1].length}return b.join(\"\\t\").replace(/%20/g,\" \")};\ndiff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case \"+\":try{c[d++]=[DIFF_INSERT,decodeURI(h)]}catch(k){throw Error(\"Illegal escape in diff_fromDelta: \"+h);}break;case \"-\":case \"=\":var l=parseInt(h,10);if(isNaN(l)||0>l)throw Error(\"Invalid number in diff_fromDelta: \"+h);h=a.substring(e,e+=l);\"=\"==f[g].charAt(0)?c[d++]=[DIFF_EQUAL,h]:c[d++]=[DIFF_DELETE,h];break;default:if(f[g])throw Error(\"Invalid diff operation in diff_fromDelta: \"+\nf[g]);}}if(e!=a.length)throw Error(\"Delta length (\"+e+\") does not equal source text length (\"+a.length+\").\");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error(\"Null input. (match_main)\");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};\ndiff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return f.Match_Distance?e+g/f.Match_Distance:g?1:e}if(b.length>this.Match_MaxBits)throw Error(\"Pattern too long for this browser.\");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));var l=1<<b.length-1;h=-1;for(var k,m,p=b.length+a.length,x,w=0;w<b.length;w++){k=0;for(m=p;k<m;)d(w,\nc+m)<=g?k=m:p=m,m=Math.floor((p-k)/2+k);p=m;k=Math.max(1,c-m+1);var q=Math.min(c+m,a.length)+b.length;m=Array(q+2);for(m[q+1]=(1<<w)-1;q>=k;q--){var t=e[a.charAt(q-1)];m[q]=0===w?(m[q+1]<<1|1)&t:(m[q+1]<<1|1)&t|(x[q+1]|x[q])<<1|1|x[q+1];if(m[q]&l&&(t=d(w,q-1),t<=g))if(g=t,h=q-1,h>c)k=Math.max(1,2*c-h);else break}if(d(w+1,c)>g)break;x=m}return h};\ndiff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};\ndiff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([DIFF_EQUAL,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([DIFF_EQUAL,d]);a.start1-=c.length;a.start2-=\nc.length;a.length1+=c.length+d.length;a.length2+=c.length+d.length}};\ndiff_match_patch.prototype.patch_make=function(a,b,c){if(\"string\"==typeof a&&\"string\"==typeof b&&\"undefined\"==typeof c){var d=a;b=this.diff_main(d,b,!0);2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b))}else if(a&&\"object\"==typeof a&&\"undefined\"==typeof b&&\"undefined\"==typeof c)b=a,d=this.diff_text1(b);else if(\"string\"==typeof a&&b&&\"object\"==typeof b&&\"undefined\"==typeof c)d=a;else if(\"string\"==typeof a&&\"string\"==typeof b&&c&&\"object\"==typeof c)d=a,b=c;else throw Error(\"Unknown call format to patch_make.\");\nif(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,l=0;l<b.length;l++){var k=b[l][0],m=b[l][1];e||k===DIFF_EQUAL||(a.start1=f,a.start2=g);switch(k){case DIFF_INSERT:a.diffs[e++]=b[l];a.length2+=m.length;d=d.substring(0,g)+m+d.substring(g);break;case DIFF_DELETE:a.length1+=m.length;a.diffs[e++]=b[l];d=d.substring(0,g)+d.substring(g+m.length);break;case DIFF_EQUAL:m.length<=2*this.Patch_Margin&&e&&b.length!=l+1?(a.diffs[e++]=b[l],a.length1+=m.length,a.length2+=m.length):\nm.length>=2*this.Patch_Margin&&e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}k!==DIFF_INSERT&&(f+=m.length);k!==DIFF_DELETE&&(g+=m.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};\ndiff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};\ndiff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),l=-1;if(h.length>this.Match_MaxBits){var k=this.match_main(b,h.substring(0,this.Match_MaxBits),g);-1!=k&&(l=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==l||k>=l)&&(k=-1)}else k=this.match_main(b,h,\ng);if(-1==k)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=k-g,g=-1==l?b.substring(k,k+h.length):b.substring(k,l+this.Match_MaxBits),h==g)b=b.substring(0,k)+this.diff_text2(a[f].diffs)+b.substring(k+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);h=0;var m;for(l=0;l<a[f].diffs.length;l++){var p=a[f].diffs[l];p[0]!==DIFF_EQUAL&&(m=this.diff_xIndex(g,h));p[0]===\nDIFF_INSERT?b=b.substring(0,k+m)+p[1]+b.substring(k+m):p[0]===DIFF_DELETE&&(b=b.substring(0,k+m)+b.substring(k+this.diff_xIndex(g,h+p[1].length)));p[0]!==DIFF_DELETE&&(h+=p[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};\ndiff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c=\"\",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;d=a[0];var e=d.diffs;if(0==e.length||e[0][0]!=DIFF_EQUAL)e.unshift([DIFF_EQUAL,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||e[e.length-\n1][0]!=DIFF_EQUAL?(e.push([DIFF_EQUAL,c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};\ndiff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g=\"\";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,l=!0;h.start1=e-g.length;h.start2=f-g.length;\"\"!==g&&(h.length1=h.length2=g.length,h.diffs.push([DIFF_EQUAL,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){g=d.diffs[0][0];var k=d.diffs[0][1];g===DIFF_INSERT?(h.length2+=k.length,f+=k.length,h.diffs.push(d.diffs.shift()),\nl=!1):g===DIFF_DELETE&&1==h.diffs.length&&h.diffs[0][0]==DIFF_EQUAL&&k.length>2*b?(h.length1+=k.length,e+=k.length,l=!1,h.diffs.push([g,k]),d.diffs.shift()):(k=k.substring(0,b-h.length1-this.Patch_Margin),h.length1+=k.length,e+=k.length,g===DIFF_EQUAL?(h.length2+=k.length,f+=k.length):l=!1,h.diffs.push([g,k]),k==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(k.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);k=this.diff_text1(d.diffs).substring(0,\nthis.Patch_Margin);\"\"!==k&&(h.length1+=k.length,h.length2+=k.length,0!==h.diffs.length&&h.diffs[h.diffs.length-1][0]===DIFF_EQUAL?h.diffs[h.diffs.length-1][1]+=k:h.diffs.push([DIFF_EQUAL,k]));l||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join(\"\")};\ndiff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split(\"\\n\");for(var c=0,d=/^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error(\"Invalid patch string: \"+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);\"\"===e[2]?(f.start1--,f.length1=1):\"0\"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);\"\"===e[4]?(f.start2--,f.length2=1):\"0\"==e[4]?f.length2=0:(f.start2--,f.length2=\nparseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error(\"Illegal escape in patch_fromText: \"+g);}if(\"-\"==e)f.diffs.push([DIFF_DELETE,g]);else if(\"+\"==e)f.diffs.push([DIFF_INSERT,g]);else if(\" \"==e)f.diffs.push([DIFF_EQUAL,g]);else if(\"@\"==e)break;else if(\"\"!==e)throw Error('Invalid patch mode \"'+e+'\" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};\ndiff_match_patch.patch_obj.prototype.toString=function(){for(var a=[\"@@ -\"+(0===this.length1?this.start1+\",0\":1==this.length1?this.start1+1:this.start1+1+\",\"+this.length1)+\" +\"+(0===this.length2?this.start2+\",0\":1==this.length2?this.start2+1:this.start2+1+\",\"+this.length2)+\" @@\\n\"],b,c=0;c<this.diffs.length;c++){switch(this.diffs[c][0]){case DIFF_INSERT:b=\"+\";break;case DIFF_DELETE:b=\"-\";break;case DIFF_EQUAL:b=\" \"}a[c+1]=b+encodeURI(this.diffs[c][1])+\"\\n\"}return a.join(\"\").replace(/%20/g,\" \")};\nthis.diff_match_patch=diff_match_patch;this.DIFF_DELETE=DIFF_DELETE;this.DIFF_INSERT=DIFF_INSERT;this.DIFF_EQUAL=DIFF_EQUAL;\n}).call(exports);",
            "type": "application/javascript",
            "title": "$:/core/modules/utils/diff-match-patch/diff_match_patch.js",
            "module-type": "library"
        },
        "$:/core/modules/utils/dom/animations/slide.js": {
            "title": "$:/core/modules/utils/dom/animations/slide.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/animations/slide.js\ntype: application/javascript\nmodule-type: animation\n\nA simple slide animation that varies the height of the element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction slideOpen(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration();\n\t// Get the current height of the domNode\n\tvar computedStyle = window.getComputedStyle(domNode),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\n\t\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"none\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{marginTop: currMarginTop + \"px\"},\n\t\t{paddingBottom: currPaddingBottom + \"px\"},\n\t\t{paddingTop: currPaddingTop + \"px\"},\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n}\n\nfunction slideClosed(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Clear the properties we've set when the animation is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n}\n\nexports.slide = {\n\topen: slideOpen,\n\tclose: slideClosed\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "animation"
        },
        "$:/core/modules/utils/dom/animator.js": {
            "title": "$:/core/modules/utils/dom/animator.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/animator.js\ntype: application/javascript\nmodule-type: utils\n\nOrchestrates animations and transitions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Animator() {\n\t// Get the registered animation modules\n\tthis.animations = {};\n\t$tw.modules.applyMethods(\"animation\",this.animations);\n}\n\nAnimator.prototype.perform = function(type,domNode,options) {\n\toptions = options || {};\n\t// Find an animation that can handle this type\n\tvar chosenAnimation;\n\t$tw.utils.each(this.animations,function(animation,name) {\n\t\tif($tw.utils.hop(animation,type)) {\n\t\t\tchosenAnimation = animation[type];\n\t\t}\n\t});\n\tif(!chosenAnimation) {\n\t\tchosenAnimation = function(domNode,options) {\n\t\t\tif(options.callback) {\n\t\t\t\toptions.callback();\n\t\t\t}\n\t\t};\n\t}\n\t// Call the animation\n\tchosenAnimation(domNode,options);\n};\n\nexports.Animator = Animator;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/browser.js": {
            "title": "$:/core/modules/utils/dom/browser.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/browser.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser feature detection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet style properties of an element\n\telement: dom node\n\tstyles: ordered array of {name: value} pairs\n*/\nexports.setStyle = function(element,styles) {\n\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\n\t\tfor(var t=0; t<styles.length; t++) {\n\t\t\tfor(var styleName in styles[t]) {\n\t\t\t\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\n\t\"background-color\" --> \"backgroundColor\"\n\t\"transition\" --> \"webkitTransition\"\n*/\n\nvar styleNameCache = {}; // We'll cache the style name conversions\n\nexports.convertStyleNameToPropertyName = function(styleName) {\n\t// Return from the cache if we can\n\tif(styleNameCache[styleName]) {\n\t\treturn styleNameCache[styleName];\n\t}\n\t// Convert it by first removing any hyphens\n\tvar propertyName = $tw.utils.unHyphenateCss(styleName);\n\t// Then check if it needs a prefix\n\tif($tw.browser && document.body.style[propertyName] === undefined) {\n\t\tvar prefixes = [\"O\",\"MS\",\"Moz\",\"webkit\"];\n\t\tfor(var t=0; t<prefixes.length; t++) {\n\t\t\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\n\t\t\tif(document.body.style[prefixedName] !== undefined) {\n\t\t\t\tpropertyName = prefixedName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// Put it in the cache too\n\tstyleNameCache[styleName] = propertyName;\n\treturn propertyName;\n};\n\n/*\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\n\t\"backgroundColor\" --> \"background-color\"\n\t\"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.convertPropertyNameToStyleName = function(propertyName) {\n\t// Rehyphenate the name\n\tvar styleName = $tw.utils.hyphenateCss(propertyName);\n\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\n\tif(styleName.indexOf(\"webkit\") === 0) {\n\t\tstyleName = \"-\" + styleName;\n\t} else if(styleName.indexOf(\"-m-s\") === 0) {\n\t\tstyleName = \"-ms\" + styleName.substr(4);\n\t}\n\treturn styleName;\n};\n\n/*\nRound trip a stylename to a property name and back again. For example:\n\t\"transform\" --> \"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.roundTripPropertyName = function(propertyName) {\n\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\n};\n\n/*\nConverts a standard event name into the local browser specific equivalent. For example:\n\t\"animationEnd\" --> \"webkitAnimationEnd\"\n*/\n\nvar eventNameCache = {}; // We'll cache the conversions\n\nvar eventNameMappings = {\n\t\"transitionEnd\": {\n\t\tcorrespondingCssProperty: \"transition\",\n\t\tmappings: {\n\t\t\ttransition: \"transitionend\",\n\t\t\tOTransition: \"oTransitionEnd\",\n\t\t\tMSTransition: \"msTransitionEnd\",\n\t\t\tMozTransition: \"transitionend\",\n\t\t\twebkitTransition: \"webkitTransitionEnd\"\n\t\t}\n\t},\n\t\"animationEnd\": {\n\t\tcorrespondingCssProperty: \"animation\",\n\t\tmappings: {\n\t\t\tanimation: \"animationend\",\n\t\t\tOAnimation: \"oAnimationEnd\",\n\t\t\tMSAnimation: \"msAnimationEnd\",\n\t\t\tMozAnimation: \"animationend\",\n\t\t\twebkitAnimation: \"webkitAnimationEnd\"\n\t\t}\n\t}\n};\n\nexports.convertEventName = function(eventName) {\n\tif(eventNameCache[eventName]) {\n\t\treturn eventNameCache[eventName];\n\t}\n\tvar newEventName = eventName,\n\t\tmappings = eventNameMappings[eventName];\n\tif(mappings) {\n\t\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\n\t\tif(mappings.mappings[convertedProperty]) {\n\t\t\tnewEventName = mappings.mappings[convertedProperty];\n\t\t}\n\t}\n\t// Put it in the cache too\n\teventNameCache[eventName] = newEventName;\n\treturn newEventName;\n};\n\n/*\nReturn the names of the fullscreen APIs\n*/\nexports.getFullScreenApis = function() {\n\tvar d = document,\n\t\tdb = d.body,\n\t\tresult = {\n\t\t\"_requestFullscreen\": db.webkitRequestFullscreen !== undefined ? \"webkitRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.mozRequestFullScreen !== undefined ? \"mozRequestFullScreen\" :\n\t\t\t\t\t\t\tdb.msRequestFullscreen !== undefined ? \"msRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.requestFullscreen !== undefined ? \"requestFullscreen\" : \"\",\n\t\t\"_exitFullscreen\": d.webkitExitFullscreen !== undefined ? \"webkitExitFullscreen\" :\n\t\t\t\t\t\t\td.mozCancelFullScreen !== undefined ? \"mozCancelFullScreen\" :\n\t\t\t\t\t\t\td.msExitFullscreen !== undefined ? \"msExitFullscreen\" :\n\t\t\t\t\t\t\td.exitFullscreen !== undefined ? \"exitFullscreen\" : \"\",\n\t\t\"_fullscreenElement\": d.webkitFullscreenElement !== undefined ? \"webkitFullscreenElement\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozFullScreenElement\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"msFullscreenElement\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenElement\" : \"\",\n\t\t\"_fullscreenChange\": d.webkitFullscreenElement !== undefined ? \"webkitfullscreenchange\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozfullscreenchange\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"MSFullscreenChange\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenchange\" : \"\"\n\t};\n\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement || !result._fullscreenChange) {\n\t\treturn null;\n\t} else {\n\t\treturn result;\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/csscolorparser.js": {
            "title": "$:/core/modules/utils/dom/csscolorparser.js",
            "text": "// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n  \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n  \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n  \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n  \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n  \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n  \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n  \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n  \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n  \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n  \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n  \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n  \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n  \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n  \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n  \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n  \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n  \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n  \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n  \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n  \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n  \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n  \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n  \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n  \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n  \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n  \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n  \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n  \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n  \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n  \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n  \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n  \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n  \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n  \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n  \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n  \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n  \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n  \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n  \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n  \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n  \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n  \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n  \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n  \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n  \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n  \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n  \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n  \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n  \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n  \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n  \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n  \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n  \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n  \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n  \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n  \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n  \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n  \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n  \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n  \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n  \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n  \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n  \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n  \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n  \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n  \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n  \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n  \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n  \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n  \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n  \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n  \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n  \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n  \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) {  // Clamp to integer 0 .. 255.\n  i = Math.round(i);  // Seems to be what Chrome does (vs truncation).\n  return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) {  // Clamp to float 0.0 .. 1.0.\n  return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) {  // int or percentage.\n  if (str[str.length - 1] === '%')\n    return clamp_css_byte(parseFloat(str) / 100 * 255);\n  return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) {  // float or percentage.\n  if (str[str.length - 1] === '%')\n    return clamp_css_float(parseFloat(str) / 100);\n  return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n  if (h < 0) h += 1;\n  else if (h > 1) h -= 1;\n\n  if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n  if (h * 2 < 1) return m2;\n  if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n  return m1;\n}\n\nfunction parseCSSColor(css_str) {\n  // Remove all whitespace, not compliant, but should just be more accepting.\n  var str = css_str.replace(/ /g, '').toLowerCase();\n\n  // Color keywords (and transparent) lookup.\n  if (str in kCSSColorTable) return kCSSColorTable[str].slice();  // dup.\n\n  // #abc and #abc123 syntax.\n  if (str[0] === '#') {\n    if (str.length === 4) {\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n      if (!(iv >= 0 && iv <= 0xfff)) return null;  // Covers NaN.\n      return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n              (iv & 0xf0) | ((iv & 0xf0) >> 4),\n              (iv & 0xf) | ((iv & 0xf) << 4),\n              1];\n    } else if (str.length === 7) {\n      var iv = parseInt(str.substr(1), 16);  // TODO(deanm): Stricter parsing.\n      if (!(iv >= 0 && iv <= 0xffffff)) return null;  // Covers NaN.\n      return [(iv & 0xff0000) >> 16,\n              (iv & 0xff00) >> 8,\n              iv & 0xff,\n              1];\n    }\n\n    return null;\n  }\n\n  var op = str.indexOf('('), ep = str.indexOf(')');\n  if (op !== -1 && ep + 1 === str.length) {\n    var fname = str.substr(0, op);\n    var params = str.substr(op+1, ep-(op+1)).split(',');\n    var alpha = 1;  // To allow case fallthrough.\n    switch (fname) {\n      case 'rgba':\n        if (params.length !== 4) return null;\n        alpha = parse_css_float(params.pop());\n        // Fall through.\n      case 'rgb':\n        if (params.length !== 3) return null;\n        return [parse_css_int(params[0]),\n                parse_css_int(params[1]),\n                parse_css_int(params[2]),\n                alpha];\n      case 'hsla':\n        if (params.length !== 4) return null;\n        alpha = parse_css_float(params.pop());\n        // Fall through.\n      case 'hsl':\n        if (params.length !== 3) return null;\n        var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360;  // 0 .. 1\n        // NOTE(deanm): According to the CSS spec s/l should only be\n        // percentages, but we don't bother and let float or percentage.\n        var s = parse_css_float(params[1]);\n        var l = parse_css_float(params[2]);\n        var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n        var m1 = l * 2 - m2;\n        return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n                clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n                alpha];\n      default:\n        return null;\n    }\n  }\n\n  return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom.js": {
            "title": "$:/core/modules/utils/dom.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static DOM-related utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDetermines whether element 'a' contains element 'b'\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\n*/\nexports.domContains = function(a,b) {\n\treturn a.contains ?\n\t\ta !== b && a.contains(b) :\n\t\t!!(a.compareDocumentPosition(b) & 16);\n};\n\nexports.removeChildren = function(node) {\n\twhile(node.hasChildNodes()) {\n\t\tnode.removeChild(node.firstChild);\n\t}\n};\n\nexports.hasClass = function(el,className) {\n\treturn el && el.hasAttribute && el.hasAttribute(\"class\") && el.getAttribute(\"class\").split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t\tel.setAttribute(\"class\",c.join(\" \"));\n\t}\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.setAttribute(\"class\",c.join(\" \"));\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the first parent element that has scrollbars or use the body as fallback.\n*/\nexports.getScrollContainer = function(el) {\n\tvar doc = el.ownerDocument;\n\twhile(el.parentNode) {\t\n\t\tel = el.parentNode;\n\t\tif(el.scrollTop) {\n\t\t\treturn el;\n\t\t}\n\t}\n\treturn doc.body;\n};\n\n/*\nGet the scroll position of the viewport\nReturns:\n\t{\n\t\tx: horizontal scroll position in pixels,\n\t\ty: vertical scroll position in pixels\n\t}\n*/\nexports.getScrollPosition = function(srcWindow) {\n\tvar scrollWindow = srcWindow || window;\n\tif(\"scrollX\" in scrollWindow) {\n\t\treturn {x: scrollWindow.scrollX, y: scrollWindow.scrollY};\n\t} else {\n\t\treturn {x: scrollWindow.document.documentElement.scrollLeft, y: scrollWindow.document.documentElement.scrollTop};\n\t}\n};\n\n/*\nAdjust the height of a textarea to fit its content, preserving scroll position, and return the height\n*/\nexports.resizeTextAreaToFit = function(domNode,minHeight) {\n\t// Get the scroll container and register the current scroll position\n\tvar container = $tw.utils.getScrollContainer(domNode),\n\t\tscrollTop = container.scrollTop;\n    // Measure the specified minimum height\n\tdomNode.style.height = minHeight;\n\tvar measuredHeight = domNode.offsetHeight || parseInt(minHeight,10);\n\t// Set its height to auto so that it snaps to the correct height\n\tdomNode.style.height = \"auto\";\n\t// Calculate the revised height\n\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,measuredHeight);\n\t// Only try to change the height if it has changed\n\tif(newHeight !== domNode.offsetHeight) {\n\t\tdomNode.style.height = newHeight + \"px\";\n\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t$tw.utils.forceLayout(domNode);\n\t\t// Set the container to the position we registered at the beginning\n\t\tcontainer.scrollTop = scrollTop;\n\t}\n\treturn newHeight;\n};\n\n/*\nGets the bounding rectangle of an element in absolute page coordinates\n*/\nexports.getBoundingPageRect = function(element) {\n\tvar scrollPos = $tw.utils.getScrollPosition(element.ownerDocument.defaultView),\n\t\tclientRect = element.getBoundingClientRect();\n\treturn {\n\t\tleft: clientRect.left + scrollPos.x,\n\t\twidth: clientRect.width,\n\t\tright: clientRect.right + scrollPos.x,\n\t\ttop: clientRect.top + scrollPos.y,\n\t\theight: clientRect.height,\n\t\tbottom: clientRect.bottom + scrollPos.y\n\t};\n};\n\n/*\nSaves a named password in the browser\n*/\nexports.savePassword = function(name,password) {\n\tvar done = false;\n\ttry {\n\t\twindow.localStorage.setItem(\"tw5-password-\" + name,password);\n\t\tdone = true;\n\t} catch(e) {\n\t}\n\tif(!done) {\n\t\t$tw.savedPasswords = $tw.savedPasswords || Object.create(null);\n\t\t$tw.savedPasswords[name] = password;\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\tvar value;\n\ttry {\n\t\tvalue = window.localStorage.getItem(\"tw5-password-\" + name);\n\t} catch(e) {\n\t}\n\tif(value !== undefined) {\n\t\treturn value;\n\t} else {\n\t\treturn ($tw.savedPasswords || Object.create(null))[name] || \"\";\n\t}\n};\n\n/*\nForce layout of a dom node and its descendents\n*/\nexports.forceLayout = function(element) {\n\tvar dummy = element.offsetWidth;\n};\n\n/*\nPulse an element for debugging purposes\n*/\nexports.pulseElement = function(element) {\n\t// Event handler to remove the class at the end\n\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\n\t\telement.removeEventListener($tw.browser.animationEnd,handler,false);\n\t\t$tw.utils.removeClass(element,\"pulse\");\n\t},false);\n\t// Apply the pulse class\n\t$tw.utils.removeClass(element,\"pulse\");\n\t$tw.utils.forceLayout(element);\n\t$tw.utils.addClass(element,\"pulse\");\n};\n\n/*\nAttach specified event handlers to a DOM node\ndomNode: where to attach the event handlers\nevents: array of event handlers to be added (see below)\nEach entry in the events array is an object with these properties:\nhandlerFunction: optional event handler function\nhandlerObject: optional event handler object\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\n*/\nexports.addEventListeners = function(domNode,events) {\n\t$tw.utils.each(events,function(eventInfo) {\n\t\tvar handler;\n\t\tif(eventInfo.handlerFunction) {\n\t\t\thandler = eventInfo.handlerFunction;\n\t\t} else if(eventInfo.handlerObject) {\n\t\t\tif(eventInfo.handlerMethod) {\n\t\t\t\thandler = function(event) {\n\t\t\t\t\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\n\t\t\t\t};\t\n\t\t\t} else {\n\t\t\t\thandler = eventInfo.handlerObject;\n\t\t\t}\n\t\t}\n\t\tdomNode.addEventListener(eventInfo.name,handler,false);\n\t});\n};\n\n/*\nGet the computed styles applied to an element as an array of strings of individual CSS properties\n*/\nexports.getComputedStyles = function(domNode) {\n\tvar textAreaStyles = window.getComputedStyle(domNode,null),\n\t\tstyleDefs = [],\n\t\tname;\n\tfor(var t=0; t<textAreaStyles.length; t++) {\n\t\tname = textAreaStyles[t];\n\t\tstyleDefs.push(name + \": \" + textAreaStyles.getPropertyValue(name) + \";\");\n\t}\n\treturn styleDefs;\n};\n\n/*\nApply a set of styles passed as an array of strings of individual CSS properties\n*/\nexports.setStyles = function(domNode,styleDefs) {\n\tdomNode.style.cssText = styleDefs.join(\"\");\n};\n\n/*\nCopy the computed styles from a source element to a destination element\n*/\nexports.copyStyles = function(srcDomNode,dstDomNode) {\n\t$tw.utils.setStyles(dstDomNode,$tw.utils.getComputedStyles(srcDomNode));\n};\n\n/*\nCopy plain text to the clipboard on browsers that support it\n*/\nexports.copyToClipboard = function(text,options) {\n\toptions = options || {};\n\tvar textArea = document.createElement(\"textarea\");\n\ttextArea.style.position = \"fixed\";\n\ttextArea.style.top = 0;\n\ttextArea.style.left = 0;\n\ttextArea.style.fontSize = \"12pt\";\n\ttextArea.style.width = \"2em\";\n\ttextArea.style.height = \"2em\";\n\ttextArea.style.padding = 0;\n\ttextArea.style.border = \"none\";\n\ttextArea.style.outline = \"none\";\n\ttextArea.style.boxShadow = \"none\";\n\ttextArea.style.background = \"transparent\";\n\ttextArea.value = text;\n\tdocument.body.appendChild(textArea);\n\ttextArea.select();\n\ttextArea.setSelectionRange(0,text.length);\n\tvar succeeded = false;\n\ttry {\n\t\tsucceeded = document.execCommand(\"copy\");\n\t} catch (err) {\n\t}\n\tif(!options.doNotNotify) {\n\t\t$tw.notifier.display(succeeded ? \"$:/language/Notifications/CopiedToClipboard/Succeeded\" : \"$:/language/Notifications/CopiedToClipboard/Failed\");\n\t}\n\tdocument.body.removeChild(textArea);\n};\n\nexports.getLocationPath = function() {\n\treturn window.location.toString().split(\"#\")[0];\n};\n\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/dragndrop.js": {
            "title": "$:/core/modules/utils/dom/dragndrop.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/dragndrop.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser data transfer utilities, used with the clipboard and drag and drop\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOptions:\n\ndomNode: dom node to make draggable\ndragImageType: \"pill\" or \"dom\"\ndragTiddlerFn: optional function to retrieve the title of tiddler to drag\ndragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag\nwidget: widget to use as the contect for the filter\n*/\nexports.makeDraggable = function(options) {\n\tvar dragImageType = options.dragImageType || \"dom\",\n\t\tdragImage,\n\t\tdomNode = options.domNode;\n\t// Make the dom node draggable (not necessary for anchor tags)\n\tif((domNode.tagName || \"\").toLowerCase() !== \"a\") {\n\t\tdomNode.setAttribute(\"draggable\",\"true\");\t\t\n\t}\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragstart\", handlerFunction: function(event) {\n\t\t\tif(event.dataTransfer === undefined) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Collect the tiddlers being dragged\n\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t    \tstartActions = options.startActions;\n\t\t\tif(dragFilter) {\n\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t}\n\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t// Check that we've something to drag\n\t\t\tif(titles.length > 0 && event.target === domNode) {\n\t\t\t\t// Mark the drag in progress\n\t\t\t\t$tw.dragInProgress = domNode;\n\t\t\t\t// Set the dragging class on the element being dragged\n\t\t\t\t$tw.utils.addClass(event.target,\"tc-dragging\");\n\t\t\t\t// Invoke drag-start actions if given\n\t\t\t\tif(startActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(startActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Create the drag image elements\n\t\t\t\tdragImage = options.widget.document.createElement(\"div\");\n\t\t\t\tdragImage.className = \"tc-tiddler-dragger\";\n\t\t\t\tvar inner = options.widget.document.createElement(\"div\");\n\t\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\t\tinner.appendChild(options.widget.document.createTextNode(\n\t\t\t\t\ttitles.length === 1 ? \n\t\t\t\t\t\ttitles[0] :\n\t\t\t\t\t\ttitles.length + \" tiddlers\"\n\t\t\t\t));\n\t\t\t\tdragImage.appendChild(inner);\n\t\t\t\toptions.widget.document.body.appendChild(dragImage);\n\t\t\t\t// Set the data transfer properties\n\t\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t\t// Set up the image\n\t\t\t\tdataTransfer.effectAllowed = \"all\";\n\t\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\t\tif(dragImageType === \"pill\") {\n\t\t\t\t\t\tdataTransfer.setDragImage(dragImage.firstChild,-16,-16);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar r = domNode.getBoundingClientRect();\n\t\t\t\t\t\tdataTransfer.setDragImage(domNode,event.clientX-r.left,event.clientY-r.top);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Set up the data transfer\n\t\t\t\tif(dataTransfer.clearData) {\n\t\t\t\t\tdataTransfer.clearData();\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tvar jsonData = [];\n\t\t\t\tif(titles.length > 1) {\n\t\t\t\t\ttitles.forEach(function(title) {\n\t\t\t\t\t\tjsonData.push(options.widget.wiki.getTiddlerAsJson(title));\n\t\t\t\t\t});\n\t\t\t\t\tjsonData = \"[\" + jsonData.join(\",\") + \"]\";\n\t\t\t\t} else {\n\t\t\t\t\tjsonData = options.widget.wiki.getTiddlerAsJson(titles[0]);\n\t\t\t\t}\n\t\t\t\t// IE doesn't like these content types\n\t\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\t\tdataTransfer.setData(\"text/plain\",titleString);\n\t\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\t}\n\t\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\tdataTransfer.setData(\"Text\",titleString);\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn false;\n\t\t}},\n\t\t{name: \"dragend\", handlerFunction: function(event) {\n\t\t\tif(event.target === domNode) {\n\t\t\t\t// Collect the tiddlers being dragged\n\t\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t    \t\tendActions = options.endActions;\n\t\t\t\tif(dragFilter) {\n\t\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t\t}\n\t\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t\t$tw.dragInProgress = null;\n\t\t\t\t// Invoke drag-end actions if given\n\t\t\t\tif(endActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(endActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Remove the dragging class on the element being dragged\n\t\t\t\t$tw.utils.removeClass(event.target,\"tc-dragging\");\n\t\t\t\t// Delete the drag image element\n\t\t\t\tif(dragImage) {\n\t\t\t\t\tdragImage.parentNode.removeChild(dragImage);\n\t\t\t\t\tdragImage = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}}\n\t]);\n};\n\nexports.importDataTransfer = function(dataTransfer,fallbackTitle,callback) {\n\t// Try each provided data type in turn\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Available data types:\");\n\t\tfor(var type=0; type<dataTransfer.types.length; type++) {\n\t\t\tconsole.log(\"type\",dataTransfer.types[type],dataTransfer.getData(dataTransfer.types[type]))\n\t\t}\n\t}\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = importDataTypes[t];\n\t\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);\n\t\t\t\tcallback(tiddlerFields);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn parseJSONTiddlers(data,fallbackTitle);\n\t}},\n\t{type: \"URL\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/plain\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"Text\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}}\n];\n\nfunction parseJSONTiddlers(json,fallbackTitle) {\n\tvar data = JSON.parse(json);\n\tif(!$tw.utils.isArray(data)) {\n\t\tdata = [data];\n\t}\n\tdata.forEach(function(fields) {\n\t\tfields.title = fields.title || fallbackTitle;\n\t});\n\treturn data;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/http.js": {
            "title": "$:/core/modules/utils/dom/http.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/http.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser HTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nA quick and dirty HTTP function; to be refactored later. Options are:\n\turl: URL to retrieve\n\theaders: hashmap of headers to send\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data,xhr)\n\treturnProp: string name of the property to return as first argument of callback\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\turl = options.url,\n\t\theaders = options.headers || {accept: \"application/json\"},\n\t\thasHeader = function(targetHeader) {\n\t\t\ttargetHeader = targetHeader.toLowerCase();\n\t\t\tvar result = false;\n\t\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\t\tif(headerTitle.toLowerCase() === targetHeader) {\n\t\t\t\t\tresult = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\treturnProp = options.returnProp || \"responseText\",\n\t\trequest = new XMLHttpRequest(),\n\t\tdata = \"\",\n\t\tf,results;\n\t// Massage the data hashmap into a string\n\tif(options.data) {\n\t\tif(typeof options.data === \"string\") { // Already a string\n\t\t\tdata = options.data;\n\t\t} else { // A hashmap of strings\n\t\t\tresults = [];\n\t\t\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\n\t\t\t\tresults.push(dataItemTitle + \"=\" + encodeURIComponent(dataItem));\n\t\t\t});\n\t\t\tif(type === \"GET\" || type === \"HEAD\") {\n\t\t\t\turl += \"?\" + results.join(\"&\");\n\t\t\t} else {\n\t\t\t\tdata = results.join(\"&\");\n\t\t\t}\n\t\t}\n\t}\n\t// Set up the state change handler\n\trequest.onreadystatechange = function() {\n\t\tif(this.readyState === 4) {\n\t\t\tif(this.status === 200 || this.status === 201 || this.status === 204) {\n\t\t\t\t// Success!\n\t\t\t\toptions.callback(null,this[returnProp],this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback($tw.language.getString(\"Error/XMLHttpRequest\") + \": \" + this.status,null,this);\n\t\t}\n\t};\n\t// Make the request\n\trequest.open(type,url,true);\n\tif(headers) {\n\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\trequest.setRequestHeader(headerTitle,header);\n\t\t});\n\t}\n\tif(data && !hasHeader(\"Content-Type\")) {\n\t\trequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\tif(!hasHeader(\"X-Requested-With\")) {\n\t\trequest.setRequestHeader(\"X-Requested-With\",\"TiddlyWiki\");\n\t}\n\ttry {\n\t\trequest.send(data);\n\t} catch(e) {\n\t\toptions.callback(e,null,this);\n\t}\n\treturn request;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/keyboard.js": {
            "title": "$:/core/modules/utils/dom/keyboard.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities; now deprecated. Instead, use $tw.keyboardManager\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n[\"parseKeyDescriptor\",\"checkKeyDescriptor\"].forEach(function(method) {\n\texports[method] = function() {\n\t\tif($tw.keyboardManager) {\n\t\t\treturn $tw.keyboardManager[method].apply($tw.keyboardManager,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t};\n});\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/modal.js": {
            "title": "$:/core/modules/utils/dom/modal.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/modal.js\ntype: application/javascript\nmodule-type: utils\n\nModal message mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\nvar navigator = require(\"$:/core/modules/widgets/navigator.js\");\n\nvar Modal = function(wiki) {\n\tthis.wiki = wiki;\n\tthis.modalCount = 0;\n};\n\n/*\nDisplay a modal dialogue\n\ttitle: Title of tiddler to display\n\toptions: see below\nOptions include:\n\tdownloadLink: Text of a big download link to include\n*/\nModal.prototype.display = function(title,options) {\n\toptions = options || {};\n\tthis.srcDocument = options.variables && (options.variables.rootwindow === \"true\" ||\n\t\t\t\toptions.variables.rootwindow === \"yes\") ? document :\n\t\t\t\t(options.event.event && options.event.event.target ? options.event.event.target.ownerDocument : document);\n\tthis.srcWindow = this.srcDocument.defaultView;\n\tvar self = this,\n\t\trefreshHandler,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\ttiddler = this.wiki.getTiddler(title);\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Create the variables\n\tvar variables = $tw.utils.extend({\n\t\t\tcurrentTiddler: title,\n\t\t\t\"tv-story-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-story-list\") : \"\"),\n\t\t\t\"tv-history-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-history-list\") : \"\")\n\t\t},options.variables);\n\n\t// Create the wrapper divs\n\tvar wrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalBackdrop = this.srcDocument.createElement(\"div\"),\n\t\tmodalWrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalHeader = this.srcDocument.createElement(\"div\"),\n\t\theaderTitle = this.srcDocument.createElement(\"h3\"),\n\t\tmodalBody = this.srcDocument.createElement(\"div\"),\n\t\tmodalLink = this.srcDocument.createElement(\"a\"),\n\t\tmodalFooter = this.srcDocument.createElement(\"div\"),\n\t\tmodalFooterHelp = this.srcDocument.createElement(\"span\"),\n\t\tmodalFooterButtons = this.srcDocument.createElement(\"span\");\n\t// Up the modal count and adjust the body class\n\tthis.modalCount++;\n\tthis.adjustPageClass();\n\t// Add classes\n\t$tw.utils.addClass(wrapper,\"tc-modal-wrapper\");\n\tif(tiddler.fields && tiddler.fields.class) {\n\t\t$tw.utils.addClass(wrapper,tiddler.fields.class);\n\t}\n\t$tw.utils.addClass(modalBackdrop,\"tc-modal-backdrop\");\n\t$tw.utils.addClass(modalWrapper,\"tc-modal\");\n\t$tw.utils.addClass(modalHeader,\"tc-modal-header\");\n\t$tw.utils.addClass(modalBody,\"tc-modal-body\");\n\t$tw.utils.addClass(modalFooter,\"tc-modal-footer\");\n\t// Join them together\n\twrapper.appendChild(modalBackdrop);\n\twrapper.appendChild(modalWrapper);\n\tmodalHeader.appendChild(headerTitle);\n\tmodalWrapper.appendChild(modalHeader);\n\tmodalWrapper.appendChild(modalBody);\n\tmodalFooter.appendChild(modalFooterHelp);\n\tmodalFooter.appendChild(modalFooterButtons);\n\tmodalWrapper.appendChild(modalFooter);\n\tvar navigatorTree = {\n\t\t\"type\": \"navigator\",\n\t\t\"attributes\": {\n\t\t\t\"story\": {\n\t\t\t\t\"name\": \"story\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-story-list\"]\n\t\t\t},\n\t\t\t\"history\": {\n\t\t\t\t\"name\": \"history\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-history-list\"]\n\t\t\t}\n\t\t},\n\t\t\"tag\": \"$navigator\",\n\t\t\"isBlock\": true,\n\t\t\"children\": []\n\t};\n\tvar navigatorWidgetNode = new navigator.navigator(navigatorTree, {\n\t\twiki: this.wiki,\n\t\tdocument : this.srcDocument,\n\t\tparentWidget: $tw.rootWidget\n\t});\n\tnavigatorWidgetNode.render(modalBody,null);\n\t\n\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\theaderWidgetNode.render(headerTitle,null);\n\t// Render the body of the message\n\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\n\tbodyWidgetNode.render(modalBody,null);\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(this.srcDocument.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler.fields && tiddler.fields.help) {\n\t\tvar link = this.srcDocument.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.setAttribute(\"rel\",\"noopener noreferrer\");\n\t\tlink.appendChild(this.srcDocument.createTextNode(\"Help\"));\n\t\tmodalFooterHelp.appendChild(link);\n\t\tmodalFooterHelp.style.float = \"left\";\n\t}\n\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"footer\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"button\",\n\t\t\tattributes: {\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tm-close-tiddler\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttext: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: $tw.language.getString(\"Buttons/Close/Caption\")\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tfooterWidgetNode.render(modalFooterButtons,null);\n\t// Set up the refresh handler\n\trefreshHandler = function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Remove our refresh handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Decrease the modal count and adjust the body class\n\t\tself.modalCount--;\n\t\tself.adjustPageClass();\n\t\t// Force layout and animate the modal message away\n\t\t$tw.utils.forceLayout(modalBackdrop);\n\t\t$tw.utils.forceLayout(modalWrapper);\n\t\t$tw.utils.setStyle(modalBackdrop,[\n\t\t\t{opacity: \"0\"}\n\t\t]);\n\t\t$tw.utils.setStyle(modalWrapper,[\n\t\t\t{transform: \"translateY(\" + self.srcWindow.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\tself.srcWindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tself.srcDocument.body.removeChild(wrapper);\n\t\t\t}\n\t\t},duration);\n\t\t// Don't let anyone else handle the tm-close-tiddler message\n\t\treturn false;\n\t};\n\theaderWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tbodyWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tfooterWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\t// Set the initial styles for the message\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-this.srcWindow.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tthis.srcDocument.body.appendChild(wrapper);\n\t// Set up animation for the styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{transition: \"opacity \" + duration + \"ms ease-out\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(modalBackdrop);\n\t$tw.utils.forceLayout(modalWrapper);\n\t// Set final animated styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0.7\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n};\n\nModal.prototype.adjustPageClass = function() {\n\tvar windowContainer = $tw.pageContainer ? ($tw.pageContainer === this.srcDocument.body.firstChild ? $tw.pageContainer : this.srcDocument.body.firstChild) : null;\n\tif(windowContainer) {\n\t\t$tw.utils.toggleClass(windowContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n};\n\nexports.Modal = Modal;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/notifier.js": {
            "title": "$:/core/modules/utils/dom/notifier.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/notifier.js\ntype: application/javascript\nmodule-type: utils\n\nNotifier mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Notifier = function(wiki) {\n\tthis.wiki = wiki;\n};\n\n/*\nDisplay a notification\n\ttitle: Title of tiddler containing the notification text\n\toptions: see below\nOptions include:\n*/\nNotifier.prototype.display = function(title,options) {\n\toptions = options || {};\n\t// Create the wrapper divs\n\tvar self = this,\n\t\tnotification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\trefreshHandler;\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Add classes\n\t$tw.utils.addClass(notification,\"tc-notification\");\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables,\n\t\timportPageMacros: true});\n\twidgetNode.render(notification,null);\n\trefreshHandler = function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Set the initial styles for the notification\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"0\"},\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"},\n\t\t{transition: \"opacity \" + duration + \"ms ease-out, \" + $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Add the notification to the DOM\n\tdocument.body.appendChild(notification);\n\t// Force layout\n\t$tw.utils.forceLayout(notification);\n\t// Set final animated styles\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n\t// Set a timer to remove the notification\n\twindow.setTimeout(function() {\n\t\t// Remove our change event handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Force layout and animate the notification away\n\t\t$tw.utils.forceLayout(notification);\n\t\t$tw.utils.setStyle(notification,[\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transform: \"translateX(\" + (notification.offsetWidth) + \"px)\"}\n\t\t]);\n\t\t// Remove the modal message from the DOM once the transition ends\n\t\tsetTimeout(function() {\n\t\t\tif(notification.parentNode) {\n\t\t\t\tdocument.body.removeChild(notification);\n\t\t\t}\n\t\t},duration);\n\t},$tw.config.preferences.notificationDuration);\n};\n\nexports.Notifier = Notifier;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/popup.js": {
            "title": "$:/core/modules/utils/dom/popup.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n};\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned (one of domNode or domNodeRect is required)\n\tdomNodeRect: rectangle to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n\tfloating: if true, skips registering the popup, meaning that it will need manually clearing\n*/\nPopup.prototype.triggerPopup = function(options) {\n\t// Check if this popup is already active\n\tvar index = this.findPopup(options.title);\n\t// Compute the new state\n\tvar state = index === -1;\n\tif(options.force !== undefined) {\n\t\tstate = options.force;\n\t}\n\t// Show or cancel the popup according to the new state\n\tif(state) {\n\t\tthis.show(options);\n\t} else {\n\t\tthis.cancel(index);\n\t}\n};\n\nPopup.prototype.findPopup = function(title) {\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\treturn index;\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar info = this.popupInfo(event.target),\n\t\t\tcancelLevel = info.popupLevel - 1;\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(info.isHandle) {\n\t\t\tcancelLevel++;\n\t\t}\n\t\t// Cancel\n\t\tthis.cancel(cancelLevel);\n\t}\n};\n\n/*\nFind the popup level containing a DOM node. Returns:\npopupLevel: count of the number of nested popups containing the specified element\nisHandle: true if the specified element is within a popup handle\n*/\nPopup.prototype.popupInfo = function(domNode) {\n\tvar isHandle = false,\n\t\tpopupCount = 0,\n\t\tnode = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\tisHandle = true;\n\t\t\tpopupCount++;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\tisHandle = true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\tpopupCount++;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tvar info = {\n\t\tpopupLevel: popupCount,\n\t\tisHandle: isHandle\n\t};\n\treturn info;\n};\n\n/*\nDisplay a popup by adding it to the stack\n*/\nPopup.prototype.show = function(options) {\n\t// Find out what was clicked on\n\tvar info = this.popupInfo(options.domNode);\n\t// Cancel any higher level popups\n\tthis.cancel(info.popupLevel);\n\n\t// Store the popup details if not already there\n\tif(!options.floating && this.findPopup(options.title) === -1) {\n\t\tthis.popups.push({\n\t\t\ttitle: options.title,\n\t\t\twiki: options.wiki,\n\t\t\tdomNode: options.domNode,\n\t\t\tnoStateReference: options.noStateReference\n\t\t});\n\t}\n\t// Set the state tiddler\n\tvar rect;\n\tif(options.domNodeRect) {\n\t\trect = options.domNodeRect;\n\t} else {\n\t\trect = {\n\t\t\tleft: options.domNode.offsetLeft,\n\t\t\ttop: options.domNode.offsetTop,\n\t\t\twidth: options.domNode.offsetWidth,\n\t\t\theight: options.domNode.offsetHeight\n\t\t};\n\t}\n\tvar popupRect = \"(\" + rect.left + \",\" + rect.top + \",\" + \n\t\t\t\trect.width + \",\" + rect.height + \")\";\n\tif(options.noStateReference) {\n\t\toptions.wiki.setText(options.title,\"text\",undefined,popupRect);\n\t} else {\n\t\toptions.wiki.setTextReference(options.title,popupRect);\n\t}\n\t// Add the click handler if we have any popups\n\tif(this.popups.length > 0) {\n\t\tthis.rootElement.addEventListener(\"click\",this,true);\t\t\n\t}\n};\n\n/*\nCancel all popups at or above a specified level or DOM node\nlevel: popup level to cancel (0 cancels all popups)\n*/\nPopup.prototype.cancel = function(level) {\n\tvar numPopups = this.popups.length;\n\tlevel = Math.max(0,Math.min(level,numPopups));\n\tfor(var t=level; t<numPopups; t++) {\n\t\tvar popup = this.popups.pop();\n\t\tif(popup.title) {\n\t\t\tif(popup.noStateReference) {\n\t\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t\t} else {\n\t\t\t\tpopup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title);\n        \t\t}\n\t\t}\n\t}\n\tif(this.popups.length === 0) {\n\t\tthis.rootElement.removeEventListener(\"click\",this,false);\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup\n*/\nPopup.prototype.readPopupState = function(text) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/;\n\treturn popupLocationRegExp.test(text);\n};\n\nexports.Popup = Popup;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/dom/scroller.js": {
            "title": "$:/core/modules/utils/dom/scroller.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/dom/scroller.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nEvent handler for when the `tm-scroll` event hits the document body\n*/\nvar PageScroller = function() {\n\tthis.idRequestFrame = null;\n\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\tfunction(callback) {\n\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t};\n\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\twindow.webkitCancelAnimationFrame ||\n\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\tfunction(id) {\n\t\t\twindow.clearTimeout(id);\n\t\t};\n};\n\nPageScroller.prototype.isScrolling = function() {\n\treturn this.idRequestFrame !== null;\n}\n\nPageScroller.prototype.cancelScroll = function(srcWindow) {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(srcWindow,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle an event\n*/\nPageScroller.prototype.handleEvent = function(event) {\n\tif(event.type === \"tm-scroll\") {\n\t\tif(event.paramObject && event.paramObject.selector) {\n\t\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector);\n\t\t} else {\n\t\t\tthis.scrollIntoView(event.target);\t\t\t\n\t\t}\n\t\treturn false; // Event was handled\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element,callback) {\n\tvar self = this,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t    srcWindow = element ? element.ownerDocument.defaultView : window;\n\t// Now get ready to scroll the body\n\tthis.cancelScroll(srcWindow);\n\tthis.startTime = Date.now();\n\t// Get the height of any position:fixed toolbars\n\tvar toolbar = srcWindow.document.querySelector(\".tc-adjust-top-of-scroll\"),\n\t\toffset = 0;\n\tif(toolbar) {\n\t\toffset = toolbar.offsetHeight;\n\t}\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar getBounds = function() {\n\t\t\tvar clientBounds = typeof callback === 'function' ? callback() : element.getBoundingClientRect(),\n\t\t\t\tscrollPosition = $tw.utils.getScrollPosition(srcWindow);\n\t\t\treturn {\n\t\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\t\ttop: clientBounds.top + scrollPosition.y - offset,\n\t\t\t\twidth: clientBounds.width,\n\t\t\t\theight: clientBounds.height\n\t\t\t};\n\t\t},\n\t\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\t\t// targetPos/targetSize - position and size of the target element\n\t\t// currentPos/currentSize - position and size of the current scroll viewport\n\t\t// returns: new position of the scroll viewport\n\t\tgetEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\tvar newPos = targetPos;\n\t\t\t// If we are scrolling within 50 pixels of the top/left then snap to zero\n\t\t\tif(newPos < 50) {\n\t\t\t\tnewPos = 0;\n\t\t\t}\n\t\t\treturn newPos;\n\t\t},\n\t\tdrawFrame = function drawFrame() {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll(srcWindow);\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tvar scrollPosition = $tw.utils.getScrollPosition(srcWindow),\n\t\t\t\tbounds = getBounds(),\n\t\t\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,srcWindow.innerWidth),\n\t\t\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,srcWindow.innerHeight);\n\t\t\tsrcWindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\tdrawFrame();\n};\n\nPageScroller.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) {\n\tbaseElement = baseElement || document.body;\n\tvar element = baseElement.querySelector(selector);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback);\t\t\n\t}\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/edition-info.js": {
            "title": "$:/core/modules/utils/edition-info.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/edition-info.js\ntype: application/javascript\nmodule-type: utils-node\n\nInformation about the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\nvar editionInfo;\n\nexports.getEditionInfo = function() {\n\tif(!editionInfo) {\n\t\t// Enumerate the edition paths\n\t\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\n\t\teditionInfo = {};\n\t\tfor(var editionIndex=0; editionIndex<editionPaths.length; editionIndex++) {\n\t\t\tvar editionPath = editionPaths[editionIndex];\n\t\t\t// Enumerate the folders\n\t\t\tvar entries = fs.readdirSync(editionPath);\n\t\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\t\tvar entry = entries[entryIndex];\n\t\t\t\t// Check if directories have a valid tiddlywiki.info\n\t\t\t\tif(!editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\t\tvar info;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinfo = JSON.parse(fs.readFileSync(path.resolve(editionPath,entry,\"tiddlywiki.info\"),\"utf8\"));\n\t\t\t\t\t} catch(ex) {\n\t\t\t\t\t}\n\t\t\t\t\tif(info) {\n\t\t\t\t\t\teditionInfo[entry] = info;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn editionInfo;\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils-node"
        },
        "$:/core/modules/utils/fakedom.js": {
            "title": "$:/core/modules/utils/fakedom.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/fakedom.js\ntype: application/javascript\nmodule-type: global\n\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Sequence number used to enable us to track objects for testing\nvar sequenceNumber = null;\n\nvar bumpSequenceNumber = function(object) {\n\tif(sequenceNumber !== null) {\n\t\tobject.sequenceNumber = sequenceNumber++;\n\t}\n};\n\nvar TW_Node = function (){\n\tthrow TypeError(\"Illegal constructor\");\n};\n\nObject.defineProperty(TW_Node.prototype, 'ELEMENT_NODE', {\n\tget: function() {\n\t\treturn 1;\n\t}\n});\n\nObject.defineProperty(TW_Node.prototype, 'TEXT_NODE', {\n\tget: function() {\n\t\treturn 3;\n\t}\n});\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text + \"\";\n};\n\nTW_TextNode.prototype = Object.create(TW_Node.prototype);\n\nObject.defineProperty(TW_TextNode.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.TEXT_NODE;\n\t}\n});\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Element = function(tag,namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis._style = {};\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\nTW_Element.prototype = Object.create(TW_Node.prototype);\n\nObject.defineProperty(TW_Element.prototype, \"style\", {\n\tget: function() {\n\t\treturn this._style;\n\t},\n\tset: function(str) {\n\t\tvar self = this;\n\t\tstr = str || \"\";\n\t\t$tw.utils.each(str.split(\";\"),function(declaration) {\n\t\t\tvar parts = declaration.split(\":\"),\n\t\t\t\tname = $tw.utils.trim(parts[0]),\n\t\t\t\tvalue = $tw.utils.trim(parts[1]);\n\t\t\tif(name && value) {\n\t\t\t\tself._style[$tw.utils.convertStyleNameToPropertyName(name)] = value;\n\t\t\t}\n\t\t});\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.ELEMENT_NODE;\n\t}\n});\n\nTW_Element.prototype.getAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot getAttribute on a raw TW_Element\";\n\t}\n\treturn this.attributes[name];\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tthis.attributes[name] = value + \"\";\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"childNodes\", {\n\tget: function() {\n\t\treturn this.children;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"tagName\", {\n\tget: function() {\n\t\treturn this.tag || \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"=\\\"\",$tw.utils.htmlEncode(v),\"\\\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this._style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this._style) {\n\t\t\t\tstyle.push($tw.utils.convertPropertyNameToStyleName(s) + \":\" + this._style[s] + \";\");\n\t\t\t}\n\t\t\tif(style.length > 0) {\n\t\t\t\toutput.push(\" style=\\\"\",style.join(\"\"),\"\\\"\");\n\t\t\t}\n\t\t}\n\t\toutput.push(\">\");\n\t\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\n\t\t\toutput.push(this.innerHTML);\n\t\t\toutput.push(\"</\",this.tag,\">\");\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"innerHTML\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn this.rawHTML;\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tif(node instanceof TW_Element) {\n\t\t\t\t\tb.push(node.outerHTML);\n\t\t\t\t} else if(node instanceof TW_TextNode) {\n\t\t\t\t\tb.push($tw.utils.htmlEncode(node.textContent));\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.isRaw = true;\n\t\tthis.rawHTML = value;\n\t\tthis.rawTextContent = null;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textInnerHTML\", {\n\tset: function(value) {\n\t\tif(this.isRaw) {\n\t\t\tthis.rawTextContent = value;\n\t\t} else {\n\t\t\tthrow \"Cannot set textInnerHTML of a non-raw TW_Element\";\n\t\t}\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tif(this.rawTextContent === null) {\n\t\t\t\treturn \"\";\n\t\t\t} else {\n\t\t\t\treturn this.rawTextContent;\n\t\t\t}\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.textContent);\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.children = [new TW_TextNode(value)];\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn \"\";\n\t\t} else {\n\t\t\tvar b = [],\n\t\t\t\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\tif(this.tag === \"li\") {\n\t\t\t\tb.push(\"* \");\n\t\t\t}\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.formattedTextContent);\n\t\t\t});\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\treturn b.join(\"\");\n\t\t}\n\t}\n});\n\nvar document = {\n\tsetSequenceNumber: function(value) {\n\t\tsequenceNumber = value;\n\t},\n\tcreateElementNS: function(namespace,tag) {\n\t\treturn new TW_Element(tag,namespace);\n\t},\n\tcreateElement: function(tag) {\n\t\treturn new TW_Element(tag);\n\t},\n\tcreateTextNode: function(text) {\n\t\treturn new TW_TextNode(text);\n\t},\n\tcompatMode: \"CSS1Compat\", // For KaTeX to know that we're not a browser in quirks mode\n\tisTiddlyWikiFakeDom: true\n};\n\nexports.fakeDocument = document;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/utils/filesystem.js": {
            "title": "$:/core/modules/utils/filesystem.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/filesystem.js\ntype: application/javascript\nmodule-type: utils-node\n\nFile system utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\n/*\nReturn the subdirectories of a path\n*/\nexports.getSubdirectories = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn null;\n\t}\n\tvar subdirs = [];\n\t$tw.utils.each(fs.readdirSync(dirPath),function(item) {\n\t\tif($tw.utils.isDirectory(path.resolve(dirPath,item))) {\n\t\t\tsubdirs.push(item);\n\t\t}\n\t});\n\treturn subdirs;\n}\n\n/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = path.resolve($tw.utils.removeTrailingSeparator(srcPath));\n\tdstPath = path.resolve($tw.utils.removeTrailingSeparator(dstPath));\n\t// Check that neither director is within the other\n\tif(srcPath.substring(0,dstPath.length) === dstPath || dstPath.substring(0,srcPath.length) === srcPath) {\n\t\treturn \"Cannot copy nested directories\";\n\t}\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = Buffer.alloc(FILE_BUFFER_LENGTH);\n\t}\n\t// Create any directories in the destination\n\t$tw.utils.createDirectory(path.dirname(dstPath));\n\t// Copy the file\n\tvar srcFile = fs.openSync(srcPath,\"r\"),\n\t\tdstFile = fs.openSync(dstPath,\"w\"),\n\t\tbytesRead = 1,\n\t\tpos = 0;\n\twhile (bytesRead > 0) {\n\t\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\n\t\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\n\t\tpos += bytesRead;\n\t}\n\tfs.closeSync(srcFile);\n\tfs.closeSync(dstFile);\n\treturn null;\n};\n\n/*\nRemove trailing path separator\n*/\nexports.removeTrailingSeparator = function(dirPath) {\n\tvar len = dirPath.length;\n\tif(dirPath.charAt(len-1) === path.sep) {\n\t\tdirPath = dirPath.substr(0,len-1);\n\t}\n\treturn dirPath;\n};\n\n/*\nRecursively create a directory\n*/\nexports.createDirectory = function(dirPath) {\n\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\n\t\tdirPath = dirPath + path.sep;\n\t}\n\tvar pos = 1;\n\tpos = dirPath.indexOf(path.sep,pos);\n\twhile(pos !== -1) {\n\t\tvar subDirPath = dirPath.substr(0,pos);\n\t\tif(!$tw.utils.isDirectory(subDirPath)) {\n\t\t\ttry {\n\t\t\t\tfs.mkdirSync(subDirPath);\n\t\t\t} catch(e) {\n\t\t\t\treturn \"Error creating directory '\" + subDirPath + \"'\";\n\t\t\t}\n\t\t}\n\t\tpos = dirPath.indexOf(path.sep,pos + 1);\n\t}\n\treturn null;\n};\n\n/*\nRecursively create directories needed to contain a specified file\n*/\nexports.createFileDirectories = function(filePath) {\n\treturn $tw.utils.createDirectory(path.dirname(filePath));\n};\n\n/*\nRecursively delete a directory\n*/\nexports.deleteDirectory = function(dirPath) {\n\tif(fs.existsSync(dirPath)) {\n\t\tvar entries = fs.readdirSync(dirPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar currPath = dirPath + path.sep + entries[entryIndex];\n\t\t\tif(fs.lstatSync(currPath).isDirectory()) {\n\t\t\t\t$tw.utils.deleteDirectory(currPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(currPath);\n\t\t\t}\n\t\t}\n\tfs.rmdirSync(dirPath);\n\t}\n\treturn null;\n};\n\n/*\nCheck if a path identifies a directory\n*/\nexports.isDirectory = function(dirPath) {\n\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n};\n\n/*\nCheck if a path identifies a directory that is empty\n*/\nexports.isDirectoryEmpty = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn false;\n\t}\n\tvar files = fs.readdirSync(dirPath),\n\t\tempty = true;\n\t$tw.utils.each(files,function(file,index) {\n\t\tif(file.charAt(0) !== \".\") {\n\t\t\tempty = false;\n\t\t}\n\t});\n\treturn empty;\n};\n\n/*\nRecursively delete a tree of empty directories\n*/\nexports.deleteEmptyDirs = function(dirpath,callback) {\n\tvar self = this;\n\tfs.readdir(dirpath,function(err,files) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(files.length > 0) {\n\t\t\treturn callback(null);\n\t\t}\n\t\tfs.rmdir(dirpath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.deleteEmptyDirs(path.dirname(dirpath),callback);\n\t\t});\n\t});\n};\n\n/*\nCreate a fileInfo object for saving a tiddler:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file on disk (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n\tisEditableFile: true if the tiddler was loaded via non-standard options & marked editable\nOptions include:\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\textFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters,\n\tfileInfo: an existing fileInfo to check against\n\toriginalpath: a preferred filepath if no pathFilters match\n*/\nexports.generateTiddlerFileInfo = function(tiddler,options) {\n\tvar fileInfo = {}, metaExt;\n\t// Propagate the isEditableFile flag\n\tif(options.fileInfo) {\n\t\tfileInfo.isEditableFile = options.fileInfo.isEditableFile || false;\n\t}\n\t// Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace\n\tvar hasUnsafeFields = false;\n\t$tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) {\n\t\tif(fieldName !== \"text\") {\n\t\t\thasUnsafeFields = hasUnsafeFields || /[\\x00-\\x1F]/mg.test(value);\n\t\t\thasUnsafeFields = hasUnsafeFields || ($tw.utils.trim(value) !== value);\n\t\t}\n\t});\n\t// Check for field values \n\tif(hasUnsafeFields) {\n\t\t// Save as a JSON file\n\t\tfileInfo.type = \"application/json\";\n\t\tfileInfo.hasMetaFile = false;\n\t} else {\n\t\t// Save as a .tid or a text/binary file plus a .meta file\n\t\tvar tiddlerType = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\tif(tiddlerType === \"text/vnd.tiddlywiki\") {\n\t\t\t// Save as a .tid file\n\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\tfileInfo.hasMetaFile = false;\n\t\t} else {\n\t\t\t// Save as a text/binary file and a .meta file\n\t\t\tfileInfo.type = tiddlerType;\n\t\t\tfileInfo.hasMetaFile = true;\n\t\t}\n\t\tif(options.extFilters) {\n\t\t\t// Check for extension override\n\t\t\tmetaExt = $tw.utils.generateTiddlerExtension(tiddler.fields.title,{\n\t\t\t\textFilters: options.extFilters,\n\t\t\t\twiki: options.wiki\n\t\t\t});\n\t\t\tif(metaExt){\n\t\t\t\tif(metaExt === \".tid\") {\n\t\t\t\t\t// Overriding to the .tid extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else if (metaExt === \".json\") {\n\t\t\t\t\t// Overriding to the .json extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/json\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else {\n\t\t\t\t\t//If the new type matches a known extention, use that MIME type's encoding\n\t\t\t\t\tvar extInfo = $tw.utils.getFileExtensionInfo(metaExt);\n\t\t\t\t\tfileInfo.type = extInfo ? extInfo.type : null;\n\t\t\t\t\tfileInfo.encoding = $tw.utils.getTypeEncoding(metaExt);\n\t\t\t\t\tfileInfo.hasMetaFile = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Take the file extension from the tiddler content type or metaExt\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: \"\"};\n\t// Generate the filepath\n\tfileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{\n\t\textension: metaExt || contentTypeInfo.extension,\n\t\tdirectory: options.directory,\n\t\tpathFilters: options.pathFilters,\n\t\twiki: options.wiki,\n\t\tfileInfo: options.fileInfo,\n\t\toriginalpath: options.originalpath\n\t});\n\treturn fileInfo;\n};\n\n/*\nGenerate the file extension for saving a tiddler\nOptions include:\n\textFilters: optional array of filters to be used to generate the extention\n\twiki: optional wiki for evaluating the extFilters\n*/\nexports.generateTiddlerExtension = function(title,options) {\n\tvar self = this,\n\t\textension;\n\t// Check if any of the extFilters applies\n\tif(options.extFilters && options.wiki) { \n\t\t$tw.utils.each(options.extFilters,function(filter) {\n\t\t\tif(!extension) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\textension = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn extension;\n};\n\n/*\nGenerate the filepath for saving a tiddler\nOptions include:\n\textension: file extension to be added the finished filepath\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n\tfileInfo: an existing fileInfo object to check against\n*/\nexports.generateTiddlerFilepath = function(title,options) {\n\tvar self = this,\n\t\tdirectory = options.directory || \"\",\n\t\textension = options.extension || \"\",\n\t\toriginalpath = options.originalpath || \"\",\n\t\tfilepath;\t\n\t// Check if any of the pathFilters applies\n\tif(options.pathFilters && options.wiki) {\n\t\t$tw.utils.each(options.pathFilters,function(filter) {\n\t\t\tif(!filepath) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\tfilepath = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tif(!filepath && originalpath !== \"\") {\n\t\t//Use the originalpath without the extension\n\t\tvar ext = path.extname(originalpath);\n\t\tfilepath = originalpath.substring(0,originalpath.length - ext.length);\n\t} else if(!filepath) {\n\t\tfilepath = title;\n\t\t// If the filepath already ends in the extension then remove it\n\t\tif(filepath.substring(filepath.length - extension.length) === extension) {\n\t\t\tfilepath = filepath.substring(0,filepath.length - extension.length);\n\t\t}\n\t\t// Remove any forward or backward slashes so we don't create directories\n\t\tfilepath = filepath.replace(/\\/|\\\\/g,\"_\");\n\t}\n\t//If the path does not start with \".\" or \"..\" and a path seperator, then\n\tif(!/^\\.{1,2}[/\\\\]/g.test(filepath)) {\n\t\t// Don't let the filename start with any dots because such files are invisible on *nix\n\t\tfilepath = filepath.replace(/^\\.+/g,\"_\");\n\t}\n\t// Remove any characters that can't be used in cross-platform filenames\n\tfilepath = $tw.utils.transliterate(filepath.replace(/<|>|~|\\:|\\\"|\\||\\?|\\*|\\^/g,\"_\"));\n\t// Truncate the filename if it is too long\n\tif(filepath.length > 200) {\n\t\tfilepath = filepath.substr(0,200);\n\t}\n\t// If the resulting filename is blank (eg because the title is just punctuation characters)\n\tif(!filepath) {\n\t\t// ...then just use the character codes of the title\n\t\tfilepath = \"\";\t\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tif(filepath) {\n\t\t\t\tfilepath += \"-\";\n\t\t\t}\n\t\t\tfilepath += char.charCodeAt(0).toString();\n\t\t});\n\t}\n\t// Add a uniquifier if the file already exists\n\tvar fullPath, oldPath = (options.fileInfo) ? options.fileInfo.filepath : undefined,\n\t\tcount = 0;\n\tdo {\n\t\tfullPath = path.resolve(directory,filepath + (count ? \"_\" + count : \"\") + extension);\n\t\tif(oldPath && oldPath == fullPath) {\n\t\t\tbreak;\n\t\t}\n\t\tcount++;\n\t} while(fs.existsSync(fullPath));\n\t// If the last write failed with an error, or if path does not start with:\n\t//\tthe resolved options.directory, the resolved wikiPath directory, or the wikiTiddlersPath directory, \n\t//\tthen encodeURIComponent() and resolve to tiddler directory\n\tvar newPath = fullPath,\n\t\tencode = (options.fileInfo || {writeError: false}).writeError == true;\n\tif(!encode){\n\t\tencode = !(fullPath.indexOf(path.resolve(directory)) == 0 ||\n\t\t\tfullPath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 ||\n\t\t\tfullPath.indexOf($tw.boot.wikiTiddlersPath) == 0);\n\t\t}\n\tif(encode){\n\t\tfullPath = path.resolve(directory, encodeURIComponent(fullPath));\n\t}\n\t// Call hook to allow plugins to modify the final path\n\tfullPath = $tw.hooks.invokeHook(\"th-make-tiddler-path\", newPath, fullPath);\n\t// Return the full path to the file\n\treturn fullPath;\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFile = function(tiddler,fileInfo,callback) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\",callback);\n\t\t});\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\",callback);\n\t\t} else {\n\t\t\tfs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\",callback);\n\t\t}\n\t}\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFileSync = function(tiddler,fileInfo) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFileSync(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding);\n\t\tfs.writeFileSync(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\");\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\");\n\t\t} else {\n\t\t\tfs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\");\n\t\t}\n\t}\n};\n\n/*\nDelete a file described by the fileInfo if it exits\n*/\nexports.deleteTiddlerFile = function(fileInfo, callback) {\n\t//Only attempt to delete files that exist on disk\n\tif(!fileInfo.filepath || !fs.existsSync(fileInfo.filepath)) {\n\t\treturn callback(null);\n\t}\n\t// Delete the file\n\tfs.unlink(fileInfo.filepath,function(err) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\t\n\t\t// Delete the metafile if present\n\t\tif(fileInfo.hasMetaFile && fs.existsSync(fileInfo.filepath + \".meta\")) {\n\t\t\tfs.unlink(fileInfo.filepath + \".meta\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback);\n\t\t\t});\n\t\t} else {\n\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback);\n\t\t}\n\t});\n};\n\n/*\nCleanup old files on disk, by comparing the options values:\n\tadaptorInfo from $tw.syncer.tiddlerInfo\n\tbootInfo from $tw.boot.files\n*/\nexports.cleanupTiddlerFiles = function(options, callback) {\n\tvar adaptorInfo = options.adaptorInfo || {},\n\tbootInfo = options.bootInfo || {},\n\ttitle = options.title || \"undefined\";\n\tif(adaptorInfo.filepath && bootInfo.filepath && adaptorInfo.filepath !== bootInfo.filepath) {\n\t\treturn $tw.utils.deleteTiddlerFile(adaptorInfo, function(err){\n\t\t\tif(err) {\n\t\t\t\tif ((err.code == \"EPERM\" || err.code == \"EACCES\") && err.syscall == \"unlink\") {\n\t\t\t\t\t// Error deleting the previous file on disk, should fail gracefully\n\t\t\t\t\t$tw.syncer.displayError(\"Server desynchronized. Error cleaning up previous file for tiddler: \"+title, err);\n\t\t\t\t\treturn callback(null);\n\t\t\t\t} else {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn callback(null);\n\t\t});\n\t} else {\n\t\treturn callback(null);\n\t}\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils-node"
        },
        "$:/core/modules/utils/linkedlist.js": {
            "title": "$:/core/modules/utils/linkedlist.js",
            "text": "/*\\\nmodule-type: utils\ntitle: $:/core/modules/utils/linkedlist.js\ntype: application/javascript\n\nThis is a doubly-linked indexed list intended for manipulation, particularly\npushTop, which it does with significantly better performance than an array.\n\n\\*/\n(function(){\n\nfunction LinkedList() {\n\tthis.clear();\n};\n\nLinkedList.prototype.clear = function() {\n\tthis.index = Object.create(null);\n\t// LinkedList performs the duty of both the head and tail node\n\tthis.next = this;\n\tthis.prev = this;\n\tthis.length = 0;\n};\n\nLinkedList.prototype.remove = function(value) {\n\tif($tw.utils.isArray(value)) {\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t} else {\n\t\t_removeOne(this,value);\n\t}\n};\n\nLinkedList.prototype.push = function(/* values */) {\n\tfor(var i = 0; i < arguments.length; i++) {\n\t\tvar value = arguments[i];\n\t\tvar node = {value: value};\n\t\tvar preexistingNode = this.index[value];\n\t\t_linkToEnd(this,node);\n\t\tif(preexistingNode) {\n\t\t\t// We want to keep pointing to the first instance, but we want\n\t\t\t// to have that instance (or chain of instances) point to the\n\t\t\t// new one.\n\t\t\twhile (preexistingNode.copy) {\n\t\t\t\tpreexistingNode = preexistingNode.copy;\n\t\t\t}\n\t\t\tpreexistingNode.copy = node;\n\t\t} else {\n\t\t\tthis.index[value] = node;\n\t\t}\n\t}\n};\n\nLinkedList.prototype.pushTop = function(value) {\n\tif($tw.utils.isArray(value)) {\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t\tthis.push.apply(this,value);\n\t} else {\n\t\tvar node = _removeOne(this,value);\n\t\tif(!node) {\n\t\t\tnode = {value: value};\n\t\t\tthis.index[value] = node;\n\t\t} else {\n\t\t\t// Put this node at the end of the copy chain.\n\t\t\tvar preexistingNode = node;\n\t\t\twhile(preexistingNode.copy) {\n\t\t\t\tpreexistingNode = preexistingNode.copy;\n\t\t\t}\n\t\t\t// The order of these three statements is important,\n\t\t\t// because sometimes preexistingNode == node.\n\t\t\tpreexistingNode.copy = node;\n\t\t\tthis.index[value] = node.copy;\n\t\t\tnode.copy = undefined;\n\t\t}\n\t\t_linkToEnd(this,node);\n\t}\n};\n\nLinkedList.prototype.each = function(callback) {\n\tfor(var ptr = this.next; ptr !== this; ptr = ptr.next) {\n\t\tcallback(ptr.value);\n\t}\n};\n\nLinkedList.prototype.toArray = function() {\n\tvar output = [];\n\tfor(var ptr = this.next; ptr !== this; ptr = ptr.next) {\n\t\toutput.push(ptr.value);\n\t}\n\treturn output;\n};\n\nfunction _removeOne(list,value) {\n\tvar node = list.index[value];\n\tif(node) {\n\t\tnode.prev.next = node.next;\n\t\tnode.next.prev = node.prev;\n\t\tlist.length -= 1;\n\t\t// Point index to the next instance of the same value, maybe nothing.\n\t\tlist.index[value] = node.copy;\n\t}\n\treturn node;\n};\n\nfunction _linkToEnd(list,node) {\n\t// Sticks the given node onto the end of the list.\n\tlist.prev.next = node;\n\tnode.prev = list.prev;\n\tlist.prev = node;\n\tnode.next = list;\n\tlist.length += 1;\n};\n\nexports.LinkedList = LinkedList;\n\n})();\n",
            "module-type": "utils",
            "type": "application/javascript"
        },
        "$:/core/modules/utils/logger.js": {
            "title": "$:/core/modules/utils/logger.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/logger.js\ntype: application/javascript\nmodule-type: utils\n\nA basic logging implementation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ALERT_TAG = \"$:/tags/Alert\";\n\n/*\nMake a new logger\n*/\nfunction Logger(componentName,options) {\n\toptions = options || {};\n\tthis.componentName = componentName || \"\";\n\tthis.colour = options.colour || \"white\";\n\tthis.enable = \"enable\" in options ? options.enable : true;\n\tthis.save = \"save\" in options ? options.save : true;\n\tthis.saveLimit = options.saveLimit || 100 * 1024;\n\tthis.saveBufferLogger = this;\n\tthis.buffer = \"\";\n\tthis.alertCount = 0;\n}\n\nLogger.prototype.setSaveBuffer = function(logger) {\n\tthis.saveBufferLogger = logger;\n};\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tvar self = this;\n\tif(this.enable) {\n\t\tif(this.saveBufferLogger.save) {\n\t\t\tthis.saveBufferLogger.buffer += $tw.utils.formatDateString(new Date(),\"YYYY MM DD 0hh:0mm:0ss.0XXX\") + \":\";\n\t\t\t$tw.utils.each(Array.prototype.slice.call(arguments,0),function(arg,index) {\n\t\t\t\tself.saveBufferLogger.buffer += \" \" + arg;\n\t\t\t});\n\t\t\tthis.saveBufferLogger.buffer += \"\\n\";\n\t\t\tthis.saveBufferLogger.buffer = this.saveBufferLogger.buffer.slice(-this.saveBufferLogger.saveLimit);\t\t\t\n\t\t}\n\t\tif(console !== undefined && console.log !== undefined) {\n\t\t\treturn Function.apply.call(console.log, console, [$tw.utils.terminalColour(this.colour),this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0)).concat($tw.utils.terminalColour()));\n\t\t}\n\t} \n};\n\n/*\nRead the message buffer\n*/\nLogger.prototype.getBuffer = function() {\n\treturn this.saveBufferLogger.buffer;\n};\n\n/*\nLog a structure as a table\n*/\nLogger.prototype.table = function(value) {\n\t(console.table || console.log)(value);\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\tif(this.enable) {\n\t\t// Prepare the text of the alert\n\t\tvar text = Array.prototype.join.call(arguments,\" \");\n\t\t// Create alert tiddlers in the browser\n\t\tif($tw.browser) {\n\t\t\t// Check if there is an existing alert with the same text and the same component\n\t\t\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\t\t\talertFields,\n\t\t\t\texistingCount,\n\t\t\t\tself = this;\n\t\t\t$tw.utils.each(existingAlerts,function(title) {\n\t\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(alertFields) {\n\t\t\t\texistingCount = alertFields.count || 1;\n\t\t\t} else {\n\t\t\t\talertFields = {\n\t\t\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\t\t\ttext: text,\n\t\t\t\t\ttags: [ALERT_TAG],\n\t\t\t\t\tcomponent: this.componentName\n\t\t\t\t};\n\t\t\t\texistingCount = 0;\n\t\t\t\tthis.alertCount += 1;\n\t\t\t}\n\t\t\talertFields.modified = new Date();\n\t\t\tif(++existingCount > 1) {\n\t\t\t\talertFields.count = existingCount;\n\t\t\t} else {\n\t\t\t\talertFields.count = undefined;\n\t\t\t}\n\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t\t\t// Log the alert as well\n\t\t\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\t// Print an orange message to the console if not in the browser\n\t\t\tconsole.error(\"\\x1b[1;33m\" + text + \"\\x1b[0m\");\n\t\t}\t\t\n\t}\n};\n\n/*\nClear outstanding alerts\n*/\nLogger.prototype.clearAlerts = function() {\n\tvar self = this;\n\tif($tw.browser && this.alertCount > 0) {\n\t\t$tw.utils.each($tw.wiki.getTiddlersWithTag(ALERT_TAG),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(tiddler.fields.component === self.componentName) {\n\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t}\n\t\t});\n\t\tthis.alertCount = 0;\n\t}\n};\n\nexports.Logger = Logger;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/parsetree.js": {
            "title": "$:/core/modules/utils/parsetree.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/parsetree.js\ntype: application/javascript\nmodule-type: utils\n\nParse tree utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[name] = {type: \"string\", value: value};\n};\n\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\n\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\n\t\treturn node.attributes[name].value;\n\t}\n\treturn defaultValue;\n};\n\nexports.addClassToParseTreeNode = function(node,classString) {\n\tvar classes = [];\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[\"class\"] = node.attributes[\"class\"] || {type: \"string\", value: \"\"};\n\tif(node.attributes[\"class\"].type === \"string\") {\n\t\tif(node.attributes[\"class\"].value !== \"\") {\n\t\t\tclasses = node.attributes[\"class\"].value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tnode.attributes[\"class\"].value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\t\tnode.attributes = node.attributes || {};\n\t\tnode.attributes.style = node.attributes.style || {type: \"string\", value: \"\"};\n\t\tif(node.attributes.style.type === \"string\") {\n\t\t\tnode.attributes.style.value += name + \":\" + value + \";\";\n\t\t}\n};\n\nexports.findParseTreeNode = function(nodeArray,search) {\n\tfor(var t=0; t<nodeArray.length; t++) {\n\t\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\n\t\t\treturn nodeArray[t];\n\t\t}\n\t}\n\treturn undefined;\n};\n\n/*\nHelper to get the text of a parse tree node or array of nodes\n*/\nexports.getParseTreeText = function getParseTreeText(tree) {\n\tvar output = [];\n\tif($tw.utils.isArray(tree)) {\n\t\t$tw.utils.each(tree,function(node) {\n\t\t\toutput.push(getParseTreeText(node));\n\t\t});\n\t} else {\n\t\tif(tree.type === \"text\") {\n\t\t\toutput.push(tree.text);\n\t\t}\n\t\tif(tree.children) {\n\t\t\treturn getParseTreeText(tree.children);\n\t\t}\n\t}\n\treturn output.join(\"\");\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/performance.js": {
            "title": "$:/core/modules/utils/performance.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/performance.js\ntype: application/javascript\nmodule-type: global\n\nPerformance measurement.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Performance(enabled) {\n\tthis.enabled = !!enabled;\n\tthis.measures = {}; // Hashmap by measurement name of {time:, invocations:}\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n\tthis.showGreeting();\n}\n\nPerformance.prototype.showGreeting = function() {\n\tif($tw.browser) {\n\t\tthis.logger.log(\"Execute $tw.perf.log(); to see filter execution timings\");\t\t\n\t}\n};\n\n/*\nWrap performance reporting around a top level function\n*/\nPerformance.prototype.report = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tself.logger.log(name + \": \" + $tw.utils.timer(startTime).toFixed(2) + \"ms\");\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nPerformance.prototype.log = function() {\n\tvar self = this,\n\t\ttotalTime = 0,\n\t\torderedMeasures = Object.keys(this.measures).sort(function(a,b) {\n\t\t\tif(self.measures[a].time > self.measures[b].time) {\n\t\t\t\treturn -1;\n\t\t\t} else if (self.measures[a].time < self.measures[b].time) {\n\t\t\t\treturn + 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\ttotalTime += self.measures[name].time;\n\t});\n\tvar results = []\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\tvar measure = self.measures[name];\n\t\tresults.push({name: name,invocations: measure.invocations, avgTime: measure.time / measure.invocations, totalTime: measure.time, percentTime: (measure.time / totalTime) * 100})\n\t});\n\tself.logger.table(results);\n};\n\n/*\nWrap performance measurements around a subfunction\n*/\nPerformance.prototype.measure = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tif(!(name in self.measures)) {\n\t\t\t\tself.measures[name] = {time: 0, invocations: 0};\n\t\t\t}\n\t\t\tself.measures[name].time += $tw.utils.timer(startTime);\n\t\t\tself.measures[name].invocations++;\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nexports.Performance = Performance;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/utils/pluginmaker.js": {
            "title": "$:/core/modules/utils/pluginmaker.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/pluginmaker.js\ntype: application/javascript\nmodule-type: utils\n\nA quick and dirty way to pack up plugins within the browser.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRepack a plugin, and then delete any non-shadow payload tiddlers\n*/\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\n\tadditionalTiddlers = additionalTiddlers || [];\n\texcludeTiddlers = excludeTiddlers || [];\n\t// Get the plugin tiddler\n\tvar pluginTiddler = $tw.wiki.getTiddler(title);\n\tif(!pluginTiddler) {\n\t\tthrow \"No such tiddler as \" + title;\n\t}\n\t// Extract the JSON\n\tvar jsonPluginTiddler;\n\ttry {\n\t\tjsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);\n\t} catch(e) {\n\t\tthrow \"Cannot parse plugin tiddler \" + title + \"\\n\" + $tw.language.getString(\"Error/Caption\") + \": \" + e;\n\t}\n\t// Get the list of tiddlers\n\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\n\t// Add the additional tiddlers\n\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\n\t// Remove any excluded tiddlers\n\tfor(var t=tiddlers.length-1; t>=0; t--) {\n\t\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\n\t\t\ttiddlers.splice(t,1);\n\t\t}\n\t}\n\t// Pack up the tiddlers into a block of JSON\n\tvar plugins = {};\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\tfields = {};\n\t\t$tw.utils.each(tiddler.fields,function (value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\tplugins[title] = fields;\n\t});\n\t// Retrieve and bump the version number\n\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\"version\") || \"0.0.0\") || {\n\t\t\tmajor: \"0\",\n\t\t\tminor: \"0\",\n\t\t\tpatch: \"0\"\n\t\t};\n\tpluginVersion.patch++;\n\tvar version = pluginVersion.major + \".\" + pluginVersion.minor + \".\" + pluginVersion.patch;\n\tif(pluginVersion.prerelease) {\n\t\tversion += \"-\" + pluginVersion.prerelease;\n\t}\n\tif(pluginVersion.build) {\n\t\tversion += \"+\" + pluginVersion.build;\n\t}\n\t// Save the tiddler\n\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\n\t// Delete any non-shadow constituent tiddlers\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tif($tw.wiki.tiddlerExists(title)) {\n\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t}\n\t});\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t// Return a heartwarming confirmation\n\treturn \"Plugin \" + title + \" successfully saved\";\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/transliterate.js": {
            "title": "$:/core/modules/utils/transliterate.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/transliterate.js\ntype: application/javascript\nmodule-type: utils\n\nTransliteration static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nTransliterate string to ASCII\n\n(Some pairs taken from http://semplicewebsites.com/removing-accents-javascript)\n*/\nexports.transliterationPairs = {\n\t\"Á\":\"A\",\n\t\"Ă\":\"A\",\n\t\"Ắ\":\"A\",\n\t\"Ặ\":\"A\",\n\t\"Ằ\":\"A\",\n\t\"Ẳ\":\"A\",\n\t\"Ẵ\":\"A\",\n\t\"Ǎ\":\"A\",\n\t\"Â\":\"A\",\n\t\"Ấ\":\"A\",\n\t\"Ậ\":\"A\",\n\t\"Ầ\":\"A\",\n\t\"Ẩ\":\"A\",\n\t\"Ẫ\":\"A\",\n\t\"Ä\":\"A\",\n\t\"Ǟ\":\"A\",\n\t\"Ȧ\":\"A\",\n\t\"Ǡ\":\"A\",\n\t\"Ạ\":\"A\",\n\t\"Ȁ\":\"A\",\n\t\"À\":\"A\",\n\t\"Ả\":\"A\",\n\t\"Ȃ\":\"A\",\n\t\"Ā\":\"A\",\n\t\"Ą\":\"A\",\n\t\"Å\":\"A\",\n\t\"Ǻ\":\"A\",\n\t\"Ḁ\":\"A\",\n\t\"Ⱥ\":\"A\",\n\t\"Ã\":\"A\",\n\t\"Ꜳ\":\"AA\",\n\t\"Æ\":\"AE\",\n\t\"Ǽ\":\"AE\",\n\t\"Ǣ\":\"AE\",\n\t\"Ꜵ\":\"AO\",\n\t\"Ꜷ\":\"AU\",\n\t\"Ꜹ\":\"AV\",\n\t\"Ꜻ\":\"AV\",\n\t\"Ꜽ\":\"AY\",\n\t\"Ḃ\":\"B\",\n\t\"Ḅ\":\"B\",\n\t\"Ɓ\":\"B\",\n\t\"Ḇ\":\"B\",\n\t\"Ƀ\":\"B\",\n\t\"Ƃ\":\"B\",\n\t\"Ć\":\"C\",\n\t\"Č\":\"C\",\n\t\"Ç\":\"C\",\n\t\"Ḉ\":\"C\",\n\t\"Ĉ\":\"C\",\n\t\"Ċ\":\"C\",\n\t\"Ƈ\":\"C\",\n\t\"Ȼ\":\"C\",\n\t\"Ď\":\"D\",\n\t\"Ḑ\":\"D\",\n\t\"Ḓ\":\"D\",\n\t\"Ḋ\":\"D\",\n\t\"Ḍ\":\"D\",\n\t\"Ɗ\":\"D\",\n\t\"Ḏ\":\"D\",\n\t\"Dz\":\"D\",\n\t\"Dž\":\"D\",\n\t\"Đ\":\"D\",\n\t\"Ƌ\":\"D\",\n\t\"DZ\":\"DZ\",\n\t\"DŽ\":\"DZ\",\n\t\"É\":\"E\",\n\t\"Ĕ\":\"E\",\n\t\"Ě\":\"E\",\n\t\"Ȩ\":\"E\",\n\t\"Ḝ\":\"E\",\n\t\"Ê\":\"E\",\n\t\"Ế\":\"E\",\n\t\"Ệ\":\"E\",\n\t\"Ề\":\"E\",\n\t\"Ể\":\"E\",\n\t\"Ễ\":\"E\",\n\t\"Ḙ\":\"E\",\n\t\"Ë\":\"E\",\n\t\"Ė\":\"E\",\n\t\"Ẹ\":\"E\",\n\t\"Ȅ\":\"E\",\n\t\"È\":\"E\",\n\t\"Ẻ\":\"E\",\n\t\"Ȇ\":\"E\",\n\t\"Ē\":\"E\",\n\t\"Ḗ\":\"E\",\n\t\"Ḕ\":\"E\",\n\t\"Ę\":\"E\",\n\t\"Ɇ\":\"E\",\n\t\"Ẽ\":\"E\",\n\t\"Ḛ\":\"E\",\n\t\"Ꝫ\":\"ET\",\n\t\"Ḟ\":\"F\",\n\t\"Ƒ\":\"F\",\n\t\"Ǵ\":\"G\",\n\t\"Ğ\":\"G\",\n\t\"Ǧ\":\"G\",\n\t\"Ģ\":\"G\",\n\t\"Ĝ\":\"G\",\n\t\"Ġ\":\"G\",\n\t\"Ɠ\":\"G\",\n\t\"Ḡ\":\"G\",\n\t\"Ǥ\":\"G\",\n\t\"Ḫ\":\"H\",\n\t\"Ȟ\":\"H\",\n\t\"Ḩ\":\"H\",\n\t\"Ĥ\":\"H\",\n\t\"Ⱨ\":\"H\",\n\t\"Ḧ\":\"H\",\n\t\"Ḣ\":\"H\",\n\t\"Ḥ\":\"H\",\n\t\"Ħ\":\"H\",\n\t\"Í\":\"I\",\n\t\"Ĭ\":\"I\",\n\t\"Ǐ\":\"I\",\n\t\"Î\":\"I\",\n\t\"Ï\":\"I\",\n\t\"Ḯ\":\"I\",\n\t\"İ\":\"I\",\n\t\"Ị\":\"I\",\n\t\"Ȉ\":\"I\",\n\t\"Ì\":\"I\",\n\t\"Ỉ\":\"I\",\n\t\"Ȋ\":\"I\",\n\t\"Ī\":\"I\",\n\t\"Į\":\"I\",\n\t\"Ɨ\":\"I\",\n\t\"Ĩ\":\"I\",\n\t\"Ḭ\":\"I\",\n\t\"Ꝺ\":\"D\",\n\t\"Ꝼ\":\"F\",\n\t\"Ᵹ\":\"G\",\n\t\"Ꞃ\":\"R\",\n\t\"Ꞅ\":\"S\",\n\t\"Ꞇ\":\"T\",\n\t\"Ꝭ\":\"IS\",\n\t\"Ĵ\":\"J\",\n\t\"Ɉ\":\"J\",\n\t\"Ḱ\":\"K\",\n\t\"Ǩ\":\"K\",\n\t\"Ķ\":\"K\",\n\t\"Ⱪ\":\"K\",\n\t\"Ꝃ\":\"K\",\n\t\"Ḳ\":\"K\",\n\t\"Ƙ\":\"K\",\n\t\"Ḵ\":\"K\",\n\t\"Ꝁ\":\"K\",\n\t\"Ꝅ\":\"K\",\n\t\"Ĺ\":\"L\",\n\t\"Ƚ\":\"L\",\n\t\"Ľ\":\"L\",\n\t\"Ļ\":\"L\",\n\t\"Ḽ\":\"L\",\n\t\"Ḷ\":\"L\",\n\t\"Ḹ\":\"L\",\n\t\"Ⱡ\":\"L\",\n\t\"Ꝉ\":\"L\",\n\t\"Ḻ\":\"L\",\n\t\"Ŀ\":\"L\",\n\t\"Ɫ\":\"L\",\n\t\"Lj\":\"L\",\n\t\"Ł\":\"L\",\n\t\"LJ\":\"LJ\",\n\t\"Ḿ\":\"M\",\n\t\"Ṁ\":\"M\",\n\t\"Ṃ\":\"M\",\n\t\"Ɱ\":\"M\",\n\t\"Ń\":\"N\",\n\t\"Ň\":\"N\",\n\t\"Ņ\":\"N\",\n\t\"Ṋ\":\"N\",\n\t\"Ṅ\":\"N\",\n\t\"Ṇ\":\"N\",\n\t\"Ǹ\":\"N\",\n\t\"Ɲ\":\"N\",\n\t\"Ṉ\":\"N\",\n\t\"Ƞ\":\"N\",\n\t\"Nj\":\"N\",\n\t\"Ñ\":\"N\",\n\t\"NJ\":\"NJ\",\n\t\"Ó\":\"O\",\n\t\"Ŏ\":\"O\",\n\t\"Ǒ\":\"O\",\n\t\"Ô\":\"O\",\n\t\"Ố\":\"O\",\n\t\"Ộ\":\"O\",\n\t\"Ồ\":\"O\",\n\t\"Ổ\":\"O\",\n\t\"Ỗ\":\"O\",\n\t\"Ö\":\"O\",\n\t\"Ȫ\":\"O\",\n\t\"Ȯ\":\"O\",\n\t\"Ȱ\":\"O\",\n\t\"Ọ\":\"O\",\n\t\"Ő\":\"O\",\n\t\"Ȍ\":\"O\",\n\t\"Ò\":\"O\",\n\t\"Ỏ\":\"O\",\n\t\"Ơ\":\"O\",\n\t\"Ớ\":\"O\",\n\t\"Ợ\":\"O\",\n\t\"Ờ\":\"O\",\n\t\"Ở\":\"O\",\n\t\"Ỡ\":\"O\",\n\t\"Ȏ\":\"O\",\n\t\"Ꝋ\":\"O\",\n\t\"Ꝍ\":\"O\",\n\t\"Ō\":\"O\",\n\t\"Ṓ\":\"O\",\n\t\"Ṑ\":\"O\",\n\t\"Ɵ\":\"O\",\n\t\"Ǫ\":\"O\",\n\t\"Ǭ\":\"O\",\n\t\"Ø\":\"O\",\n\t\"Ǿ\":\"O\",\n\t\"Õ\":\"O\",\n\t\"Ṍ\":\"O\",\n\t\"Ṏ\":\"O\",\n\t\"Ȭ\":\"O\",\n\t\"Ƣ\":\"OI\",\n\t\"Ꝏ\":\"OO\",\n\t\"Ɛ\":\"E\",\n\t\"Ɔ\":\"O\",\n\t\"Ȣ\":\"OU\",\n\t\"Ṕ\":\"P\",\n\t\"Ṗ\":\"P\",\n\t\"Ꝓ\":\"P\",\n\t\"Ƥ\":\"P\",\n\t\"Ꝕ\":\"P\",\n\t\"Ᵽ\":\"P\",\n\t\"Ꝑ\":\"P\",\n\t\"Ꝙ\":\"Q\",\n\t\"Ꝗ\":\"Q\",\n\t\"Ŕ\":\"R\",\n\t\"Ř\":\"R\",\n\t\"Ŗ\":\"R\",\n\t\"Ṙ\":\"R\",\n\t\"Ṛ\":\"R\",\n\t\"Ṝ\":\"R\",\n\t\"Ȑ\":\"R\",\n\t\"Ȓ\":\"R\",\n\t\"Ṟ\":\"R\",\n\t\"Ɍ\":\"R\",\n\t\"Ɽ\":\"R\",\n\t\"Ꜿ\":\"C\",\n\t\"Ǝ\":\"E\",\n\t\"Ś\":\"S\",\n\t\"Ṥ\":\"S\",\n\t\"Š\":\"S\",\n\t\"Ṧ\":\"S\",\n\t\"Ş\":\"S\",\n\t\"Ŝ\":\"S\",\n\t\"Ș\":\"S\",\n\t\"Ṡ\":\"S\",\n\t\"Ṣ\":\"S\",\n\t\"Ṩ\":\"S\",\n\t\"Ť\":\"T\",\n\t\"Ţ\":\"T\",\n\t\"Ṱ\":\"T\",\n\t\"Ț\":\"T\",\n\t\"Ⱦ\":\"T\",\n\t\"Ṫ\":\"T\",\n\t\"Ṭ\":\"T\",\n\t\"Ƭ\":\"T\",\n\t\"Ṯ\":\"T\",\n\t\"Ʈ\":\"T\",\n\t\"Ŧ\":\"T\",\n\t\"Ɐ\":\"A\",\n\t\"Ꞁ\":\"L\",\n\t\"Ɯ\":\"M\",\n\t\"Ʌ\":\"V\",\n\t\"Ꜩ\":\"TZ\",\n\t\"Ú\":\"U\",\n\t\"Ŭ\":\"U\",\n\t\"Ǔ\":\"U\",\n\t\"Û\":\"U\",\n\t\"Ṷ\":\"U\",\n\t\"Ü\":\"U\",\n\t\"Ǘ\":\"U\",\n\t\"Ǚ\":\"U\",\n\t\"Ǜ\":\"U\",\n\t\"Ǖ\":\"U\",\n\t\"Ṳ\":\"U\",\n\t\"Ụ\":\"U\",\n\t\"Ű\":\"U\",\n\t\"Ȕ\":\"U\",\n\t\"Ù\":\"U\",\n\t\"Ủ\":\"U\",\n\t\"Ư\":\"U\",\n\t\"Ứ\":\"U\",\n\t\"Ự\":\"U\",\n\t\"Ừ\":\"U\",\n\t\"Ử\":\"U\",\n\t\"Ữ\":\"U\",\n\t\"Ȗ\":\"U\",\n\t\"Ū\":\"U\",\n\t\"Ṻ\":\"U\",\n\t\"Ų\":\"U\",\n\t\"Ů\":\"U\",\n\t\"Ũ\":\"U\",\n\t\"Ṹ\":\"U\",\n\t\"Ṵ\":\"U\",\n\t\"Ꝟ\":\"V\",\n\t\"Ṿ\":\"V\",\n\t\"Ʋ\":\"V\",\n\t\"Ṽ\":\"V\",\n\t\"Ꝡ\":\"VY\",\n\t\"Ẃ\":\"W\",\n\t\"Ŵ\":\"W\",\n\t\"Ẅ\":\"W\",\n\t\"Ẇ\":\"W\",\n\t\"Ẉ\":\"W\",\n\t\"Ẁ\":\"W\",\n\t\"Ⱳ\":\"W\",\n\t\"Ẍ\":\"X\",\n\t\"Ẋ\":\"X\",\n\t\"Ý\":\"Y\",\n\t\"Ŷ\":\"Y\",\n\t\"Ÿ\":\"Y\",\n\t\"Ẏ\":\"Y\",\n\t\"Ỵ\":\"Y\",\n\t\"Ỳ\":\"Y\",\n\t\"Ƴ\":\"Y\",\n\t\"Ỷ\":\"Y\",\n\t\"Ỿ\":\"Y\",\n\t\"Ȳ\":\"Y\",\n\t\"Ɏ\":\"Y\",\n\t\"Ỹ\":\"Y\",\n\t\"Ź\":\"Z\",\n\t\"Ž\":\"Z\",\n\t\"Ẑ\":\"Z\",\n\t\"Ⱬ\":\"Z\",\n\t\"Ż\":\"Z\",\n\t\"Ẓ\":\"Z\",\n\t\"Ȥ\":\"Z\",\n\t\"Ẕ\":\"Z\",\n\t\"Ƶ\":\"Z\",\n\t\"IJ\":\"IJ\",\n\t\"Œ\":\"OE\",\n\t\"ᴀ\":\"A\",\n\t\"ᴁ\":\"AE\",\n\t\"ʙ\":\"B\",\n\t\"ᴃ\":\"B\",\n\t\"ᴄ\":\"C\",\n\t\"ᴅ\":\"D\",\n\t\"ᴇ\":\"E\",\n\t\"ꜰ\":\"F\",\n\t\"ɢ\":\"G\",\n\t\"ʛ\":\"G\",\n\t\"ʜ\":\"H\",\n\t\"ɪ\":\"I\",\n\t\"ʁ\":\"R\",\n\t\"ᴊ\":\"J\",\n\t\"ᴋ\":\"K\",\n\t\"ʟ\":\"L\",\n\t\"ᴌ\":\"L\",\n\t\"ᴍ\":\"M\",\n\t\"ɴ\":\"N\",\n\t\"ᴏ\":\"O\",\n\t\"ɶ\":\"OE\",\n\t\"ᴐ\":\"O\",\n\t\"ᴕ\":\"OU\",\n\t\"ᴘ\":\"P\",\n\t\"ʀ\":\"R\",\n\t\"ᴎ\":\"N\",\n\t\"ᴙ\":\"R\",\n\t\"ꜱ\":\"S\",\n\t\"ᴛ\":\"T\",\n\t\"ⱻ\":\"E\",\n\t\"ᴚ\":\"R\",\n\t\"ᴜ\":\"U\",\n\t\"ᴠ\":\"V\",\n\t\"ᴡ\":\"W\",\n\t\"ʏ\":\"Y\",\n\t\"ᴢ\":\"Z\",\n\t\"á\":\"a\",\n\t\"ă\":\"a\",\n\t\"ắ\":\"a\",\n\t\"ặ\":\"a\",\n\t\"ằ\":\"a\",\n\t\"ẳ\":\"a\",\n\t\"ẵ\":\"a\",\n\t\"ǎ\":\"a\",\n\t\"â\":\"a\",\n\t\"ấ\":\"a\",\n\t\"ậ\":\"a\",\n\t\"ầ\":\"a\",\n\t\"ẩ\":\"a\",\n\t\"ẫ\":\"a\",\n\t\"ä\":\"a\",\n\t\"ǟ\":\"a\",\n\t\"ȧ\":\"a\",\n\t\"ǡ\":\"a\",\n\t\"ạ\":\"a\",\n\t\"ȁ\":\"a\",\n\t\"à\":\"a\",\n\t\"ả\":\"a\",\n\t\"ȃ\":\"a\",\n\t\"ā\":\"a\",\n\t\"ą\":\"a\",\n\t\"ᶏ\":\"a\",\n\t\"ẚ\":\"a\",\n\t\"å\":\"a\",\n\t\"ǻ\":\"a\",\n\t\"ḁ\":\"a\",\n\t\"ⱥ\":\"a\",\n\t\"ã\":\"a\",\n\t\"ꜳ\":\"aa\",\n\t\"æ\":\"ae\",\n\t\"ǽ\":\"ae\",\n\t\"ǣ\":\"ae\",\n\t\"ꜵ\":\"ao\",\n\t\"ꜷ\":\"au\",\n\t\"ꜹ\":\"av\",\n\t\"ꜻ\":\"av\",\n\t\"ꜽ\":\"ay\",\n\t\"ḃ\":\"b\",\n\t\"ḅ\":\"b\",\n\t\"ɓ\":\"b\",\n\t\"ḇ\":\"b\",\n\t\"ᵬ\":\"b\",\n\t\"ᶀ\":\"b\",\n\t\"ƀ\":\"b\",\n\t\"ƃ\":\"b\",\n\t\"ɵ\":\"o\",\n\t\"ć\":\"c\",\n\t\"č\":\"c\",\n\t\"ç\":\"c\",\n\t\"ḉ\":\"c\",\n\t\"ĉ\":\"c\",\n\t\"ɕ\":\"c\",\n\t\"ċ\":\"c\",\n\t\"ƈ\":\"c\",\n\t\"ȼ\":\"c\",\n\t\"ď\":\"d\",\n\t\"ḑ\":\"d\",\n\t\"ḓ\":\"d\",\n\t\"ȡ\":\"d\",\n\t\"ḋ\":\"d\",\n\t\"ḍ\":\"d\",\n\t\"ɗ\":\"d\",\n\t\"ᶑ\":\"d\",\n\t\"ḏ\":\"d\",\n\t\"ᵭ\":\"d\",\n\t\"ᶁ\":\"d\",\n\t\"đ\":\"d\",\n\t\"ɖ\":\"d\",\n\t\"ƌ\":\"d\",\n\t\"ı\":\"i\",\n\t\"ȷ\":\"j\",\n\t\"ɟ\":\"j\",\n\t\"ʄ\":\"j\",\n\t\"dz\":\"dz\",\n\t\"dž\":\"dz\",\n\t\"é\":\"e\",\n\t\"ĕ\":\"e\",\n\t\"ě\":\"e\",\n\t\"ȩ\":\"e\",\n\t\"ḝ\":\"e\",\n\t\"ê\":\"e\",\n\t\"ế\":\"e\",\n\t\"ệ\":\"e\",\n\t\"ề\":\"e\",\n\t\"ể\":\"e\",\n\t\"ễ\":\"e\",\n\t\"ḙ\":\"e\",\n\t\"ë\":\"e\",\n\t\"ė\":\"e\",\n\t\"ẹ\":\"e\",\n\t\"ȅ\":\"e\",\n\t\"è\":\"e\",\n\t\"ẻ\":\"e\",\n\t\"ȇ\":\"e\",\n\t\"ē\":\"e\",\n\t\"ḗ\":\"e\",\n\t\"ḕ\":\"e\",\n\t\"ⱸ\":\"e\",\n\t\"ę\":\"e\",\n\t\"ᶒ\":\"e\",\n\t\"ɇ\":\"e\",\n\t\"ẽ\":\"e\",\n\t\"ḛ\":\"e\",\n\t\"ꝫ\":\"et\",\n\t\"ḟ\":\"f\",\n\t\"ƒ\":\"f\",\n\t\"ᵮ\":\"f\",\n\t\"ᶂ\":\"f\",\n\t\"ǵ\":\"g\",\n\t\"ğ\":\"g\",\n\t\"ǧ\":\"g\",\n\t\"ģ\":\"g\",\n\t\"ĝ\":\"g\",\n\t\"ġ\":\"g\",\n\t\"ɠ\":\"g\",\n\t\"ḡ\":\"g\",\n\t\"ᶃ\":\"g\",\n\t\"ǥ\":\"g\",\n\t\"ḫ\":\"h\",\n\t\"ȟ\":\"h\",\n\t\"ḩ\":\"h\",\n\t\"ĥ\":\"h\",\n\t\"ⱨ\":\"h\",\n\t\"ḧ\":\"h\",\n\t\"ḣ\":\"h\",\n\t\"ḥ\":\"h\",\n\t\"ɦ\":\"h\",\n\t\"ẖ\":\"h\",\n\t\"ħ\":\"h\",\n\t\"ƕ\":\"hv\",\n\t\"í\":\"i\",\n\t\"ĭ\":\"i\",\n\t\"ǐ\":\"i\",\n\t\"î\":\"i\",\n\t\"ï\":\"i\",\n\t\"ḯ\":\"i\",\n\t\"ị\":\"i\",\n\t\"ȉ\":\"i\",\n\t\"ì\":\"i\",\n\t\"ỉ\":\"i\",\n\t\"ȋ\":\"i\",\n\t\"ī\":\"i\",\n\t\"į\":\"i\",\n\t\"ᶖ\":\"i\",\n\t\"ɨ\":\"i\",\n\t\"ĩ\":\"i\",\n\t\"ḭ\":\"i\",\n\t\"ꝺ\":\"d\",\n\t\"ꝼ\":\"f\",\n\t\"ᵹ\":\"g\",\n\t\"ꞃ\":\"r\",\n\t\"ꞅ\":\"s\",\n\t\"ꞇ\":\"t\",\n\t\"ꝭ\":\"is\",\n\t\"ǰ\":\"j\",\n\t\"ĵ\":\"j\",\n\t\"ʝ\":\"j\",\n\t\"ɉ\":\"j\",\n\t\"ḱ\":\"k\",\n\t\"ǩ\":\"k\",\n\t\"ķ\":\"k\",\n\t\"ⱪ\":\"k\",\n\t\"ꝃ\":\"k\",\n\t\"ḳ\":\"k\",\n\t\"ƙ\":\"k\",\n\t\"ḵ\":\"k\",\n\t\"ᶄ\":\"k\",\n\t\"ꝁ\":\"k\",\n\t\"ꝅ\":\"k\",\n\t\"ĺ\":\"l\",\n\t\"ƚ\":\"l\",\n\t\"ɬ\":\"l\",\n\t\"ľ\":\"l\",\n\t\"ļ\":\"l\",\n\t\"ḽ\":\"l\",\n\t\"ȴ\":\"l\",\n\t\"ḷ\":\"l\",\n\t\"ḹ\":\"l\",\n\t\"ⱡ\":\"l\",\n\t\"ꝉ\":\"l\",\n\t\"ḻ\":\"l\",\n\t\"ŀ\":\"l\",\n\t\"ɫ\":\"l\",\n\t\"ᶅ\":\"l\",\n\t\"ɭ\":\"l\",\n\t\"ł\":\"l\",\n\t\"lj\":\"lj\",\n\t\"ſ\":\"s\",\n\t\"ẜ\":\"s\",\n\t\"ẛ\":\"s\",\n\t\"ẝ\":\"s\",\n\t\"ḿ\":\"m\",\n\t\"ṁ\":\"m\",\n\t\"ṃ\":\"m\",\n\t\"ɱ\":\"m\",\n\t\"ᵯ\":\"m\",\n\t\"ᶆ\":\"m\",\n\t\"ń\":\"n\",\n\t\"ň\":\"n\",\n\t\"ņ\":\"n\",\n\t\"ṋ\":\"n\",\n\t\"ȵ\":\"n\",\n\t\"ṅ\":\"n\",\n\t\"ṇ\":\"n\",\n\t\"ǹ\":\"n\",\n\t\"ɲ\":\"n\",\n\t\"ṉ\":\"n\",\n\t\"ƞ\":\"n\",\n\t\"ᵰ\":\"n\",\n\t\"ᶇ\":\"n\",\n\t\"ɳ\":\"n\",\n\t\"ñ\":\"n\",\n\t\"nj\":\"nj\",\n\t\"ó\":\"o\",\n\t\"ŏ\":\"o\",\n\t\"ǒ\":\"o\",\n\t\"ô\":\"o\",\n\t\"ố\":\"o\",\n\t\"ộ\":\"o\",\n\t\"ồ\":\"o\",\n\t\"ổ\":\"o\",\n\t\"ỗ\":\"o\",\n\t\"ö\":\"o\",\n\t\"ȫ\":\"o\",\n\t\"ȯ\":\"o\",\n\t\"ȱ\":\"o\",\n\t\"ọ\":\"o\",\n\t\"ő\":\"o\",\n\t\"ȍ\":\"o\",\n\t\"ò\":\"o\",\n\t\"ỏ\":\"o\",\n\t\"ơ\":\"o\",\n\t\"ớ\":\"o\",\n\t\"ợ\":\"o\",\n\t\"ờ\":\"o\",\n\t\"ở\":\"o\",\n\t\"ỡ\":\"o\",\n\t\"ȏ\":\"o\",\n\t\"ꝋ\":\"o\",\n\t\"ꝍ\":\"o\",\n\t\"ⱺ\":\"o\",\n\t\"ō\":\"o\",\n\t\"ṓ\":\"o\",\n\t\"ṑ\":\"o\",\n\t\"ǫ\":\"o\",\n\t\"ǭ\":\"o\",\n\t\"ø\":\"o\",\n\t\"ǿ\":\"o\",\n\t\"õ\":\"o\",\n\t\"ṍ\":\"o\",\n\t\"ṏ\":\"o\",\n\t\"ȭ\":\"o\",\n\t\"ƣ\":\"oi\",\n\t\"ꝏ\":\"oo\",\n\t\"ɛ\":\"e\",\n\t\"ᶓ\":\"e\",\n\t\"ɔ\":\"o\",\n\t\"ᶗ\":\"o\",\n\t\"ȣ\":\"ou\",\n\t\"ṕ\":\"p\",\n\t\"ṗ\":\"p\",\n\t\"ꝓ\":\"p\",\n\t\"ƥ\":\"p\",\n\t\"ᵱ\":\"p\",\n\t\"ᶈ\":\"p\",\n\t\"ꝕ\":\"p\",\n\t\"ᵽ\":\"p\",\n\t\"ꝑ\":\"p\",\n\t\"ꝙ\":\"q\",\n\t\"ʠ\":\"q\",\n\t\"ɋ\":\"q\",\n\t\"ꝗ\":\"q\",\n\t\"ŕ\":\"r\",\n\t\"ř\":\"r\",\n\t\"ŗ\":\"r\",\n\t\"ṙ\":\"r\",\n\t\"ṛ\":\"r\",\n\t\"ṝ\":\"r\",\n\t\"ȑ\":\"r\",\n\t\"ɾ\":\"r\",\n\t\"ᵳ\":\"r\",\n\t\"ȓ\":\"r\",\n\t\"ṟ\":\"r\",\n\t\"ɼ\":\"r\",\n\t\"ᵲ\":\"r\",\n\t\"ᶉ\":\"r\",\n\t\"ɍ\":\"r\",\n\t\"ɽ\":\"r\",\n\t\"ↄ\":\"c\",\n\t\"ꜿ\":\"c\",\n\t\"ɘ\":\"e\",\n\t\"ɿ\":\"r\",\n\t\"ś\":\"s\",\n\t\"ṥ\":\"s\",\n\t\"š\":\"s\",\n\t\"ṧ\":\"s\",\n\t\"ş\":\"s\",\n\t\"ŝ\":\"s\",\n\t\"ș\":\"s\",\n\t\"ṡ\":\"s\",\n\t\"ṣ\":\"s\",\n\t\"ṩ\":\"s\",\n\t\"ʂ\":\"s\",\n\t\"ᵴ\":\"s\",\n\t\"ᶊ\":\"s\",\n\t\"ȿ\":\"s\",\n\t\"ɡ\":\"g\",\n\t\"ᴑ\":\"o\",\n\t\"ᴓ\":\"o\",\n\t\"ᴝ\":\"u\",\n\t\"ť\":\"t\",\n\t\"ţ\":\"t\",\n\t\"ṱ\":\"t\",\n\t\"ț\":\"t\",\n\t\"ȶ\":\"t\",\n\t\"ẗ\":\"t\",\n\t\"ⱦ\":\"t\",\n\t\"ṫ\":\"t\",\n\t\"ṭ\":\"t\",\n\t\"ƭ\":\"t\",\n\t\"ṯ\":\"t\",\n\t\"ᵵ\":\"t\",\n\t\"ƫ\":\"t\",\n\t\"ʈ\":\"t\",\n\t\"ŧ\":\"t\",\n\t\"ᵺ\":\"th\",\n\t\"ɐ\":\"a\",\n\t\"ᴂ\":\"ae\",\n\t\"ǝ\":\"e\",\n\t\"ᵷ\":\"g\",\n\t\"ɥ\":\"h\",\n\t\"ʮ\":\"h\",\n\t\"ʯ\":\"h\",\n\t\"ᴉ\":\"i\",\n\t\"ʞ\":\"k\",\n\t\"ꞁ\":\"l\",\n\t\"ɯ\":\"m\",\n\t\"ɰ\":\"m\",\n\t\"ᴔ\":\"oe\",\n\t\"ɹ\":\"r\",\n\t\"ɻ\":\"r\",\n\t\"ɺ\":\"r\",\n\t\"ⱹ\":\"r\",\n\t\"ʇ\":\"t\",\n\t\"ʌ\":\"v\",\n\t\"ʍ\":\"w\",\n\t\"ʎ\":\"y\",\n\t\"ꜩ\":\"tz\",\n\t\"ú\":\"u\",\n\t\"ŭ\":\"u\",\n\t\"ǔ\":\"u\",\n\t\"û\":\"u\",\n\t\"ṷ\":\"u\",\n\t\"ü\":\"u\",\n\t\"ǘ\":\"u\",\n\t\"ǚ\":\"u\",\n\t\"ǜ\":\"u\",\n\t\"ǖ\":\"u\",\n\t\"ṳ\":\"u\",\n\t\"ụ\":\"u\",\n\t\"ű\":\"u\",\n\t\"ȕ\":\"u\",\n\t\"ù\":\"u\",\n\t\"ủ\":\"u\",\n\t\"ư\":\"u\",\n\t\"ứ\":\"u\",\n\t\"ự\":\"u\",\n\t\"ừ\":\"u\",\n\t\"ử\":\"u\",\n\t\"ữ\":\"u\",\n\t\"ȗ\":\"u\",\n\t\"ū\":\"u\",\n\t\"ṻ\":\"u\",\n\t\"ų\":\"u\",\n\t\"ᶙ\":\"u\",\n\t\"ů\":\"u\",\n\t\"ũ\":\"u\",\n\t\"ṹ\":\"u\",\n\t\"ṵ\":\"u\",\n\t\"ᵫ\":\"ue\",\n\t\"ꝸ\":\"um\",\n\t\"ⱴ\":\"v\",\n\t\"ꝟ\":\"v\",\n\t\"ṿ\":\"v\",\n\t\"ʋ\":\"v\",\n\t\"ᶌ\":\"v\",\n\t\"ⱱ\":\"v\",\n\t\"ṽ\":\"v\",\n\t\"ꝡ\":\"vy\",\n\t\"ẃ\":\"w\",\n\t\"ŵ\":\"w\",\n\t\"ẅ\":\"w\",\n\t\"ẇ\":\"w\",\n\t\"ẉ\":\"w\",\n\t\"ẁ\":\"w\",\n\t\"ⱳ\":\"w\",\n\t\"ẘ\":\"w\",\n\t\"ẍ\":\"x\",\n\t\"ẋ\":\"x\",\n\t\"ᶍ\":\"x\",\n\t\"ý\":\"y\",\n\t\"ŷ\":\"y\",\n\t\"ÿ\":\"y\",\n\t\"ẏ\":\"y\",\n\t\"ỵ\":\"y\",\n\t\"ỳ\":\"y\",\n\t\"ƴ\":\"y\",\n\t\"ỷ\":\"y\",\n\t\"ỿ\":\"y\",\n\t\"ȳ\":\"y\",\n\t\"ẙ\":\"y\",\n\t\"ɏ\":\"y\",\n\t\"ỹ\":\"y\",\n\t\"ź\":\"z\",\n\t\"ž\":\"z\",\n\t\"ẑ\":\"z\",\n\t\"ʑ\":\"z\",\n\t\"ⱬ\":\"z\",\n\t\"ż\":\"z\",\n\t\"ẓ\":\"z\",\n\t\"ȥ\":\"z\",\n\t\"ẕ\":\"z\",\n\t\"ᵶ\":\"z\",\n\t\"ᶎ\":\"z\",\n\t\"ʐ\":\"z\",\n\t\"ƶ\":\"z\",\n\t\"ɀ\":\"z\",\n\t\"ff\":\"ff\",\n\t\"ffi\":\"ffi\",\n\t\"ffl\":\"ffl\",\n\t\"fi\":\"fi\",\n\t\"fl\":\"fl\",\n\t\"ij\":\"ij\",\n\t\"œ\":\"oe\",\n\t\"st\":\"st\",\n\t\"ₐ\":\"a\",\n\t\"ₑ\":\"e\",\n\t\"ᵢ\":\"i\",\n\t\"ⱼ\":\"j\",\n\t\"ₒ\":\"o\",\n\t\"ᵣ\":\"r\",\n\t\"ᵤ\":\"u\",\n\t\"ᵥ\":\"v\",\n\t\"ₓ\":\"x\",\n\t\"Ё\":\"YO\",\n\t\"Й\":\"I\",\n\t\"Ц\":\"TS\",\n\t\"У\":\"U\",\n\t\"К\":\"K\",\n\t\"Е\":\"E\",\n\t\"Н\":\"N\",\n\t\"Г\":\"G\",\n\t\"Ш\":\"SH\",\n\t\"Щ\":\"SCH\",\n\t\"З\":\"Z\",\n\t\"Х\":\"H\",\n\t\"Ъ\":\"'\",\n\t\"ё\":\"yo\",\n\t\"й\":\"i\",\n\t\"ц\":\"ts\",\n\t\"у\":\"u\",\n\t\"к\":\"k\",\n\t\"е\":\"e\",\n\t\"н\":\"n\",\n\t\"г\":\"g\",\n\t\"ш\":\"sh\",\n\t\"щ\":\"sch\",\n\t\"з\":\"z\",\n\t\"х\":\"h\",\n\t\"ъ\":\"'\",\n\t\"Ф\":\"F\",\n\t\"Ы\":\"I\",\n\t\"В\":\"V\",\n\t\"А\":\"a\",\n\t\"П\":\"P\",\n\t\"Р\":\"R\",\n\t\"О\":\"O\",\n\t\"Л\":\"L\",\n\t\"Д\":\"D\",\n\t\"Ж\":\"ZH\",\n\t\"Э\":\"E\",\n\t\"ф\":\"f\",\n\t\"ы\":\"i\",\n\t\"в\":\"v\",\n\t\"а\":\"a\",\n\t\"п\":\"p\",\n\t\"р\":\"r\",\n\t\"о\":\"o\",\n\t\"л\":\"l\",\n\t\"д\":\"d\",\n\t\"ж\":\"zh\",\n\t\"э\":\"e\",\n\t\"Я\":\"Ya\",\n\t\"Ч\":\"CH\",\n\t\"С\":\"S\",\n\t\"М\":\"M\",\n\t\"И\":\"I\",\n\t\"Т\":\"T\",\n\t\"Ь\":\"'\",\n\t\"Б\":\"B\",\n\t\"Ю\":\"YU\",\n\t\"я\":\"ya\",\n\t\"ч\":\"ch\",\n\t\"с\":\"s\",\n\t\"м\":\"m\",\n\t\"и\":\"i\",\n\t\"т\":\"t\",\n\t\"ь\":\"'\",\n\t\"б\":\"b\",\n\t\"ю\":\"yu\"\n};\n\nexports.transliterate = function(str) {\n\treturn str.replace(/[^A-Za-z0-9\\[\\] ]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || ch\n\t});\n};\n\nexports.transliterateToSafeASCII = function(str) {\n\treturn str.replace(/[^\\x00-\\x7F]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || \"\"\n\t});\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/utils/utils.js": {
            "title": "$:/core/modules/utils/utils.js",
            "text": "/*\\\ntitle: $:/core/modules/utils/utils.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar base64utf8 = require(\"$:/core/modules/utils/base64-utf8/base64-utf8.module.js\");\n\n/*\nDisplay a message, in colour if we're on a terminal\n*/\nexports.log = function(text,colour) {\n\tconsole.log($tw.node ? exports.terminalColour(colour) + text + exports.terminalColour() : text);\n};\n\nexports.terminalColour = function(colour) {\n\tif(!$tw.browser && $tw.node && process.stdout.isTTY) {\n\t\tif(colour) {\n\t\t\tvar code = exports.terminalColourLookup[colour];\n\t\t\tif(code) {\n\t\t\t\treturn \"\\x1b[\" + code + \"m\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"\\x1b[0m\"; // Cancel colour\n\t\t}\n\t}\n\treturn \"\";\n};\n\nexports.terminalColourLookup = {\n\t\"black\": \"0;30\",\n\t\"red\": \"0;31\",\n\t\"green\": \"0;32\",\n\t\"brown/orange\": \"0;33\",\n\t\"blue\": \"0;34\",\n\t\"purple\": \"0;35\",\n\t\"cyan\": \"0;36\",\n\t\"light gray\": \"0;37\"\n};\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\texports.log(text,\"brown/orange\");\n};\n\n/*\nLog a table of name: value pairs\n*/\nexports.logTable = function(data) {\n\tif(console.table) {\n\t\tconsole.table(data);\n\t} else {\n\t\t$tw.utils.each(data,function(value,name) {\n\t\t\tconsole.log(name + \": \" + value);\n\t\t});\n\t}\n}\n\n/*\nReturn the integer represented by the str (string).\nReturn the dflt (default) parameter if str is not a base-10 number.\n*/\nexports.getInt = function(str,deflt) {\n\tvar i = parseInt(str,10);\n\treturn isNaN(i) ? deflt : i;\n}\n\n/*\nRepeatedly replaces a substring within a string. Like String.prototype.replace, but without any of the default special handling of $ sequences in the replace string\n*/\nexports.replaceString = function(text,search,replace) {\n\treturn text.replace(search,function() {\n\t\treturn replace;\n\t});\n};\n\n/*\nRepeats a string\n*/\nexports.repeat = function(str,count) {\n\tvar result = \"\";\n\tfor(var t=0;t<count;t++) {\n\t\tresult += str;\n\t}\n\treturn result;\n};\n\n/*\nTrim whitespace from the start and end of a string\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\n*/\nexports.trim = function(str) {\n\tif(typeof str === \"string\") {\n\t\treturn str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t} else {\n\t\treturn str;\n\t}\n};\n\nexports.trimPrefix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/^\\s\\s*/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('^(' + unwanted + ')+');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\nexports.trimSuffix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/\\s\\s*$/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('(' + unwanted + ')+$');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nConvert a string to sentence case (ie capitalise first letter)\n*/\nexports.toSentenceCase = function(str) {\n\treturn (str || \"\").replace(/^\\S/, function(c) {return c.toUpperCase();});\n}\n\n/*\nConvert a string to title case (ie capitalise each initial letter)\n*/\nexports.toTitleCase = function(str) {\n\treturn (str || \"\").replace(/(^|\\s)\\S/g, function(c) {return c.toUpperCase();});\n}\n\t\n/*\nFind the line break preceding a given position in a string\nReturns position immediately after that line break, or the start of the string\n*/\nexports.findPrecedingLineBreak = function(text,pos) {\n\tvar result = text.lastIndexOf(\"\\n\",pos - 1);\n\tif(result === -1) {\n\t\tresult = 0;\n\t} else {\n\t\tresult++;\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nFind the line break following a given position in a string\n*/\nexports.findFollowingLineBreak = function(text,pos) {\n\t// Cut to just past the following line break, or to the end of the text\n\tvar result = text.indexOf(\"\\n\",pos);\n\tif(result === -1) {\n\t\tresult = text.length;\n\t} else {\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nReturn the number of keys in an object\n*/\nexports.count = function(object) {\n\treturn Object.keys(object || {}).length;\n};\n\n/*\nDetermine whether an array-item is an object-property\n*/\nexports.hopArray = function(object,array) {\n\tfor(var i=0; i<array.length; i++) {\n\t\tif($tw.utils.hop(object,array[i])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nRemove entries from an array\n\tarray: array to modify\n\tvalue: a single value to remove, or an array of values to remove\n*/\nexports.removeArrayEntries = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\tp = array.indexOf(value[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tarray.splice(p,1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t}\n};\n\n/*\nCheck whether any members of a hashmap are present in another hashmap\n*/\nexports.checkDependencies = function(dependencies,changes) {\n\tvar hit = false;\n\t$tw.utils.each(changes,function(change,title) {\n\t\tif($tw.utils.hop(dependencies,title)) {\n\t\t\thit = true;\n\t\t}\n\t});\n\treturn hit;\n};\n\nexports.extend = function(object /* [, src] */) {\n\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\n\t\tif(source) {\n\t\t\tfor(var property in source) {\n\t\t\t\tobject[property] = source[property];\n\t\t\t}\n\t\t}\n\t});\n\treturn object;\n};\n\nexports.deepCopy = function(object) {\n\tvar result,t;\n\tif($tw.utils.isArray(object)) {\n\t\t// Copy arrays\n\t\tresult = object.slice(0);\n\t} else if(typeof object === \"object\") {\n\t\tresult = {};\n\t\tfor(t in object) {\n\t\t\tif(object[t] !== undefined) {\n\t\t\t\tresult[t] = $tw.utils.deepCopy(object[t]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = object;\n\t}\n\treturn result;\n};\n\nexports.extendDeepCopy = function(object,extendedProperties) {\n\tvar result = $tw.utils.deepCopy(object),t;\n\tfor(t in extendedProperties) {\n\t\tif(extendedProperties[t] !== undefined) {\n\t\t\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\n\t\t}\n\t}\n\treturn result;\n};\n\nexports.deepFreeze = function deepFreeze(object) {\n\tvar property, key;\n\tif(object) {\n\t\tObject.freeze(object);\n\t\tfor(key in object) {\n\t\t\tproperty = object[key];\n\t\t\tif($tw.utils.hop(object,key) && (typeof property === \"object\") && !Object.isFrozen(property)) {\n\t\t\t\tdeepFreeze(property);\n\t\t\t}\n\t\t}\n\t}\n};\n\nexports.slowInSlowOut = function(t) {\n\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\n};\n\nexports.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^0hh12/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getHours12(date));\n\t\t\t}],\n\t\t\t[/^wYYYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date),4);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear(),4);\n\t\t\t}],\n\t\t\t[/^aYYYY/, function() {\n\t\t\t\treturn $tw.utils.pad(Math.abs(date.getFullYear()),4);\n\t\t\t}],\n\t\t\t[/^\\{era:([^,\\|}]*)\\|([^}\\|]*)\\|([^}]*)\\}/, function(match) {\n\t\t\t\tvar year = date.getFullYear();\n\t\t\t\treturn year === 0 ? match[2] : (year < 0 ? match[1] : match[3]);\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^0XXX/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMilliseconds(),3);\n\t\t\t}],\n\t\t\t[/^0DD/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getDate());\n\t\t\t}],\n\t\t\t[/^0MM/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMonth()+1);\n\t\t\t}],\n\t\t\t[/^0WW/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getWeek(date));\n\t\t\t}],\n\t\t\t[/^ddd/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^mmm/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^DDD/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^MMM/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^TZD/, function() {\n\t\t\t\tvar tz = date.getTimezoneOffset(),\n\t\t\t\tatz = Math.abs(tz);\n\t\t\t\treturn (tz < 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\n\t\t\t}],\n\t\t\t[/^wYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\n\t\t\t}],\n\t\t\t[/^[ap]m/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toLowerCase();\n\t\t\t}],\n\t\t\t[/^hh/, function() {\n\t\t\t\treturn date.getHours();\n\t\t\t}],\n\t\t\t[/^mm/, function() {\n\t\t\t\treturn date.getMinutes();\n\t\t\t}],\n\t\t\t[/^ss/, function() {\n\t\t\t\treturn date.getSeconds();\n\t\t\t}],\n\t\t\t[/^XXX/, function() {\n\t\t\t\treturn date.getMilliseconds();\n\t\t\t}],\n\t\t\t[/^[AP]M/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toUpperCase();\n\t\t\t}],\n\t\t\t[/^DD/, function() {\n\t\t\t\treturn date.getDate();\n\t\t\t}],\n\t\t\t[/^MM/, function() {\n\t\t\t\treturn date.getMonth() + 1;\n\t\t\t}],\n\t\t\t[/^WW/, function() {\n\t\t\t\treturn $tw.utils.getWeek(date);\n\t\t\t}],\n\t\t\t[/^YY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear() - 2000);\n\t\t\t}]\n\t\t];\n\t// If the user wants everything in UTC, shift the datestamp\n\t// Optimize for format string that essentially means\n\t// 'return raw UTC (tiddlywiki style) date string.'\n\tif(t.indexOf(\"[UTC]\") == 0 ) {\n\t\tif(t == \"[UTC]YYYY0MM0DD0hh0mm0ssXXX\")\n\t\t\treturn $tw.utils.stringifyDate(new Date());\n\t\tvar offset = date.getTimezoneOffset() ; // in minutes\n\t\tdate = new Date(date.getTime()+offset*60*1000) ;\n\t\tt = t.substr(5) ;\n\t}\n\twhile(t.length){\n\t\tvar matchString = \"\";\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tmatchString = m[1].call(null,match);\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(matchString) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.getAmPm = function(date) {\n\treturn $tw.language.getString(\"Date/Period/\" + (date.getHours() >= 12 ? \"pm\" : \"am\"));\n};\n\nexports.getDaySuffix = function(date) {\n\treturn $tw.language.getString(\"Date/DaySuffix/\" + date.getDate());\n};\n\nexports.getWeek = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\n\tvar x = new Date(dt.getFullYear(),0,1);\n\tvar n = Math.floor((dt.getTime() - x.getTime()) / 86400000);\n\treturn Math.floor(n / 7) + 1;\n};\n\nexports.getYearForWeekNo = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\n\treturn dt.getFullYear();\n};\n\nexports.getHours12 = function(date) {\n\tvar h = date.getHours();\n\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\n};\n\n/*\nConvert a date delta in milliseconds into a string representation of \"23 seconds ago\", \"27 minutes ago\" etc.\n\tdelta: delta in milliseconds\nReturns an object with these members:\n\tdescription: string describing the delta period\n\tupdatePeriod: time in millisecond until the string will be inaccurate\n*/\nexports.getRelativeDate = function(delta) {\n\tvar futurep = false;\n\tif(delta < 0) {\n\t\tdelta = -1 * delta;\n\t\tfuturep = true;\n\t}\n\tvar units = [\n\t\t{name: \"Years\",   duration:      365 * 24 * 60 * 60 * 1000},\n\t\t{name: \"Months\",  duration: (365/12) * 24 * 60 * 60 * 1000},\n\t\t{name: \"Days\",    duration:            24 * 60 * 60 * 1000},\n\t\t{name: \"Hours\",   duration:                 60 * 60 * 1000},\n\t\t{name: \"Minutes\", duration:                      60 * 1000},\n\t\t{name: \"Seconds\", duration:                           1000}\n\t];\n\tfor(var t=0; t<units.length; t++) {\n\t\tvar result = Math.floor(delta / units[t].duration);\n\t\tif(result >= 2) {\n\t\t\treturn {\n\t\t\t\tdelta: delta,\n\t\t\t\tdescription: $tw.language.getString(\n\t\t\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/\" + units[t].name,\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{period: result.toString()}\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\tupdatePeriod: units[t].duration\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tdelta: delta,\n\t\tdescription: $tw.language.getString(\n\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/Second\",\n\t\t\t{variables:\n\t\t\t\t{period: \"1\"}\n\t\t\t}\n\t\t),\n\t\tupdatePeriod: 1000\n\t};\n};\n\n// Convert & to \"&amp;\", < to \"&lt;\", > to \"&gt;\", \" to \"&quot;\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&amp;\").replace(/</mg,\"&lt;\").replace(/>/mg,\"&gt;\").replace(/\\\"/mg,\"&quot;\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar converter = String.fromCodePoint || String.fromCharCode,\n\t\te = s.substr(1,s.length-2), // Strip the & and the ;\n\t\tc;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\tc = parseInt(e.substr(2),16);\n\t\t} else {\n\t\t\tc = parseInt(e.substr(1),10);\n\t\t}\n\t\tif(isNaN(c)) {\n\t\t\treturn s;\n\t\t} else {\n\t\t\treturn converter(c);\n\t\t}\n\t} else {\n\t\tc = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn converter(c);\n\t\t} else {\n\t\t\treturn s; // Couldn't convert it as an entity, just return it raw\n\t\t}\n\t}\n};\n\nexports.unescapeLineBreaks = function(s) {\n\treturn s.replace(/\\\\n/mg,\"\\n\").replace(/\\\\b/mg,\" \").replace(/\\\\s/mg,\"\\\\\").replace(/\\r/mg,\"\");\n};\n\n/*\n * Returns an escape sequence for given character. Uses \\x for characters <=\n * 0xFF to save space, \\u for the rest.\n *\n * The code needs to be in sync with th code template in the compilation\n * function for \"action\" nodes.\n */\n// Copied from peg.js, thanks to David Majda\nexports.escape = function(ch) {\n\tvar charCode = ch.charCodeAt(0);\n\tif(charCode <= 0xFF) {\n\t\treturn '\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\n\t} else {\n\t\treturn '\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\n\t}\n};\n\n// Turns a string into a legal JavaScript string\n// Copied from peg.js, thanks to David Majda\nexports.stringify = function(s, rawUnicode) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape all non-ASCII characters.\n\t*/\n\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\')            // backslash\n\t\t.replace(/\"/g, '\\\\\"')              // double quote character\n\t\t.replace(/'/g, \"\\\\'\")              // single quote character\n\t\t.replace(/\\r/g, '\\\\r')             // carriage return\n\t\t.replace(/\\n/g, '\\\\n')             // line feed\n\t\t.replace(regex, exports.escape);   // non-ASCII characters\n};\n\n// Turns a string into a legal JSON string\n// Derived from peg.js, thanks to David Majda\nexports.jsonStringify = function(s, rawUnicode) {\n\t// See http://www.json.org/\n\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\')            // backslash\n\t\t.replace(/\"/g, '\\\\\"')              // double quote character\n\t\t.replace(/\\r/g, '\\\\r')             // carriage return\n\t\t.replace(/\\n/g, '\\\\n')             // line feed\n\t\t.replace(/\\x08/g, '\\\\b')           // backspace\n\t\t.replace(/\\x0c/g, '\\\\f')           // formfeed\n\t\t.replace(/\\t/g, '\\\\t')             // tab\n\t\t.replace(regex,function(s) {\n\t\t\treturn '\\\\u' + $tw.utils.pad(s.charCodeAt(0).toString(16).toUpperCase(),4);\n\t\t}); // non-ASCII characters\n};\n\n/*\nEscape the RegExp special characters with a preceding backslash\n*/\nexports.escapeRegExp = function(s) {\n    return s.replace(/[\\-\\/\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\[\\]\\{\\}]/g, '\\\\$&');\n};\n\n// Checks whether a link target is external, i.e. not a tiddler title\nexports.isLinkExternal = function(to) {\n\tvar externalRegExp = /^(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\n\nexports.nextTick = function(fn) {\n/*global window: false */\n\tif(typeof process === \"undefined\") {\n\t\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\n\t\twindow.setTimeout(fn,4);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\tname = name.toLowerCase().trim();\n\tvar fieldValidatorRegEx = /^[a-z0-9\\-\\._]+$/mg;\n\treturn fieldValidatorRegEx.test(name);\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10) || 0;\n};\n\n/*\nHash a string to a number\nDerived from http://stackoverflow.com/a/15710692\n*/\nexports.hashString = function(str) {\n\treturn str.split(\"\").reduce(function(a,b) {\n\t\ta = ((a << 5) - a) + b.charCodeAt(0);\n\t\treturn a & a;\n\t},0);\n};\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64) {\n\treturn base64utf8.base64.decode.call(base64utf8,string64);\n};\n\n/*\nEncode a string to base64\n*/\nexports.base64Encode = function(string64) {\n\treturn base64utf8.base64.encode.call(base64utf8,string64);\n};\n\n/*\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\n*/\nexports.makeTiddlerDictionary = function(data) {\n\tvar output = [];\n\tfor(var name in data) {\n\t\toutput.push(name + \": \" + data[name]);\n\t}\n\treturn output.join(\"\\n\");\n};\n\n/*\nHigh resolution microsecond timer for profiling\n*/\nexports.timer = function(base) {\n\tvar m;\n\tif($tw.node) {\n\t\tvar r = process.hrtime();\n\t\tm =  r[0] * 1e3 + (r[1] / 1e6);\n\t} else if(window.performance) {\n\t\tm = performance.now();\n\t} else {\n\t\tm = Date.now();\n\t}\n\tif(typeof base !== \"undefined\") {\n\t\tm = m - base;\n\t}\n\treturn m;\n};\n\n/*\nConvert text and content type to a data URI\n*/\nexports.makeDataUri = function(text,type,_canonical_uri) {\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\"text/plain\"],\n\t\tisBase64 = typeInfo.encoding === \"base64\",\n\t\tparts = [];\n\tif(_canonical_uri) {\n\t\tparts.push(_canonical_uri);\n\t} else {\n\t\tparts.push(\"data:\");\n\t\tparts.push(type);\n\t\tparts.push(isBase64 ? \";base64\" : \"\");\n\t\tparts.push(\",\");\n\t\tparts.push(isBase64 ? text : encodeURIComponent(text));\t\t\n\t}\n\treturn parts.join(\"\");\n};\n\n/*\nUseful for finding out the fully escaped CSS selector equivalent to a given tag. For example:\n\n$tw.utils.tagToCssSelector(\"$:/tags/Stylesheet\") --> tc-tagged-\\%24\\%3A\\%2Ftags\\%2FStylesheet\n*/\nexports.tagToCssSelector = function(tagName) {\n\treturn \"tc-tagged-\" + encodeURIComponent(tagName).replace(/[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^`{\\|}~,]/mg,function(c) {\n\t\treturn \"\\\\\" + c;\n\t});\n};\n\n/*\nIE does not have sign function\n*/\nexports.sign = Math.sign || function(x) {\n\tx = +x; // convert to a number\n\tif (x === 0 || isNaN(x)) {\n\t\treturn x;\n\t}\n\treturn x > 0 ? 1 : -1;\n};\n\n/*\nIE does not have an endsWith function\n*/\nexports.strEndsWith = function(str,ending,position) {\n\tif(str.endsWith) {\n\t\treturn str.endsWith(ending,position);\n\t} else {\n\t\tif (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > str.length) {\n\t\t\tposition = str.length;\n\t\t}\n\t\tposition -= ending.length;\n\t\tvar lastIndex = str.indexOf(ending, position);\n\t\treturn lastIndex !== -1 && lastIndex === position;\n\t}\n};\n\n/*\nReturn system information useful for debugging\n*/\nexports.getSystemInfo = function(str,ending,position) {\n\tvar results = [],\n\t\tsave = function(desc,value) {\n\t\t\tresults.push(desc + \": \" + value);\n\t\t};\n\tif($tw.browser) {\n\t\tsave(\"User Agent\",navigator.userAgent);\n\t\tsave(\"Online Status\",window.navigator.onLine);\n\t}\n\tif($tw.node) {\n\t\tsave(\"Node Version\",process.version);\n\t}\n\treturn results.join(\"\\n\");\n};\n\nexports.parseNumber = function(str) {\n\treturn parseFloat(str) || 0;\n};\n\nexports.parseInt = function(str) {\n\treturn parseInt(str,10) || 0;\n};\n\nexports.stringifyNumber = function(num) {\n\treturn num + \"\";\n};\n\nexports.makeCompareFunction = function(type,options) {\n\toptions = options || {};\n\tvar gt = options.invert ? -1 : +1,\n\t\tlt = options.invert ? +1 : -1,\n\t\tcompare = function(a,b) {\n\t\t\tif(a > b) {\n\t\t\t\treturn gt ;\n\t\t\t} else if(a < b) {\n\t\t\t\treturn lt;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t},\n\t\ttypes = {\n\t\t\t\"number\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b));\n\t\t\t},\n\t\t\t\"integer\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseInt(a),$tw.utils.parseInt(b));\n\t\t\t},\n\t\t\t\"string\": function(a,b) {\n\t\t\t\treturn compare(\"\" + a,\"\" +b);\n\t\t\t},\n\t\t\t\"date\": function(a,b) {\n\t\t\t\tvar dateA = $tw.utils.parseDate(a),\n\t\t\t\t\tdateB = $tw.utils.parseDate(b);\n\t\t\t\tif(!isFinite(dateA)) {\n\t\t\t\t\tdateA = new Date(0);\n\t\t\t\t}\n\t\t\t\tif(!isFinite(dateB)) {\n\t\t\t\t\tdateB = new Date(0);\n\t\t\t\t}\n\t\t\t\treturn compare(dateA,dateB);\n\t\t\t},\n\t\t\t\"version\": function(a,b) {\n\t\t\t\treturn $tw.utils.compareVersions(a,b);\n\t\t\t}\n\t\t};\n\treturn (types[type] || types[options.defaultType] || types.number);\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "utils"
        },
        "$:/core/modules/widgets/action-confirm.js": {
            "title": "$:/core/modules/widgets/action-confirm.js",
            "text": "/*\\\n\ntitle: $:/core/modules/widgets/action-confirm.js\ntype: application/javascript\nmodule-type: widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ConfirmWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nConfirmWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nConfirmWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.parentDomNode = parent;\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nConfirmWidget.prototype.execute = function() {\n\tthis.message = this.getAttribute(\"$message\",$tw.language.getString(\"ConfirmAction\"));\n\tthis.prompt = (this.getAttribute(\"$prompt\",\"yes\") == \"no\" ? false : true);\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nConfirmWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$message\"] || changedAttributes[\"$prompt\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nConfirmWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar invokeActions = true,\n\t\thandled = true;\n\tif(this.prompt) {\n\t\tinvokeActions = confirm(this.message);\n\t}\n\tif(invokeActions) {\n\t\thandled = this.invokeActions(triggeringWidget,event);\n\t}\n\treturn handled;\n};\n\nConfirmWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nexports[\"action-confirm\"] = ConfirmWidget;\n\n})();",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-createtiddler.js": {
            "title": "$:/core/modules/widgets/action-createtiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-createtiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to create a new tiddler with a unique name and specified fields.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw:false, require:false, exports:false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CreateTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCreateTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCreateTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nCreateTiddlerWidget.prototype.execute = function() {\n\tthis.actionBaseTitle = this.getAttribute(\"$basetitle\");\n\tthis.hasBase = !!this.actionBaseTitle;\n\tthis.actionSaveTitle = this.getAttribute(\"$savetitle\");\n\tthis.actionSaveDraftTitle = this.getAttribute(\"$savedrafttitle\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n\t//Following params are new since 5.1.22\n\tthis.actionTemplate = this.getAttribute(\"$template\");\n\tthis.useTemplate = !!this.actionTemplate;\n\tthis.actionOverwrite = this.getAttribute(\"$overwrite\",\"no\");\n\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nCreateTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nCreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar title = this.wiki.getTiddlerText(\"$:/language/DefaultNewTiddlerTitle\"), // Get the initial new-tiddler title\n\t\tfields = {},\n\t\tcreationFields,\n\t\tmodificationFields;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tfields[name] = attribute;\n\t\t}\n\t});\n\tif(this.actionTimestamp) {\n\t\tcreationFields = this.wiki.getCreationFields();\n\t\tmodificationFields = this.wiki.getModificationFields();\n\t}\n\tif(this.hasBase && this.actionOverwrite === \"no\") {\n\t\ttitle = this.wiki.generateNewTitle(this.actionBaseTitle);\n\t} else if (this.hasBase && this.actionOverwrite === \"yes\") {\n\t\ttitle = this.actionBaseTitle\n\t}\n\t// NO $basetitle BUT $template parameter is available\n\t// the title MUST be unique, otherwise the template would be overwritten\n\tif (!this.hasBase && this.useTemplate) {\n\t\ttitle = this.wiki.generateNewTitle(this.actionTemplate);\n\t} else if (!this.hasBase && !this.useTemplate) {\n\t\t// If NO $basetitle AND NO $template use initial title\n\t\t// DON'T overwrite any stuff\n\t\ttitle = this.wiki.generateNewTitle(title);\n\t}\n\tvar templateTiddler = this.wiki.getTiddler(this.actionTemplate) || {};\n\tvar tiddler = this.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title}));\n\tif(this.actionSaveTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.actionSaveDraftTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveDraftTitle,this.wiki.generateDraftTitle(title),this.getVariable(\"currentTiddler\"));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-createtiddler\"] = CreateTiddlerWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-deletefield.js": {
            "title": "$:/core/modules/widgets/action-deletefield.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-deletefield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete fields of a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\ttiddler = this.wiki.getTiddler(self.actionTiddler),\n\t\tremoveFields = {},\n\t\thasChanged = false;\n\tif(this.actionField && tiddler) {\n\t\tremoveFields[this.actionField] = undefined;\n\t\tif(this.actionField in tiddler.fields) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(tiddler) {\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\" && name !== \"title\") {\n\t\t\t\tremoveFields[name] = undefined;\n\t\t\t\thasChanged = true;\n\t\t\t}\n\t\t});\n\t\tif(hasChanged) {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,removeFields,this.wiki.getModificationFields()));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-deletetiddler.js": {
            "title": "$:/core/modules/widgets/action-deletetiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteTiddlerWidget.prototype.execute = function() {\n\tthis.actionFilter = this.getAttribute(\"$filter\");\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$filter\"] || changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddlers = [];\n\tif(this.actionFilter) {\n\t\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\n\t}\n\tif(this.actionTiddler) {\n\t\ttiddlers.push(this.actionTiddler);\n\t}\n\tfor(var t=0; t<tiddlers.length; t++) {\n\t\tthis.wiki.deleteTiddler(tiddlers[t]);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletetiddler\"] = DeleteTiddlerWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-listops.js": {
            "title": "$:/core/modules/widgets/action-listops.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-listops.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to apply list operations to any tiddler field (defaults to the 'list' field of the current tiddler)\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar ActionListopsWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n/**\n * Inherit from the base widget class\n */\nActionListopsWidget.prototype = new Widget();\n/**\n * Render this widget into the DOM\n */\nActionListopsWidget.prototype.render = function(parent, nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n/**\n * Compute the internal state of the widget\n */\nActionListopsWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.target = this.getAttribute(\"$tiddler\", this.getVariable(\n\t\t\"currentTiddler\"));\n\tthis.filter = this.getAttribute(\"$filter\");\n\tthis.subfilter = this.getAttribute(\"$subfilter\");\n\tthis.listField = this.getAttribute(\"$field\", \"list\");\n\tthis.listIndex = this.getAttribute(\"$index\");\n\tthis.filtertags = this.getAttribute(\"$tags\");\n};\n/**\n * \tRefresh the widget by ensuring our attributes are up to date\n */\nActionListopsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.$tiddler || changedAttributes.$filter ||\n\t\tchangedAttributes.$subfilter || changedAttributes.$field ||\n\t\tchangedAttributes.$index || changedAttributes.$tags) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n/**\n * \tInvoke the action associated with this widget\n */\nActionListopsWidget.prototype.invokeAction = function(triggeringWidget,\n\tevent) {\n\t//Apply the specified filters to the lists\n\tvar field = this.listField,\n\t\tindex,\n\t\ttype = \"!!\",\n\t\tlist = this.listField;\n\tif(this.listIndex) {\n\t\tfield = undefined;\n\t\tindex = this.listIndex;\n\t\ttype = \"##\";\n\t\tlist = this.listIndex;\n\t}\n\tif(this.filter) {\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(this.filter, this)));\n\t}\n\tif(this.subfilter) {\n\t\tvar subfilter = \"[list[\" + this.target + type + list + \"]] \" + this.subfilter;\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(subfilter, this)));\n\t}\n\tif(this.filtertags) {\n\t\tvar tiddler = this.wiki.getTiddler(this.target),\n\t\t\toldtags = tiddler ? (tiddler.fields.tags || []).slice(0) : [],\n\t\t\ttagfilter = \"[list[\" + this.target + \"!!tags]] \" + this.filtertags,\n\t\t\tnewtags = this.wiki.filterTiddlers(tagfilter,this);\n\t\tif($tw.utils.stringifyList(oldtags.sort()) !== $tw.utils.stringifyList(newtags.sort())) {\n\t\t\tthis.wiki.setText(this.target,\"tags\",undefined,$tw.utils.stringifyList(newtags));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-listops\"] = ActionListopsWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-log.js": {
            "title": "$:/core/modules/widgets/action-log.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-log.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to log debug messages\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LogWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLogWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLogWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\nLogWidget.prototype.execute = function(){\n\tthis.message = this.getAttribute(\"$$message\",\"debug\");\n\tthis.logAll = this.getAttribute(\"$$all\",\"no\") === \"yes\" ? true : false;\n\tthis.filter = this.getAttribute(\"$$filter\");\n}\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nLogWidget.prototype.refresh = function(changedTiddlers) {\n\tthis.refreshSelf();\n\treturn true;\n};\n\n/*\nInvoke the action associated with this widget\n*/\nLogWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tthis.log();\n\treturn true; // Action was invoked\n};\n\nLogWidget.prototype.log = function() {\n\tvar data = {},\n\t\tdataCount,\n\t\tallVars = {},\n\t\tfilteredVars;\n\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.substring(0,2) !== \"$$\") {\n\t\t\tdata[name] = attribute;\n\t\t}\t\t\n\t});\n\n\tfor(var v in this.variables) {\n\t\tallVars[v] = this.getVariable(v,{defaultValue:\"\"});\n\t}\t\n\tif(this.filter) {\n\t\tfilteredVars = this.wiki.compileFilter(this.filter).call(this.wiki,this.wiki.makeTiddlerIterator(allVars));\n\t\t$tw.utils.each(filteredVars,function(name) {\n\t\t\tdata[name] = allVars[name];\n\t\t});\t\t\n\t}\n\tdataCount = $tw.utils.count(data);\n\n\tconsole.group(this.message);\n\tif(dataCount > 0) {\n\t\t$tw.utils.logTable(data);\n\t}\n\tif(this.logAll || !dataCount) {\n\t\tconsole.groupCollapsed(\"All variables\");\n\t\t$tw.utils.logTable(allVars);\n\t\tconsole.groupEnd();\n\t}\n\tconsole.groupEnd();\n}\n\nexports[\"action-log\"] = LogWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-navigate.js": {
            "title": "$:/core/modules/widgets/action-navigate.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-navigate.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to navigate to a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigateWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigateWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigateWidget.prototype.execute = function() {\n\tthis.actionTo = this.getAttribute(\"$to\");\n\tthis.actionScroll = this.getAttribute(\"$scroll\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$to\"] || changedAttributes[\"$scroll\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tevent = event || {};\n\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\n\t\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\n\tif(this.actionScroll === \"yes\") {\n\t\tsuppressNavigation = false;\n\t} else if(this.actionScroll === \"no\") {\n\t\tsuppressNavigation = true;\n\t}\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.actionTo === undefined ? this.getVariable(\"currentTiddler\") : this.actionTo,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: triggeringWidget,\n\t\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: suppressNavigation\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-navigate\"] = NavigateWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-popup.js": {
            "title": "$:/core/modules/widgets/action-popup.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-popup.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to trigger a popup.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ActionPopupWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nActionPopupWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nActionPopupWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nActionPopupWidget.prototype.execute = function() {\n\tthis.actionState = this.getAttribute(\"$state\");\n\tthis.actionCoords = this.getAttribute(\"$coords\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nActionPopupWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$state\"] || changedAttributes[\"$coords\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Trigger the popup\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(this.actionCoords || \"\");\n\tif(match) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: null,\n\t\t\tdomNodeRect: {\n\t\t\t\tleft: parseFloat(match[1]),\n\t\t\t\ttop: parseFloat(match[2]),\n\t\t\t\twidth: parseFloat(match[3]),\n\t\t\t\theight: parseFloat(match[4])\n\t\t\t},\n\t\t\ttitle: this.actionState,\n\t\t\twiki: this.wiki\n\t\t});\n\t} else {\n\t\t$tw.popup.cancel(0);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-popup\"] = ActionPopupWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-sendmessage.js": {
            "title": "$:/core/modules/widgets/action-sendmessage.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to send a message\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SendMessageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSendMessageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSendMessageWidget.prototype.execute = function() {\n\tthis.actionMessage = this.getAttribute(\"$message\");\n\tthis.actionParam = this.getAttribute(\"$param\");\n\tthis.actionName = this.getAttribute(\"$name\");\n\tthis.actionValue = this.getAttribute(\"$value\",\"\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSendMessageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Get the string parameter\n\tvar param = this.actionParam;\n\t// Assemble the attributes as a hashmap\n\tvar paramObject = Object.create(null);\n\tvar count = 0;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparamObject[name] = attribute;\n\t\t\tcount++;\n\t\t}\n\t});\n\t// Add name/value pair if present\n\tif(this.actionName) {\n\t\tparamObject[this.actionName] = this.actionValue;\n\t}\n\t// Dispatch the message\n\tthis.dispatchEvent({\n\t\ttype: this.actionMessage,\n\t\tparam: param,\n\t\tparamObject: paramObject,\n\t\ttiddlerTitle: this.getVariable(\"currentTiddler\"),\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tevent: event\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/action-setfield.js": {
            "title": "$:/core/modules/widgets/action-setfield.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/action-setfield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\tthis.actionValue = this.getAttribute(\"$value\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$field\"] || changedAttributes[\"$index\"] || changedAttributes[\"$value\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\toptions = {};\n\toptions.suppressTimestamp = !this.actionTimestamp;\n\tif((typeof this.actionField == \"string\") || (typeof this.actionIndex == \"string\")  || (typeof this.actionValue == \"string\")) {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue,options);\n\t}\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute,options);\n\t\t}\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setfield\"] = SetFieldWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/browse.js": {
            "title": "$:/core/modules/widgets/browse.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/browse.js\ntype: application/javascript\nmodule-type: widget\n\nBrowse widget for browsing for files to import\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar BrowseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nBrowseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nBrowseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"file\");\n\tif(this.browseMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\t// Nw.js supports \"nwsaveas\" to force a \"save as\" dialogue that allows a new or existing file to be selected\n\tif(this.nwsaveas) {\n\t\tdomNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n\t}\n\tif(this.accept) {\n\t\tdomNode.setAttribute(\"accept\",this.accept);\n\t}\n\t// Nw.js supports \"webkitdirectory\" and \"nwdirectory\" to allow a directory to be selected\n\tif(this.webkitdirectory) {\n\t\tdomNode.setAttribute(\"webkitdirectory\",this.webkitdirectory);\n\t}\n\tif(this.nwdirectory) {\n\t\tdomNode.setAttribute(\"nwdirectory\",this.nwdirectory);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"change\",function (event) {\n\t\tif(self.message) {\n\t\t\tself.dispatchEvent({type: self.message, param: self.param, files: event.target.files});\n\t\t} else {\n\t\t\tself.wiki.readFiles(event.target.files,{\n\t\t\t\tcallback: function(tiddlerFieldsArray) {\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t\t},\n\t\t\t\tdeserializer: self.deserializer\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nBrowseWidget.prototype.execute = function() {\n\tthis.browseMultiple = this.getAttribute(\"multiple\");\n\tthis.deserializer = this.getAttribute(\"deserializer\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.nwsaveas = this.getAttribute(\"nwsaveas\");\n\tthis.accept = this.getAttribute(\"accept\");\n\tthis.webkitdirectory = this.getAttribute(\"webkitdirectory\");\n\tthis.nwdirectory = this.getAttribute(\"nwdirectory\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.browse = BrowseWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/button.js": {
            "title": "$:/core/modules/widgets/button.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this,\n\t\ttag = \"button\",\n\t\tdomNode;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif((this.set || this.setTitle) && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tdomNode.setAttribute(\"disabled\",true);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(self,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup || self.popupTitle) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set || self.setTitle) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.actions) {\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tself.invokeActionString(self.actions,self,event,{modifier: modifierKey});\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Make it draggable if required\n\tif(this.dragTiddler || this.dragFilter) {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.dragTiddler;},\n\t\t\tdragFilterFn: function() {return self.dragFilter;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nWe don't allow actions to propagate because we trigger actions ourselves\n*/\nButtonWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n};\n\nButtonWidget.prototype.isSelected = function() {\n    return this.setTitle ? (this.setField ? this.wiki.getTiddler(this.setTitle).getFieldString(this.setField) === this.setTo :\n\t\t(this.setIndex ? this.wiki.extractTiddlerDataItem(this.setTitle,this.setIndex) === this.setTo :\n\t\t\tthis.wiki.getTiddlerText(this.setTitle))) || this.defaultSetValue || this.getVariable(\"currentTiddler\") :\n\t\tthis.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\"currentTiddler\")) === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.popupTitle ? this.wiki.getTiddler(this.popupTitle) : this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tevent: event\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\"), event: event});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\tif(this.popupTitle) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popupTitle,\n\t\t\twiki: this.wiki,\n\t\t\tnoStateReference: true\n\t\t});\n\t} else {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popup,\n\t\t\twiki: this.wiki\n\t\t});\n\t}\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tif(this.setTitle) {\n\t\tthis.setField ? this.wiki.setText(this.setTitle,this.setField,undefined,this.setTo) :\n\t\t\t\t(this.setIndex ? this.wiki.setText(this.setTitle,undefined,this.setIndex,this.setTo) :\n\t\t\t\tthis.wiki.setText(this.setTitle,\"text\",undefined,this.setTo));\n\t} else {\n\t\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\");\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\",\"\");\n\tthis.buttonTag = this.getAttribute(\"tag\");\n\tthis.dragTiddler = this.getAttribute(\"dragTiddler\");\n\tthis.dragFilter = this.getAttribute(\"dragFilter\");\n\tthis.setTitle = this.getAttribute(\"setTitle\");\n\tthis.setField = this.getAttribute(\"setField\");\n\tthis.setIndex = this.getAttribute(\"setIndex\");\n\tthis.popupTitle = this.getAttribute(\"popupTitle\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nButtonWidget.prototype.updateDomNodeClasses = function() {\n\tvar domNodeClasses = this.domNode.className.split(\" \"),\n\t\toldClasses = this.class.split(\" \"),\n\t\tnewClasses;\t\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tnewClasses = this.class.split(\" \");\n\t//Remove classes assigned from the old value of class attribute\n\t$tw.utils.each(oldClasses,function(oldClass){\n\t\tvar i = domNodeClasses.indexOf(oldClass);\n\t\tif(i !== -1) {\n\t\t\tdomNodeClasses.splice(i,1);\n\t\t}\n\t});\n\t//Add new classes from updated class attribute.\n\t$tw.utils.pushTop(domNodeClasses,newClasses);\n\tthis.domNode.className = domNodeClasses.join(\" \");\n}\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle || changedAttributes.disabled) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.updateDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/checkbox.js": {
            "title": "$:/core/modules/widgets/checkbox.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/checkbox.js\ntype: application/javascript\nmodule-type: widget\n\nCheckbox widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CheckboxWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCheckboxWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.checkboxClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tif(this.getValue()) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nCheckboxWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\n\tif(tiddler) {\n\t\tif(this.checkboxTag) {\n\t\t\tif(this.checkboxInvertTag) {\n\t\t\t\treturn !tiddler.hasTag(this.checkboxTag);\n\t\t\t} else {\n\t\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tvar value;\n\t\t\tif($tw.utils.hop(tiddler.fields,this.checkboxField)) {\n\t\t\t\tvalue = tiddler.fields[this.checkboxField] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.checkboxDefault || \"\";\n\t\t\t}\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxIndex) {\n\t\t\tvar value = this.wiki.extractTiddlerDataItem(tiddler,this.checkboxIndex,this.checkboxDefault || \"\");\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif(this.checkboxTag) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tif(this.checkboxDefault === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(this.checkboxDefault === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\n\tvar checked = this.inputDomNode.checked,\n\t\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\n\t\tfallbackFields = {text: \"\"},\n\t\tnewFields = {title: this.checkboxTitle},\n\t\thasChanged = false,\n\t\ttagCheck = false,\n\t\thasTag = tiddler && tiddler.hasTag(this.checkboxTag),\n\t\tvalue = checked ? this.checkboxChecked : this.checkboxUnchecked;\n\tif(this.checkboxTag && this.checkboxInvertTag === \"yes\") {\n\t\ttagCheck = hasTag === checked;\n\t} else {\n\t\ttagCheck = hasTag !== checked;\n\t}\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tagCheck)) {\n\t\tnewFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];\n\t\tvar pos = newFields.tags.indexOf(this.checkboxTag);\n\t\tif(pos !== -1) {\n\t\t\tnewFields.tags.splice(pos,1);\n\t\t}\n\t\tif(this.checkboxInvertTag === \"yes\" && !checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t} else if(this.checkboxInvertTag !== \"yes\" && checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t}\n\t\thasChanged = true;\n\t}\n\t// Set the field if specified\n\tif(this.checkboxField) {\n\t\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\n\t\t\tnewFields[this.checkboxField] = value;\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\t// Set the index if specified\n\tif(this.checkboxIndex) {\n\t\tvar indexValue = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxIndex);\n\t\tif(!tiddler || indexValue !== value) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(hasChanged) {\n\t\tif(this.checkboxIndex) {\n\t\t\tthis.wiki.setText(this.checkboxTitle,\"\",this.checkboxIndex,value);\n\t\t} else {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t\t}\n\t}\n\t// Trigger actions\n\tif(this.checkboxActions) {\n\t\tthis.invokeActionString(this.checkboxActions,this,event);\n\t}\n\tif(this.checkboxCheckActions && checked) {\n\t\tthis.invokeActionString(this.checkboxCheckActions,this,event);\n\t}\n\tif(this.checkboxUncheckActions && !checked) {\n\t\tthis.invokeActionString(this.checkboxUncheckActions,this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCheckboxWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.checkboxActions = this.getAttribute(\"actions\");\n\tthis.checkboxCheckActions = this.getAttribute(\"checkactions\");\n\tthis.checkboxUncheckActions = this.getAttribute(\"uncheckactions\");\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxIndex = this.getAttribute(\"index\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\tthis.checkboxClass = this.getAttribute(\"class\",\"\");\n\tthis.checkboxInvertTag = this.getAttribute(\"invertTag\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCheckboxWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.index || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.disabled) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/codeblock.js": {
            "title": "$:/core/modules/widgets/codeblock.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/codeblock.js\ntype: application/javascript\nmodule-type: widget\n\nCode block node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CodeBlockWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCodeBlockWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar codeNode = this.document.createElement(\"code\"),\n\t\tdomNode = this.document.createElement(\"pre\");\n\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\"code\")));\n\tdomNode.appendChild(codeNode);\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCodeBlockWidget.prototype.execute = function() {\n\tthis.language = this.getAttribute(\"language\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.codeblock = CodeBlockWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/count.js": {
            "title": "$:/core/modules/widgets/count.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/count.js\ntype: application/javascript\nmodule-type: widget\n\nCount widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CountWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCountWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCountWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.currentCount);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCountWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Execute the filter\n\tif(this.filter) {\n\t\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\n\t} else {\n\t\tthis.currentCount = \"0\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCountWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldCount = this.currentCount;\n\tthis.execute();\n\tif(this.currentCount !== oldCount) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.count = CountWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/diff-text.js": {
            "title": "$:/core/modules/widgets/diff-text.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/diff-text.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display a diff between two texts\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget,\n\tdmp = require(\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\");\n\nvar DiffTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDiffTextWidget.prototype = new Widget();\n\nDiffTextWidget.prototype.invisibleCharacters = {\n\t\"\\n\": \"↩︎\\n\",\n\t\"\\r\": \"⇠\",\n\t\"\\t\": \"⇥\\t\"\n};\n\n/*\nRender this widget into the DOM\n*/\nDiffTextWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create the diff\n\tvar dmpObject = new dmp.diff_match_patch(),\n\t\tdiffs = dmpObject.diff_main(this.getAttribute(\"source\"),this.getAttribute(\"dest\"));\n\t// Apply required cleanup\n\tswitch(this.getAttribute(\"cleanup\",\"semantic\")) {\n\t\tcase \"none\":\n\t\t\t// No cleanup\n\t\t\tbreak;\n\t\tcase \"efficiency\":\n\t\t\tdmpObject.diff_cleanupEfficiency(diffs);\n\t\t\tbreak;\n\t\tdefault: // case \"semantic\"\n\t\t\tdmpObject.diff_cleanupSemantic(diffs);\n\t\t\tbreak;\n\t}\n\t// Create the elements\n\tvar domContainer = this.document.createElement(\"div\"), \n\t\tdomDiff = this.createDiffDom(diffs);\n\tparent.insertBefore(domContainer,nextSibling);\n\t// Set variables\n\tthis.setVariable(\"diff-count\",diffs.reduce(function(acc,diff) {\n\t\tif(diff[0] !== dmp.DIFF_EQUAL) {\n\t\t\tacc++;\n\t\t}\n\t\treturn acc;\n\t},0).toString());\n\t// Render child widgets\n\tthis.renderChildren(domContainer,null);\n\t// Render the diff\n\tdomContainer.appendChild(domDiff);\n\t// Save our container\n\tthis.domNodes.push(domContainer);\n};\n\n/*\nCreate DOM elements representing a list of diffs\n*/\nDiffTextWidget.prototype.createDiffDom = function(diffs) {\n\tvar self = this;\n\t// Create the element and assign the attributes\n\tvar domPre = this.document.createElement(\"pre\"),\n\t\tdomCode = this.document.createElement(\"code\");\n\t$tw.utils.each(diffs,function(diff) {\n\t\tvar tag = diff[0] === dmp.DIFF_INSERT ? \"ins\" : (diff[0] === dmp.DIFF_DELETE ? \"del\" : \"span\"),\n\t\t\tclassName = diff[0] === dmp.DIFF_INSERT ? \"tc-diff-insert\" : (diff[0] === dmp.DIFF_DELETE ? \"tc-diff-delete\" : \"tc-diff-equal\"),\n\t\t\tdom = self.document.createElement(tag),\n\t\t\ttext = diff[1],\n\t\t\tcurrPos = 0,\n\t\t\tre = /([\\x00-\\x1F])/mg,\n\t\t\tmatch = re.exec(text),\n\t\t\tspan,\n\t\t\tprintable;\n\t\tdom.className = className;\n\t\twhile(match) {\n\t\t\tif(currPos < match.index) {\n\t\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos,match.index)));\n\t\t\t}\n\t\t\tspan = self.document.createElement(\"span\");\n\t\t\tspan.className = \"tc-diff-invisible\";\n\t\t\tprintable = self.invisibleCharacters[match[0]] || (\"[0x\" + match[0].charCodeAt(0).toString(16) + \"]\");\n\t\t\tspan.appendChild(self.document.createTextNode(printable));\n\t\t\tdom.appendChild(span);\n\t\t\tcurrPos = match.index + match[0].length;\n\t\t\tmatch = re.exec(text);\n\t\t}\n\t\tif(currPos < text.length) {\n\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos)));\n\t\t}\n\t\tdomCode.appendChild(dom);\n\t});\n\tdomPre.appendChild(domCode);\n\treturn domPre;\n};\n\n/*\nCompute the internal state of the widget\n*/\nDiffTextWidget.prototype.execute = function() {\n\t// Make child widgets\n\tvar parseTreeNodes;\n\tif(this.parseTreeNode && this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: \"$:/language/Diffs/CountMessage\"}\n\t\t\t}\n\t\t}];\n\t}\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDiffTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.dest || changedAttributes.cleanup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports[\"diff-text\"] = DiffTextWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/draggable.js": {
            "title": "$:/core/modules/widgets/draggable.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/draggable.js\ntype: application/javascript\nmodule-type: widget\n\nDraggable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DraggableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDraggableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDraggableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Sanitise the specified tag\n\tvar tag = this.draggableTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"div\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [\"tc-draggable\"];\n\tif(this.draggableClasses) {\n\t\tclasses.push(this.draggableClasses);\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Add event handlers\n\t$tw.utils.makeDraggable({\n\t\tdomNode: domNode,\n\t\tdragTiddlerFn: function() {return self.getAttribute(\"tiddler\");},\n\t\tdragFilterFn: function() {return self.getAttribute(\"filter\");},\n\t\tstartActions: self.startActions,\n\t\tendActions: self.endActions,\n\t\twidget: this\n\t});\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nDraggableWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.draggableTag = this.getAttribute(\"tag\",\"div\");\n\tthis.draggableClasses = this.getAttribute(\"class\");\n\tthis.startActions = this.getAttribute(\"startactions\");\n\tthis.endActions = this.getAttribute(\"endactions\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDraggableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.draggable = DraggableWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/droppable.js": {
            "title": "$:/core/modules/widgets/droppable.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/droppable.js\ntype: application/javascript\nmodule-type: widget\n\nDroppable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DroppableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDroppableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDroppableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this,\n\t\ttag = this.parseTreeNode.isBlock ? \"div\" : \"span\",\n\t\tdomNode;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.droppableTag && $tw.config.htmlUnsafeElements.indexOf(this.droppableTag) === -1) {\n\t\ttag = this.droppableTag;\n\t}\n\t// Create element and assign classes\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\t// Add event handlers\n\tif(this.droppableEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"}\n\t\t]);\t\t\n\t} else {\n\t\t$tw.utils.addClass(this.domNode,this.disabledClass);\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDroppableWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDroppableWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally. The hacky second condition is to resolve a problem with Firefox whereby there is an erroneous dragenter event if the node being dragged is within the dropzone\n\tif(this.currentlyEntered.length === 0 || (this.currentlyEntered.length === 1 && this.currentlyEntered[0] === $tw.dragInProgress)) {\n\t\tthis.currentlyEntered = [];\n\t\tif(this.domNodes[0]) {\n\t\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t\t}\n\t}\n};\n\nDroppableWidget.prototype.handleDragEnterEvent  = function(event) {\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragOverEvent  = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\t// Set the drop effect\n\tevent.dataTransfer.dropEffect = this.droppableEffect;\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragLeaveEvent  = function(event) {\n\tthis.leaveDrag(event);\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDropEvent  = function(event) {\n\tvar self = this;\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\tvar dataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Try to import the various data types we understand\n\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\n\t\tfieldsArray.forEach(function(fields) {\n\t\t\tself.performActions(fields.title || fields.text,event);\n\t\t});\n\t});\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.performActions = function(title,event) {\n\tif(this.droppableActions) {\n\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\tthis.invokeActionString(this.droppableActions,this,event,{actionTiddler: title, modifier: modifierKey});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDroppableWidget.prototype.execute = function() {\n\tthis.droppableActions = this.getAttribute(\"actions\");\n\tthis.droppableEffect = this.getAttribute(\"effect\",\"copy\");\n\tthis.droppableTag = this.getAttribute(\"tag\");\n\tthis.droppableEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.disabledClass = this.getAttribute(\"disabledClass\",\"\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nDroppableWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-droppable\");\n\tthis.domNode.className = classes.join(\" \");\t\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDroppableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes.enable || changedAttributes.disabledClass || changedAttributes.actions || changedAttributes.effect) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.droppable = DroppableWidget;\n\n})();",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/dropzone.js": {
            "title": "$:/core/modules/widgets/dropzone.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/dropzone.js\ntype: application/javascript\nmodule-type: widget\n\nDropzone widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DropZoneWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDropZoneWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tdomNode.className = this.dropzoneClass || \"tc-dropzone\";\n\t// Add event handlers\n\tif(this.dropzoneEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"},\n\t\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t\t]);\t\t\n\t}\n\tdomNode.addEventListener(\"click\",function (event) {\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDropZoneWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally\n\tif(this.currentlyEntered.length === 0) {\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent  = function(event) {\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handleDragOverEvent  = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent  = function(event) {\n\tthis.leaveDrag(event);\n};\n\nDropZoneWidget.prototype.handleDragEndEvent = function(event) {\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.handleDropEvent  = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t};\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Import any files in the drop\n\tvar numFiles = 0;\n\tif(dataTransfer.files) {\n\t\tnumFiles = this.wiki.readFiles(dataTransfer.files,{\n\t\t\tcallback: readFileCallback,\n\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t});\n\t}\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\t$tw.utils.importDataTransfer(dataTransfer,this.wiki.generateNewTitle(\"Untitled\"),readFileCallback);\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handlePasteEvent  = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t};\n\t// Let the browser handle it if we're in a textarea or input box\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) == -1 && !event.target.isContentEditable) {\n\t\tvar self = this,\n\t\t\titems = event.clipboardData.items;\n\t\t// Enumerate the clipboard items\n\t\tfor(var t = 0; t<items.length; t++) {\n\t\t\tvar item = items[t];\n\t\t\tif(item.kind === \"file\") {\n\t\t\t\t// Import any files\n\t\t\t\tthis.wiki.readFile(item.getAsFile(),{\n\t\t\t\t\tcallback: readFileCallback,\n\t\t\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t\t\t});\n\t\t\t} else if(item.kind === \"string\") {\n\t\t\t\t// Create tiddlers from string items\n\t\t\t\tvar type = item.type;\n\t\t\t\titem.getAsString(function(str) {\n\t\t\t\t\tvar tiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled\"),\n\t\t\t\t\t\ttext: str,\n\t\t\t\t\t\ttype: type\n\t\t\t\t\t};\n\t\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\t\tconsole.log(\"Importing string '\" + str + \"', type: '\" + type + \"'\");\n\t\t\t\t\t}\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields]), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Tell the browser that we've handled the paste\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDropZoneWidget.prototype.execute = function() {\n\tthis.dropzoneClass = this.getAttribute(\"class\");\n\tthis.dropzoneDeserializer = this.getAttribute(\"deserializer\");\n\tthis.dropzoneEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.autoOpenOnImport = this.getAttribute(\"autoOpenOnImport\");\n\tthis.importTitle = this.getAttribute(\"importTitle\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.enable || changedAttributes.autoOpenOnImport || changedAttributes.importTitle || changedAttributes.deserializer || changedAttributes.class) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-binary.js": {
            "title": "$:/core/modules/widgets/edit-binary.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit-binary.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-binary widget; placeholder for editing binary tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBinaryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBinaryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBinaryWidget.prototype.execute = function() {\n\t// Get our parameters\n\tvar editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tvar tiddler = this.wiki.getTiddler(editTitle);\n\tvar type = tiddler.fields.type;\n\tvar text = tiddler.fields.text;\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on draft tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!draft.title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!draft.title\"}\n\t\t},\n\t\tchildren: [{\n\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to internal data URI (no external)\n\tif(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets([element]);\n};\n\n/*\nRefresh by refreshing our child widget\n*/\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"edit-binary\"] = EditBinaryWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-bitmap.js": {
            "title": "$:/core/modules/widgets/edit-bitmap.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-bitmap widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Default image sizes\nvar DEFAULT_IMAGE_WIDTH = 600,\n\tDEFAULT_IMAGE_HEIGHT = 370,\n\tDEFAULT_IMAGE_TYPE = \"image/png\";\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\",\n\tLINE_OPACITY_TITLE = \"$:/config/BitmapEditor/Opacity\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBitmapWidget = function(parseTreeNode,options) {\n\t// Initialise the editor operations if they've not been done already\n\tif(!this.editorOperations) {\n\t\tEditBitmapWidget.prototype.editorOperations = {};\n\t\t$tw.modules.applyMethods(\"bitmapeditoroperation\",this.editorOperations);\n\t}\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create the wrapper for the toolbar and render its content\n\tthis.toolbarNode = this.document.createElement(\"div\");\n\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\tparent.insertBefore(this.toolbarNode,nextSibling);\n\tthis.domNodes.push(this.toolbarNode);\n\t// Create the on-screen canvas\n\tthis.canvasDomNode = $tw.utils.domMaker(\"canvas\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor\",\n\t\teventListeners: [{\n\t\t\tname: \"touchstart\", handlerObject: this, handlerMethod: \"handleTouchStartEvent\"\n\t\t},{\n\t\t\tname: \"touchmove\", handlerObject: this, handlerMethod: \"handleTouchMoveEvent\"\n\t\t},{\n\t\t\tname: \"touchend\", handlerObject: this, handlerMethod: \"handleTouchEndEvent\"\n\t\t},{\n\t\t\tname: \"mousedown\", handlerObject: this, handlerMethod: \"handleMouseDownEvent\"\n\t\t},{\n\t\t\tname: \"mousemove\", handlerObject: this, handlerMethod: \"handleMouseMoveEvent\"\n\t\t},{\n\t\t\tname: \"mouseup\", handlerObject: this, handlerMethod: \"handleMouseUpEvent\"\n\t\t}]\n\t});\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Render toolbar child widgets\n\tthis.renderChildren(this.toolbarNode,null);\n\t// // Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n\t// Add widget message listeners\n\tthis.addEventListeners([\n\t\t{type: \"tm-edit-bitmap-operation\", handler: \"handleEditBitmapOperationMessage\"}\n\t]);\n};\n\n/*\nHandle an edit bitmap operation message from the toolbar\n*/\nEditBitmapWidget.prototype.handleEditBitmapOperationMessage = function(event) {\n\t// Invoke the handler\n\tvar handler = this.editorOperations[event.param];\n\tif(handler) {\n\t\thandler.call(this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBitmapWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nJust refresh the toolbar\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nSet the bitmap size variables and refresh the toolbar\n*/\nEditBitmapWidget.prototype.refreshToolbar = function() {\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Refresh each of our child widgets\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.refreshSelf();\n\t});\n};\n\nEditBitmapWidget.prototype.loadCanvas = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle),\n\t\tcurrImage = new Image();\n\t// Set up event handlers for loading the image\n\tvar self = this;\n\tcurrImage.onload = function() {\n\t\t// Copy the image to the on-screen canvas\n\t\tself.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\n\t\t// And also copy the current bitmap to the off-screen canvas\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\tcurrImage.onerror = function() {\n\t\t// Set the on-screen canvas size and clear it\n\t\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the off-screen canvas size and clear it\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\t// Get the current bitmap into an image object\n\tif(tiddler && tiddler.fields.type && tiddler.fields.text) {\n\t\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\t\t\n\t} else {\n\t\tcurrImage.width = DEFAULT_IMAGE_WIDTH;\n\t\tcurrImage.height = DEFAULT_IMAGE_HEIGHT;\n\t\tcurrImage.onerror();\n\t}\n};\n\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif(image) {\n\t\tctx.drawImage(image,0,0);\n\t} else {\n\t\tctx.fillStyle = \"#fff\";\n\t\tctx.fillRect(0,0,canvas.width,canvas.height);\n\t}\n};\n\n/*\n** Change the size of the canvas, preserving the current image\n*/\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\");\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\n/*\n** Rotate the canvas left by 90 degrees\n*/\nEditBitmapWidget.prototype.rotateCanvasLeft = function() {\n\t// Get the current size of the image\n\tvar origWidth = this.currCanvas.width,\n\t\torigHeight = this.currCanvas.height;\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\"),\n\t\tnewWidth = origHeight,\n\t\tnewHeight = origWidth;\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.save();\n\tctx.translate(newWidth / 2,newHeight / 2);\n\tctx.rotate(-Math.PI / 2);\n\tctx.drawImage(this.currCanvas,-origWidth / 2,-origHeight / 2);\n\tctx.restore();\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\n\tthis.brushDown = true;\n\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.strokeStart(event.clientX,event.clientY);\n\tthis.brushDown = true;\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.clientX,event.clientY);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\n\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\n\t\tscale = this.canvasDomNode.width/canvasRect.width;\n\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\n};\n\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\n\t// Start off a new stroke\n\tthis.stroke = [this.adjustCoordinates(x,y)];\n};\n\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\"),\n\t\tt;\n\t// Add the new position to the end of the stroke\n\tthis.stroke.push(this.adjustCoordinates(x,y));\n\t// Redraw the previous image\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Render the stroke\n\tctx.globalAlpha = parseFloat(this.wiki.getTiddlerText(LINE_OPACITY_TITLE,\"1.0\"));\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseFloat(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"));\n\tctx.lineCap = \"round\";\n\tctx.lineJoin = \"round\";\n\tctx.beginPath();\n\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\n\tfor(t=1; t<this.stroke.length-1; t++) {\n\t\tvar s1 = this.stroke[t],\n\t\t\ts2 = this.stroke[t-1],\n\t\t\ttx = (s1.x + s2.x)/2,\n\t\t\tty = (s1.y + s2.y)/2;\n\t\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\n\t}\n\tctx.stroke();\n};\n\nEditBitmapWidget.prototype.strokeEnd = function() {\n\t// Copy the bitmap to the off-screen canvas\n\tvar ctx = this.currCanvas.getContext(\"2d\");\n\tctx.drawImage(this.canvasDomNode,0,0);\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\nEditBitmapWidget.prototype.saveChanges = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle) || new $tw.Tiddler({title: this.editTitle,type: DEFAULT_IMAGE_TYPE});\n\t// data URIs look like \"data:<type>;base64,<text>\"\n\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type),\n\t\tposColon = dataURL.indexOf(\":\"),\n\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\tposComma = dataURL.indexOf(\",\"),\n\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\ttext = dataURL.substring(posComma+1);\n\tvar update = {type: type, text: text};\n\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields()));\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-shortcut.js": {
            "title": "$:/core/modules/widgets/edit-shortcut.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit-shortcut.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display an editable keyboard shortcut\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditShortcutWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditShortcutWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditShortcutWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.inputNode = this.document.createElement(\"input\");\n\t// Assign classes\n\tif(this.shortcutClass) {\n\t\tthis.inputNode.className = this.shortcutClass;\t\t\n\t}\n\t// Assign other attributes\n\tif(this.shortcutStyle) {\n\t\tthis.inputNode.setAttribute(\"style\",this.shortcutStyle);\n\t}\n\tif(this.shortcutTooltip) {\n\t\tthis.inputNode.setAttribute(\"title\",this.shortcutTooltip);\n\t}\n\tif(this.shortcutPlaceholder) {\n\t\tthis.inputNode.setAttribute(\"placeholder\",this.shortcutPlaceholder);\n\t}\n\tif(this.shortcutAriaLabel) {\n\t\tthis.inputNode.setAttribute(\"aria-label\",this.shortcutAriaLabel);\n\t}\n\t// Assign the current shortcut\n\tthis.updateInputNode();\n\t// Add event handlers\n\t$tw.utils.addEventListeners(this.inputNode,[\n\t\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Link into the DOM\n\tparent.insertBefore(this.inputNode,nextSibling);\n\tthis.domNodes.push(this.inputNode);\n\t// Focus the input Node if focus === \"yes\" or focus === \"true\"\n\tif(this.shortcutFocus === \"yes\" || this.shortcutFocus === \"true\") {\n\t\tthis.focus();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditShortcutWidget.prototype.execute = function() {\n\tthis.shortcutTiddler = this.getAttribute(\"tiddler\");\n\tthis.shortcutField = this.getAttribute(\"field\");\n\tthis.shortcutIndex = this.getAttribute(\"index\");\n\tthis.shortcutPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.shortcutDefault = this.getAttribute(\"default\",\"\");\n\tthis.shortcutClass = this.getAttribute(\"class\");\n\tthis.shortcutStyle = this.getAttribute(\"style\");\n\tthis.shortcutTooltip = this.getAttribute(\"tooltip\");\n\tthis.shortcutAriaLabel = this.getAttribute(\"aria-label\");\n\tthis.shortcutFocus = this.getAttribute(\"focus\");\n};\n\n/*\nUpdate the value of the input node\n*/\nEditShortcutWidget.prototype.updateInputNode = function() {\n\tif(this.shortcutField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.shortcutTiddler);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,this.shortcutField)) {\n\t\t\tthis.inputNode.value = tiddler.getFieldString(this.shortcutField);\n\t\t} else {\n\t\t\tthis.inputNode.value = this.shortcutDefault;\n\t\t}\n\t} else if(this.shortcutIndex) {\n\t\tthis.inputNode.value = this.wiki.extractTiddlerDataItem(this.shortcutTiddler,this.shortcutIndex,this.shortcutDefault);\n\t} else {\n\t\tthis.inputNode.value = this.wiki.getTiddlerText(this.shortcutTiddler,this.shortcutDefault);\n\t}\n};\n\n/*\nHandle a dom \"keydown\" event\n*/\nEditShortcutWidget.prototype.handleKeydownEvent = function(event) {\n\t// Ignore shift, ctrl, meta, alt\n\tif(event.keyCode && $tw.keyboardManager.getModifierKeys().indexOf(event.keyCode) === -1) {\n\t\t// Get the shortcut text representation\n\t\tvar value = $tw.keyboardManager.getPrintableShortcuts([{\n\t\t\tctrlKey: event.ctrlKey,\n\t\t\tshiftKey: event.shiftKey,\n\t\t\taltKey: event.altKey,\n\t\t\tmetaKey: event.metaKey,\n\t\t\tkeyCode: event.keyCode\n\t\t}]);\n\t\tif(value.length > 0) {\n\t\t\tthis.wiki.setText(this.shortcutTiddler,this.shortcutField,this.shortcutIndex,value[0]);\n\t\t}\n\t\t// Ignore the keydown if it was already handled\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn true;\t\t\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nfocus the input node\n*/\nEditShortcutWidget.prototype.focus = function() {\n\tif(this.inputNode.focus && this.inputNode.select) {\n\t\tthis.inputNode.focus();\n\t\tthis.inputNode.select();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget needed re-rendering\n*/\nEditShortcutWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.placeholder || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.style || changedAttributes.tooltip || changedAttributes[\"aria-label\"] || changedAttributes.focus) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.shortcutTiddler]) {\n\t\tthis.updateInputNode();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports[\"edit-shortcut\"] = EditShortcutWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit-text.js": {
            "title": "$:/core/modules/widgets/edit-text.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit-text.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tFramedEngine = require(\"$:/core/modules/editor/engines/framed.js\").FramedEngine,\n\tSimpleEngine = require(\"$:/core/modules/editor/engines/simple.js\").SimpleEngine;\n\nexports[\"edit-text\"] = editTextWidgetFactory(FramedEngine,SimpleEngine);\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/edit.js": {
            "title": "$:/core/modules/widgets/edit.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\tthis.editFocus = this.getAttribute(\"focus\",\"\");\n\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\");\n\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: this.parseTreeNode.attributes,\n\t\tchildren: this.parseTreeNode.children\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/element.js": {
            "title": "$:/core/modules/widgets/element.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/element.js\ntype: application/javascript\nmodule-type: widget\n\nElement widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ElementWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElementWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nElementWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\t// Neuter blacklisted elements\n\tthis.tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(this.tag) !== -1) {\n\t\tthis.tag = \"safe-\" + this.tag;\n\t}\n\t// Adjust headings by the current base level\n\tvar headingLevel = [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"].indexOf(this.tag);\n\tif(headingLevel !== -1) {\n\t\tvar baseLevel = parseInt(this.getVariable(\"tv-adjust-heading-level\",\"0\"),10) || 0;\n\t\theadingLevel = Math.min(Math.max(headingLevel + 1 + baseLevel,1),6);\n\t\tthis.tag = \"h\" + headingLevel;\n\t}\n\t// Select the namespace for the tag\n\tvar tagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: \"http://www.w3.org/1999/xhtml\"\n\t\t};\n\tthis.namespace = tagNamespaces[this.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"});\n\t}\n\t// Invoke the th-rendering-element hook\n\tvar parseTreeNodes = $tw.hooks.invokeHook(\"th-rendering-element\",null,this);\n\tthis.isReplaced = !!parseTreeNodes;\n\tif(parseTreeNodes) {\n\t\t// Use the parse tree nodes provided by the hook\n\t\tthis.makeChildWidgets(parseTreeNodes);\n\t\tthis.renderChildren(this.parentDomNode,null);\n\t\treturn;\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n\t// Create the DOM node and render children\n\tvar domNode = this.document.createElementNS(this.namespace,this.tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\tif(!this.isReplaced) {\n\t\t\t// Update our attributes\n\t\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\t\t\t\n\t\t} else {\n\t\t\t// If we were replaced then completely refresh ourselves\n\t\t\treturn this.refreshSelf();\n\t\t}\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/encrypt.js": {
            "title": "$:/core/modules/widgets/encrypt.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/encrypt.js\ntype: application/javascript\nmodule-type: widget\n\nEncrypt widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EncryptWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEncryptWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEncryptWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.encryptedText);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEncryptWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\",\"[!is[system]]\");\n\t// Encrypt the filtered tiddlers\n\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\n\t\tjson = {},\n\t\tself = this;\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title),\n\t\t\tjsonTiddler = {};\n\t\tfor(var f in tiddler.fields) {\n\t\t\tjsonTiddler[f] = tiddler.getFieldString(f);\n\t\t}\n\t\tjson[title] = jsonTiddler;\n\t});\n\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\n\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\n\treturn false;\n};\n\nexports.encrypt = EncryptWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/entity.js": {
            "title": "$:/core/modules/widgets/entity.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/entity.js\ntype: application/javascript\nmodule-type: widget\n\nHTML entity widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EntityWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEntityWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEntityWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar entityString = this.getAttribute(\"entity\",this.parseTreeNode.entity || \"\"),\n\t\ttextNode = this.document.createTextNode($tw.utils.entityDecode(entityString));\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEntityWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEntityWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.entity) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.entity = EntityWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/eventcatcher.js": {
            "title": "$:/core/modules/widgets/eventcatcher.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/eventcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nEvent handler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EventWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEventWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEventWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.elementTag && $tw.config.htmlUnsafeElements.indexOf(this.elementTag) === -1) {\n\t\ttag = this.elementTag;\n\t}\t\n\tvar domNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tthis.assignDomNodeClasses();\t\n\t// Add our event handler\n\t$tw.utils.each(this.types,function(type) {\n\t\tdomNode.addEventListener(type,function(event) {\n\t\t\tvar selector = self.getAttribute(\"selector\"),\n\t\t\t\tactions = self.getAttribute(\"actions-\"+type),\n\t\t\t\tselectedNode = event.target,\n\t\t\t\tselectedNodeRect,\n\t\t\t\tcatcherNodeRect,\n\t\t\t\tvariables = {};\n\t\t\tif(selector) {\n\t\t\t\t// Search ancestors for a node that matches the selector\n\t\t\t\twhile(!selectedNode.matches(selector) && selectedNode !== domNode) {\n\t\t\t\t\tselectedNode = selectedNode.parentNode;\n\t\t\t\t}\n\t\t\t\t// If we found one, copy the attributes as variables, otherwise exit\n\t\t\t\tif(selectedNode.matches(selector)) {\n\t\t\t\t\t$tw.utils.each(selectedNode.attributes,function(attribute) {\n\t\t\t\t\t\tvariables[\"dom-\" + attribute.name] = attribute.value.toString();\n\t\t\t\t\t});\n\t\t\t\t\t//Add a variable with a popup coordinate string for the selected node\n\t\t\t\t\tvariables[\"tv-popup-coords\"] = \"(\" + selectedNode.offsetLeft + \",\" + selectedNode.offsetTop +\",\" + selectedNode.offsetWidth + \",\" + selectedNode.offsetHeight + \")\";\n\t\t\t\t\t\n\t\t\t\t\t//Add variables for offset of selected node\n\t\t\t\t\tvariables[\"tv-selectednode-posx\"] = selectedNode.offsetLeft.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-posy\"] = selectedNode.offsetTop.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-width\"] = selectedNode.offsetWidth.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-height\"] = selectedNode.offsetHeight.toString();\n\n\t\t\t\t\t//Add variables for event X and Y position relative to selected node\n\t\t\t\t\tselectedNodeRect = selectedNode.getBoundingClientRect();\t\t\t\t\n\t\t\t\t\tvariables[\"event-fromselected-posx\"] = (event.clientX - selectedNodeRect.left).toString();\n\t\t\t\t\tvariables[\"event-fromselected-posy\"] = (event.clientY - selectedNodeRect.top).toString();\n\n\t\t\t\t\t//Add variables for event X and Y position relative to event catcher node\n\t\t\t\t\tcatcherNodeRect = self.domNode.getBoundingClientRect();\n\t\t\t\t\tvariables[\"event-fromcatcher-posx\"] = (event.clientX - catcherNodeRect.left).toString();\n\t\t\t\t\tvariables[\"event-fromcatcher-posy\"] = (event.clientY - catcherNodeRect.top).toString();\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Execute our actions with the variables\n\t\t\tif(actions) {\n\t\t\t\t// Add a variable for the modifier key\n\t\t\t\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\t\t// Add a variable for the mouse button\n\t\t\t\tif(\"button\" in event) {\n\t\t\t\t\tif(event.button === 0) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"left\";\n\t\t\t\t\t} else if(event.button === 1) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"middle\";\n\t\t\t\t\t} else if(event.button === 2) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"right\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvariables[\"event-type\"] = event.type.toString();\n\t\t\t\tif(typeof event.detail === \"object\" && !!event.detail) {\n\t\t\t\t\t$tw.utils.each(event.detail,function(detailValue,detail) {\n\t\t\t\t\t\tvariables[\"event-detail-\" + detail] = detailValue.toString();\n\t\t\t\t\t});\n\t\t\t\t} else if(!!event.detail) {\n\t\t\t\t\tvariables[\"event-detail\"] = event.detail.toString();\n\t\t\t\t}\n\t\t\t\tself.invokeActionString(actions,self,event,variables);\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},false);\n\t});\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEventWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes that require a refresh on change\n\tthis.types = this.getAttribute(\"events\",\"\").split(\" \");\n\tthis.elementTag = this.getAttribute(\"tag\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nEventWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-eventcatcher\");\n\tthis.domNode.className = classes.join(\" \");\t\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEventWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"events\"] || changedAttributes[\"tag\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.eventcatcher = EventWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/fieldmangler.js": {
            "title": "$:/core/modules/widgets/fieldmangler.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/fieldmangler.js\ntype: application/javascript\nmodule-type: widget\n\nField mangler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\thadInvalidFieldName = false,\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.toLowerCase().trim();\n\t\t\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\t\t\tif(!hadInvalidFieldName) {\n\t\t\t\t\talert($tw.language.getString(\n\t\t\t\t\t\t\"InvalidFieldName\",\n\t\t\t\t\t\t{variables:\n\t\t\t\t\t\t\t{fieldName: trimmedName}\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t\thadInvalidFieldName = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!value && tiddler) {\n\t\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t\t}\n\t\t\t\taddition[trimmedName] = value || \"\";\n\t\t\t}\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t}\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\t$tw.utils.pushTop(modification.tags,tag);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\t\t\t\n\t\t}\n\t} else if(typeof event.param === \"string\" && event.param.trim() !== \"\" && this.mangleTitle.trim() !== \"\") {\n\t\tvar tag = [];\n\t\ttag.push(event.param.trim());\n\t\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.mangleTitle, tags: tag},modification));\n\t}\n\treturn true;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/fields.js": {
            "title": "$:/core/modules/widgets/fields.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/fields.js\ntype: application/javascript\nmodule-type: widget\n\nFields widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.sort = this.getAttribute(\"sort\",\"yes\") === \"yes\";\n\tthis.sortReverse = this.getAttribute(\"sortReverse\",\"no\") === \"yes\";\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.include = this.getAttribute(\"include\",null);\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\n\t// Get the inclusion and exclusion list\n\tvar excludeArr = (this.exclude) ? this.exclude.split(\" \") : [\"text\"];\n\t// Include takes precedence\n\tvar includeArr = (this.include) ? this.include.split(\" \") : null;\n\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tif (includeArr) { // Include takes precedence\n\t\t\tfor(var i=0; i<includeArr.length; i++) {\n\t\t\t\tif(tiddler.fields[includeArr[i]]) {\n\t\t\t\t\tfields.push(includeArr[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\tif(excludeArr.indexOf(fieldName) === -1) {\n\t\t\t\t\tfields.push(fieldName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.sort) fields.sort();\n\t\tif (this.sortReverse) fields.reverse();\n\t\tfor(var f=0, fmax=fields.length; f<fmax; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tvar row = this.template,\n\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\tif(reMatch) {\n\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t}\n\t\t\t}\n\t\t\trow = $tw.utils.replaceString(row,\"$name$\",fieldName);\n\t\t\trow = $tw.utils.replaceString(row,\"$value$\",value);\n\t\t\trow = $tw.utils.replaceString(row,\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\ttext.push(row);\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif( changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude ||\n\t\tchangedAttributes.include || changedAttributes.sort || changedAttributes.sortReverse ||\n\t\tchangedTiddlers[this.tiddlerTitle] || changedAttributes.stripTitlePrefix) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/image.js": {
            "title": "$:/core/modules/widgets/image.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/image.js\ntype: application/javascript\nmodule-type: widget\n\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\n\n```\n<$image src=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\">\n```\n\nThe image source can be the title of an existing tiddler or the URL of an external image.\n\nExternal images always generate an HTML `<img>` tag.\n\nTiddlers that have a _canonical_uri field generate an HTML `<img>` tag with the src attribute containing the URI.\n\nTiddlers that contain image data generate an HTML `<img>` tag with the src attribute containing a base64 representation of the image.\n\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\t// Determine what type of image it is\n\tvar tag = \"img\", src = \"\",\n\t\ttiddler = this.wiki.getTiddler(this.imageSource);\n\tif(!tiddler) {\n\t\t// The source isn't the title of a tiddler, so we'll assume it's a URL\n\t\tsrc = this.getVariable(\"tv-get-export-image-link\",{params: [{name: \"src\",value: this.imageSource}],defaultValue: this.imageSource});\n\t} else {\n\t\t// Check if it is an image tiddler\n\t\tif(this.wiki.isImageTiddler(this.imageSource)) {\n\t\t\tvar type = tiddler.fields.type,\n\t\t\t\ttext = tiddler.fields.text,\n\t\t\t\t_canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t// If the tiddler has body text then it doesn't need to be lazily loaded\n\t\t\tif(text) {\n\t\t\t\t// Render the appropriate element for the image type\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = \"data:application/pdf;base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = \"data:image/svg+xml,\" + encodeURIComponent(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = \"data:\" + type + \";base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t} else {\n\t\t\t\t// Just trigger loading of the tiddler\n\t\t\t\tthis.wiki.getTiddlerText(this.imageSource);\n\t\t\t}\n\t\t}\n\t}\n\t// Create the element and assign the attributes\n\tvar domNode = this.document.createElement(tag);\n\tdomNode.setAttribute(\"src\",src);\n\tif(this.imageClass) {\n\t\tdomNode.setAttribute(\"class\",this.imageClass);\t\t\n\t}\n\tif(this.imageWidth) {\n\t\tdomNode.setAttribute(\"width\",this.imageWidth);\n\t}\n\tif(this.imageHeight) {\n\t\tdomNode.setAttribute(\"height\",this.imageHeight);\n\t}\n\tif(this.imageTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.imageTooltip);\t\t\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImageWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.imageSource = this.getAttribute(\"source\");\n\tthis.imageWidth = this.getAttribute(\"width\");\n\tthis.imageHeight = this.getAttribute(\"height\");\n\tthis.imageClass = this.getAttribute(\"class\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\"class\"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.image = ImageWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/importvariables.js": {
            "title": "$:/core/modules/widgets/importvariables.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/importvariables.js\ntype: application/javascript\nmodule-type: widget\n\nImport variable definitions from other tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImportVariablesWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImportVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImportVariablesWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\n\tvar widgetPointer = this;\n\t// Got to flush all the accumulated variables\n\tthis.variables = new this.variablesConstructor();\n\t// Get our parameters\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Compute the filter\n\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\n\t// Accumulate the <$set> widgets from each tiddler\n\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = widgetPointer.wiki.parseTiddler(title);\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && parseTreeNode.type === \"set\") {\n\t\t\t\tvar node = {\n\t\t\t\t\ttype: \"set\",\n\t\t\t\t\tattributes: parseTreeNode.attributes,\n\t\t\t\t\tparams: parseTreeNode.params,\n\t\t\t\t\tisMacroDefinition: parseTreeNode.isMacroDefinition\n\t\t\t\t};\n\t\t\t\tif (parseTreeNode.isMacroDefinition) {\n\t\t\t\t\t// Macro definitions can be folded into\n\t\t\t\t\t// current widget instead of adding\n\t\t\t\t\t// another link to the chain.\n\t\t\t\t\tvar widget = widgetPointer.makeChildWidget(node);\n\t\t\t\t\twidget.computeAttributes();\n\t\t\t\t\twidget.execute();\n\t\t\t\t\t// We SHALLOW copy over all variables\n\t\t\t\t\t// in widget. We can't use\n\t\t\t\t\t// $tw.utils.assign, because that copies\n\t\t\t\t\t// up the prototype chain, which we\n\t\t\t\t\t// don't want.\n\t\t\t\t\t$tw.utils.each(Object.keys(widget.variables), function(key) {\n\t\t\t\t\t\twidgetPointer.variables[key] = widget.variables[key];\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\twidgetPointer.children = [widgetPointer.makeChildWidget(node)];\n\t\t\t\t\t// No more regenerating children for\n\t\t\t\t\t// this widget. If it needs to refresh,\n\t\t\t\t\t// it'll do so along with the the whole\n\t\t\t\t\t// importvariable tree.\n\t\t\t\t\tif (widgetPointer != this) {\n\t\t\t\t\t\twidgetPointer.makeChildWidgets = function(){};\n\t\t\t\t\t}\n\t\t\t\t\twidgetPointer = widgetPointer.children[0];\n\t\t\t\t}\n\t\t\t\tparseTreeNode = parseTreeNode.children && parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\n\tif (widgetPointer != this) {\n\t\twidgetPointer.parseTreeNode.children = this.parseTreeNode.children;\n\t} else {\n\t\twidgetPointer.makeChildWidgets();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\n\t// Recompute our attributes and the filter list\n\tvar changedAttributes = this.computeAttributes(),\n\t\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\"filter\"),this);\n\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\n\tfunction haveListedTiddlersChanged() {\n\t\tvar changed = false;\n\t\ttiddlerList.forEach(function(title) {\n\t\t\tif(changedTiddlers[title]) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\t\treturn changed;\n\t}\n\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\n\t\t// Compute the filter\n\t\tthis.removeChildDomNodes();\n\t\tthis.execute(tiddlerList);\n\t\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/keyboard.js": {
            "title": "$:/core/modules/widgets/keyboard.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/keyboard.js\ntype: application/javascript\nmodule-type: widget\n\nKeyboard shortcut widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar KeyboardWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKeyboardWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.tag && $tw.config.htmlUnsafeElements.indexOf(this.tag) === -1) {\n\t\ttag = this.tag;\n\t}\n\t// Create element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tdomNode.className = classes.join(\" \");\n\t// Add a keyboard event handler\n\tdomNode.addEventListener(\"keydown\",function (event) {\n\t\tif($tw.keyboardManager.checkKeyDescriptors(event,self.keyInfoArray)) {\n\t\t\tvar handled = self.invokeActions(self,event);\n\t\t\tif(self.actions) {\n\t\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t\t}\n\t\t\tself.dispatchMessage(event);\n\t\t\tif(handled || self.actions || self.message) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\",\"\");\n\tthis.message = this.getAttribute(\"message\",\"\");\n\tthis.param = this.getAttribute(\"param\",\"\");\n\tthis.key = this.getAttribute(\"key\",\"\");\n\tthis.tag = this.getAttribute(\"tag\",\"\");\n\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tif(this.key.substr(0,2) === \"((\" && this.key.substr(-2,2) === \"))\") {\n\t\tthis.shortcutTiddlers = [];\n\t\tvar name = this.key.substring(2,this.key.length -2);\n\t\t$tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {\n\t\t\tself.shortcutTiddlers.push(\"$:/config/\" + platformDescriptor + \"/\" + name);\n\t\t});\n\t}\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes[\"class\"] || changedAttributes.tag) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\t// Update the keyInfoArray if one of its shortcut-config-tiddlers has changed\n\tif(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers)) {\n\t\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/link.js": {
            "title": "$:/core/modules/widgets/link.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true,\n\t\tmissingLinksEnabled = !(this.hideMissingLinks && this.isMissing && !this.isShadow);\n\t// Render the link if required\n\tif(useWikiLinks && missingLinksEnabled) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Sanitise the specified tag\n\tvar tag = this.linkTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"a\";\n\t}\n\t// Create our element\n\tvar namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"}),\n\t\tdomNode = this.document.createElementNS(namespace,tag);\n\t// Assign classes\n\tvar classes = [];\n\tif(this.overrideClasses === undefined) {\n\t\tclasses.push(\"tc-tiddlylink\");\n\t\tif(this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t\t}\n\t\tif(this.isMissing && !this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t\t} else {\n\t\t\tif(!this.isMissing) {\n\t\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t\t}\n\t\t}\n\t\tif(this.linkClasses) {\n\t\t\tclasses.push(this.linkClasses);\t\t\t\n\t\t}\n\t} else if(this.overrideClasses !== \"\") {\n\t\tclasses.push(this.overrideClasses)\n\t}\n\tif(classes.length > 0) {\n\t\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t}\n\t// Set an href\n\tvar wikilinkTransformFilter = this.getVariable(\"tv-filter-export-link\"),\n\t\twikiLinkText;\n\tif(wikilinkTransformFilter) {\n\t\t// Use the filter to construct the href\n\t\twikiLinkText = this.wiki.filterTiddlers(wikilinkTransformFilter,this,function(iterator) {\n\t\t\titerator(self.wiki.getTiddler(self.to),self.to)\n\t\t})[0];\n\t} else {\n\t\t// Expand the tv-wikilink-template variable to construct the href\n\t\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\";\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkTemplate,\"$uri_encoded$\",encodeURIComponent(this.to));\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkText,\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\t}\n\t// Override with the value of tv-get-export-link if defined\n\twikiLinkText = this.getVariable(\"tv-get-export-link\",{params: [{name: \"to\",value: this.to}],defaultValue: wikiLinkText});\n\tif(tag === \"a\") {\n\t\tvar namespaceHref = (namespace === \"http://www.w3.org/2000/svg\") ? \"http://www.w3.org/1999/xlink\" : undefined;\n\t\tdomNode.setAttributeNS(namespaceHref,\"href\",wikiLinkText);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\t// Set the tooltip\n\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \"<$transclude field='tooltip'><$transclude field='title'/></$transclude>\"\n\tvar tooltipWikiText = this.tooltip || this.getVariable(\"tv-wikilink-tooltip\");\n\tif(tooltipWikiText) {\n\t\tvar tooltipText = this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",tooltipWikiText,{\n\t\t\t\tparseAsInline: true,\n\t\t\t\tvariables: {\n\t\t\t\t\tcurrentTiddler: this.to\n\t\t\t\t},\n\t\t\t\tparentWidget: this\n\t\t\t});\n\t\tdomNode.setAttribute(\"title\",tooltipText);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"click\", handlerObject: this, handlerMethod: \"handleClickEvent\"},\n\t]);\n\t// Make the link draggable if required\n\tif(this.draggable === \"yes\") {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.to;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nLinkWidget.prototype.handleClickEvent = function(event) {\n\t// Send the click on its way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tmetaKey: event.metaKey,\n\t\tctrlKey: event.ctrlKey,\n\t\taltKey: event.altKey,\n\t\tshiftKey: event.shiftKey,\n\t\tevent: event\n\t});\n\tif(this.domNodes[0].hasAttribute(\"href\")) {\n\t\tevent.preventDefault();\n\t}\n\tevent.stopPropagation();\n\treturn false;\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.linkClasses = this.getAttribute(\"class\");\n\tthis.overrideClasses = this.getAttribute(\"overrideClass\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.draggable = this.getAttribute(\"draggable\",\"yes\");\n\tthis.linkTag = this.getAttribute(\"tag\",\"a\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\tthis.hideMissingLinks = (this.getVariable(\"tv-show-missing-links\") || \"yes\") === \"no\";\n\t// Make the child widgets\n\tvar templateTree;\n\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\ttemplateTree = this.parseTreeNode.children;\n\t} else {\n\t\t// Default template is a link to the title\n\t\ttemplateTree = [{type: \"text\", text: this.to}];\n\t}\n\tthis.makeChildWidgets(templateTree);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\"aria-label\"] || changedAttributes.tooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/linkcatcher.js": {
            "title": "$:/core/modules/widgets/linkcatcher.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/linkcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nLinkcatcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\tthis.catchActions = this.getAttribute(\"actions\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n\t// When executing actions we avoid trapping navigate events, so that we don't trigger ourselves recursively\n\tthis.executingActions = false;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n/*\nHandle a tm-navigate event\n*/\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\n\tif(!this.executingActions) {\n\t\t// Execute the actions\n\t\tif(this.catchTo) {\n\t\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t\t}\n\t\tif(this.catchMessage && this.parentWidget) {\n\t\t\tthis.parentWidget.dispatchEvent({\n\t\t\t\ttype: this.catchMessage,\n\t\t\t\tparam: event.navigateTo,\n\t\t\t\tnavigateTo: event.navigateTo\n\t\t\t});\n\t\t}\n\t\tif(this.catchSet) {\n\t\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t\t}\n\t\tif(this.catchActions) {\n\t\t\tthis.executingActions = true;\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tthis.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo, modifier: modifierKey});\n\t\t\tthis.executingActions = false;\n\t\t}\n\t} else {\n\t\t// This is a navigate event generated by the actions of this linkcatcher, so we don't trap it again, but just pass it to the parent\n\t\tthis.parentWidget.dispatchEvent({\n\t\t\ttype: \"tm-navigate\",\n\t\t\tparam: event.navigateTo,\n\t\t\tnavigateTo: event.navigateTo\n\t\t});\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/list.js": {
            "title": "$:/core/modules/widgets/list.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/list.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar ListWidget = function(parseTreeNode,options) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(this.storyViewName && !StoryView) {\n\t\tStoryView = this.storyViews[\"classic\"];\n\t}\n\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\n\t\tthis.storyview = new StoryView(this);\n\t} else {\n\t\tthis.storyview = null;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function() {\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this;\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n\t// Clear the last history\n\tthis.history = [];\n};\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\treturn this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar parser,\n\t\temptyMessage = this.getAttribute(\"emptyMessage\",\"\");\n\t// this.wiki.parseText() calls \n\t// new Parser(..), which should only be done, if needed, because it's heavy!\n\tif (emptyMessage === \"\") {\n\t\treturn [];\n\t}\n\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\treturn {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tresult;\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshStart) {\n\t\tthis.storyview.refreshStart(changedTiddlers,changedAttributes);\n\t}\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\tresult = true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tresult = this.handleListChanges(changedTiddlers);\n\t\t// Handle any changes to the history stack\n\t\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\n\t\t\tthis.handleHistoryChanges();\n\t\t}\n\t}\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshEnd) {\n\t\tthis.storyview.refreshEnd(changedTiddlers,changedAttributes);\n\t}\n\treturn result;\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerDataCached(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// Cycle through the list, inserting and removing list items as needed\n\t\tvar hasRefreshed = false;\n\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\tif(index === undefined) {\n\t\t\t\t// The list item must be inserted\n\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\thasRefreshed = true;\n\t\t\t} else {\n\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t}\n\t\t\t\t// Refresh the item we're reusing\n\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n})();",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/log.js": {
            "title": "$:/core/modules/widgets/log.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/log.js\ntype: application/javascript\nmodule-type: widget-subclass\n\nWidget to log debug messages\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.baseClass = \"action-log\";\n\nexports.name = \"log\";\n\nexports.constructor = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n}\n\nexports.prototype = {};\n\nexports.prototype.render = function(event) {\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this,event);\t\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).log.call(this);\n}\n\n})();",
            "type": "application/javascript",
            "module-type": "widget-subclass"
        },
        "$:/core/modules/widgets/macrocall.js": {
            "title": "$:/core/modules/widgets/macrocall.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/macrocall.js\ntype: application/javascript\nmodule-type: widget\n\nMacrocall widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MacroCallWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMacroCallWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMacroCallWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMacroCallWidget.prototype.execute = function() {\n\t// Get the parse type if specified\n\tthis.parseType = this.getAttribute(\"$type\",\"text/vnd.tiddlywiki\");\n\tthis.renderOutput = this.getAttribute(\"$output\",\"text/html\");\n\t// Merge together the parameters specified in the parse tree with the specified attributes\n\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparams.push({name: name, value: attribute});\t\t\t\n\t\t}\n\t});\n\t// Get the macro value\n\tvar macroName = this.parseTreeNode.name || this.getAttribute(\"$name\"),\n\t\tvariableInfo = this.getVariableInfo(macroName,{params: params}),\n\t\ttext = variableInfo.text,\n\t\tparseTreeNodes;\n\t// Are we rendering to HTML?\n\tif(this.renderOutput === \"text/html\") {\n\t\t// If so we'll return the parsed macro\n\t\t// Check if we've already cached parsing this macro\n\t\tvar mode = this.parseTreeNode.isBlock ? \"blockParser\" : \"inlineParser\",\n\t\t\tparser;\n\t\tif(variableInfo.srcVariable && variableInfo.srcVariable[mode]) {\n\t\t\tparser = variableInfo.srcVariable[mode];\n\t\t} else {\n\t\t\tparser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\t\tif(variableInfo.isCacheable && variableInfo.srcVariable) {\n\t\t\t\tvariableInfo.srcVariable[mode] = parser;\n\t\t\t}\n\t\t}\n\t\tvar parseTreeNodes = parser ? parser.tree : [];\n\t\t// Wrap the parse tree in a vars widget assigning the parameters to variables named \"__paramname__\"\n\t\tvar attributes = {};\n\t\t$tw.utils.each(variableInfo.params,function(param) {\n\t\t\tvar name = \"__\" + param.name + \"__\";\n\t\t\tattributes[name] = {\n\t\t\t\tname: name,\n\t\t\t\ttype: \"string\",\n\t\t\t\tvalue: param.value\n\t\t\t};\n\t\t});\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"vars\",\n\t\t\tattributes: attributes,\n\t\t\tchildren: parseTreeNodes\n\t\t}];\n\t} else if(this.renderOutput === \"text/raw\") {\n\t\tparseTreeNodes = [{type: \"text\", text: text}];\n\t} else {\n\t\t// Otherwise, we'll render the text\n\t\tvar plainText = this.wiki.renderText(\"text/plain\",this.parseType,text,{parentWidget: this});\n\t\tparseTreeNodes = [{type: \"text\", text: plainText}];\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\t// Rerender ourselves\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.macrocall = MacroCallWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/navigator.js": {
            "title": "$:/core/modules/widgets/navigator.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"},\n\t\t{type: \"tm-fold-tiddler\", handler: \"handleFoldTiddlerEvent\"},\n\t\t{type: \"tm-fold-other-tiddlers\", handler: \"handleFoldOtherTiddlersEvent\"},\n\t\t{type: \"tm-fold-all-tiddlers\", handler: \"handleFoldAllTiddlersEvent\"},\n\t\t{type: \"tm-unfold-all-tiddlers\", handler: \"handleUnfoldAllTiddlersEvent\"},\n\t\t{type: \"tm-rename-tiddler\", handler: \"handleRenameTiddlerEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\tthis.setVariable(\"tv-story-list\",this.storyTitle);\n\tthis.setVariable(\"tv-history-list\",this.historyTitle);\n\tthis.story = new $tw.Story({\n\t\twiki: this.wiki,\n\t\tstoryTitle: this.storyTitle,\n\t\thistoryTitle: this.historyTitle\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tif(this.storyTitle) {\n\t\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t\t{title: this.storyTitle},\n\t\t\tstoryTiddler,\n\t\t\t{list: storyList}\n\t\t));\t\t\n\t}\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tif(storyList) {\n\t\tvar p = storyList.indexOf(title);\n\t\twhile(p !== -1) {\n\t\t\tstoryList.splice(p,1);\n\t\t\tp = storyList.indexOf(title);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tif(storyList) {\n\t\tvar pos = storyList.indexOf(oldTitle);\n\t\tif(pos !== -1) {\n\t\t\tstoryList[pos] = newTitle;\n\t\t\tdo {\n\t\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\t\tif(pos !== -1) {\n\t\t\t\t\tstoryList.splice(pos,1);\n\t\t\t\t}\n\t\t\t} while(pos !== -1);\n\t\t} else {\n\t\t\tstoryList.splice(0,0,newTitle);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tif(this.storyTitle) {\n\t\tthis.story.addToStory(title,fromTitle,{\n\t\t\topenLinkFromInsideRiver: this.getAttribute(\"openLinkFromInsideRiver\",\"top\"),\n\t\t\topenLinkFromOutsideRiver: this.getAttribute(\"openLinkFromOutsideRiver\",\"top\")\n\t\t});\n\t}\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.story.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-navigating\",event);\n\tif(event.navigateTo) {\n\t\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\t\tif(!event.navigateSuppressNavigation) {\n\t\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t\t}\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar editTiddler = $tw.hooks.invokeHook(\"th-editing-tiddler\",event);\n\tif(!editTiddler) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title);\n\t// Update the story and history if required\n\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\tvar draftTitle = draftTiddler.fields.title,\n\t\t\tstoryList = this.getStoryList();\n\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\tthis.saveStoryList(storyList);\n\t\treturn false;\n\t}\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler ? tiddler.fields[\"draft.of\"] : \"\",\n\t\toriginalTiddler = originalTitle ? this.wiki.getTiddler(originalTitle) : undefined,\n\t\tconfirmationTitle;\n\tif(!tiddler) {\n\t\treturn false;\n\t}\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tif(originalTiddler) {\n\t\t\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",originalTiddler);\n\t\t}\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Invoke the hook function and delete this tiddler\n\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",tiddler);\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\t\ttext: \"\",\n\t\t\t},\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\treturn this.wiki.generateDraftTitle(title);\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Create the new tiddler and pass it through the th-saving-tiddler hook\n\t\t\t\tvar newTiddler = new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields());\n\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-saving-tiddler\",newTiddler,tiddler);\n\t\t\t\tthis.wiki.addTiddler(newTiddler);\n\t\t\t\t// If enabled, relink references to renamed tiddler\n\t\t\t\tvar shouldRelink = this.getAttribute(\"relinkOnRename\",\"no\").toLowerCase().trim() === \"yes\";\n\t\t\t\tif(isRename && shouldRelink && this.wiki.tiddlerExists(draftOf)) {\n\t\t\t\t\tthis.wiki.relinkTiddler(draftOf,draftTitle);\n\t\t\t\t}\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// #2381 always remove new title & old\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\tthis.removeTitleFromStory(storyList,draftOf);\n\t\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-cancelling-tiddler\", event);\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"];\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\tif(originalTiddler) {\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t\t} else {\n\t\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\t}\n\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-new-tiddler\", event);\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Make a copy of the additional fields excluding any blank ones\n\tvar filteredAdditionalFields = $tw.utils.extend({},additionalFields);\n\tObject.keys(filteredAdditionalFields).forEach(function(fieldName) {\n\t\tif(filteredAdditionalFields[fieldName] === \"\") {\n\t\t\tdelete filteredAdditionalFields[fieldName];\n\t\t}\n\t});\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags);\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\texistingTiddler,\n\t\tfilteredAdditionalFields,\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList && storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tif(slot === -1) {\n\t\t\tslot = this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\" ? storyList.length - 1 : slot;\n\t\t}\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList && storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTitle = event.importTitle ? event.importTitle : IMPORT_TITLE,\n\t\timportTiddler = this.wiki.getTiddler(importTitle),\n\t\timportData = this.wiki.getTiddlerData(importTitle,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: importTitle,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\ttiddlerFields.title = $tw.utils.trim(tiddlerFields.title);\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t\tnewFields[\"suppressed-\" + title] = \"yes\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tvar autoOpenOnImport = event.autoOpenOnImport ? event.autoOpenOnImport : this.getVariable(\"tv-auto-open-on-import\");  \n\tif(autoOpenOnImport !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList && storyList.indexOf(importTitle) === -1) {\n\t\t\tstoryList.unshift(importTitle);\n\t\t}\n\t\t// And to history\n\t\thistory.push(importTitle);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\n\t}\n\treturn false;\n};\n\n//\nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push($tw.language.getString(\"Import/Imported/Hint\") + \"\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tif($tw.utils.hop(importTiddler.fields,[\"rename-\" + title])) {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields,{title : importTiddler.fields[\"rename-\" + title]});\n\t\t\t} else {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\t\t\t}\n\t\t\ttiddler = $tw.hooks.invokeHook(\"th-importing-tiddler\",tiddler);\n\t\t\tself.wiki.addTiddler(tiddler);\n\t\t\timportReport.push(\"# [[\" + tiddler.fields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: event.param,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([event.param]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {};\n\tif(paramObject.foldedState) {\n\t\tvar foldedState = this.wiki.getTiddlerText(paramObject.foldedState,\"show\") === \"show\" ? \"hide\" : \"show\";\n\t\tthis.wiki.setText(paramObject.foldedState,\"text\",null,foldedState);\n\t}\n};\n\nNavigatorWidget.prototype.handleFoldOtherTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,event.param === title ? \"show\" : \"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleFoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix || \"$:/state/folded/\";\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"show\");\n\t});\n};\n\nNavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) {\n\tvar options = {},\n\t\tparamObject = event.paramObject || {},\n\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\tto = paramObject.to;\n\toptions.dontRenameInTags = (paramObject.renameInTags === \"false\" || paramObject.renameInTags === \"no\") ? true : false;\n\toptions.dontRenameInLists = (paramObject.renameInLists === \"false\" || paramObject.renameInLists === \"no\") ? true : false;\n\tthis.wiki.renameTiddler(from,to,options);\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/password.js": {
            "title": "$:/core/modules/widgets/password.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/password.js\ntype: application/javascript\nmodule-type: widget\n\nPassword widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar PasswordWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nPasswordWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nPasswordWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the current password\n\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \"\" : \"\";\n\t// Create our element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"password\");\n\tdomNode.setAttribute(\"value\",password);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nPasswordWidget.prototype.handleChangeEvent = function(event) {\n\tvar password = this.domNodes[0].value;\n\treturn $tw.utils.savePassword(this.passwordName,password);\n};\n\n/*\nCompute the internal state of the widget\n*/\nPasswordWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.passwordName = this.getAttribute(\"name\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.password = PasswordWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/qualify.js": {
            "title": "$:/core/modules/widgets/qualify.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/qualify.js\ntype: application/javascript\nmodule-type: widget\n\nQualify text to a variable \n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar QualifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nQualifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nQualifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nQualifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.qualifyName = this.getAttribute(\"name\");\n\tthis.qualifyTitle = this.getAttribute(\"title\");\n\t// Set context variable\n\tif(this.qualifyName) {\n\t\tthis.setVariable(this.qualifyName,this.qualifyTitle + \"-\" + this.getStateQualifier());\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nQualifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.title) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.qualify = QualifyWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/radio.js": {
            "title": "$:/core/modules/widgets/radio.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nSet a field or index at a given tiddler via radio buttons\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tvar isChecked = this.getValue() === this.radioValue;\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",\n\t\t\"tc-radio \" + this.radioClass + (isChecked ? \" tc-radio-selected\" : \"\")\n\t);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tif(isChecked) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar value,\n\t\ttiddler = this.wiki.getTiddler(this.radioTitle);\n\tif (this.radioIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex);\n\t} else {\n\t\tvalue = tiddler && tiddler.getFieldString(this.radioField);\n\t}\n\treturn value;\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioIndex) {\n\t\tthis.wiki.setText(this.radioTitle,\"\",this.radioIndex,this.radioValue);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\n\t\t\taddition = {};\n\t\taddition[this.radioField] = this.radioValue;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),{title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\n\t}\n};\n\nRadioWidget.prototype.handleChangeEvent = function(event) {\n\tif(this.inputDomNode.checked) {\n\t\tthis.setValue();\n\t}\n\t// Trigger actions\n\tif(this.radioActions) {\n\t\tthis.invokeActionString(this.radioActions,this,event,{\"actionValue\": this.radioValue});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRadioWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.radioTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.radioField = this.getAttribute(\"field\",\"text\");\n\tthis.radioIndex = this.getAttribute(\"index\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\tthis.radioActions = this.getAttribute(\"actions\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(($tw.utils.count(changedAttributes) > 0) || changedTiddlers[this.radioTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/range.js": {
            "title": "$:/core/modules/widgets/range.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/range.js\ntype: application/javascript\nmodule-type: widget\n\nRange widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RangeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRangeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRangeWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"range\");\n\tthis.inputDomNode.setAttribute(\"class\",this.elementClass);\n\tif(this.minValue){\n\t\tthis.inputDomNode.setAttribute(\"min\", this.minValue);\n\t}\n\tif(this.maxValue){\n\t\tthis.inputDomNode.setAttribute(\"max\", this.maxValue);\n\t}\n\tif(this.increment){\n\t\tthis.inputDomNode.setAttribute(\"step\", this.increment);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.inputDomNode.value = this.getValue();\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name:\"mousedown\", handlerObject:this, handlerMethod:\"handleMouseDownEvent\"},\n\t\t{name:\"mouseup\",   handlerObject:this, handlerMethod:\"handleMouseUpEvent\"},\n\t\t{name:\"change\",    handlerObject:this, handlerMethod:\"handleChangeEvent\"},\n\t\t{name:\"input\",     handlerObject:this, handlerMethod:\"handleInputEvent\"},\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.inputDomNode,nextSibling);\n\tthis.domNodes.push(this.inputDomNode);\n};\n\nRangeWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle),\n\t\tfieldName = this.tiddlerField,\n\t\tvalue = this.defaultValue;\n\tif(tiddler) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(tiddler,this.tiddlerIndex,this.defaultValue);\n\t\t} else {\n\t\t\tif($tw.utils.hop(tiddler.fields,fieldName)) {\n\t\t\t\tvalue = tiddler.fields[fieldName] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.defaultValue;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nRangeWidget.prototype.getActionVariables = function(options) {\n\toptions = options || {};\n\tvar hasChanged = (this.startValue !== this.inputDomNode.value) ? \"yes\" : \"no\";\n\t// Trigger actions. Use variables = {key:value, key:value ...}\n\t// the \"value\" is needed.\n\treturn $tw.utils.extend({\"actionValue\": this.inputDomNode.value, \"actionValueHasChanged\": hasChanged}, options);\n}\n\n// actionsStart\nRangeWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.mouseDown = true; // TODO remove once IE is gone.\n\tthis.startValue = this.inputDomNode.value; // TODO remove this line once IE is gone!\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseDown) {\n\t\tvar variables = this.getActionVariables() // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsMouseDown,this,event,variables);\n\t}\n}\n\n// actionsStop\nRangeWidget.prototype.handleMouseUpEvent = function(event) {\n\tthis.mouseDown = false; // TODO remove once IE is gone.\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseUp) {\n\t\tvar variables = this.getActionVariables()\n\t\tthis.invokeActionString(this.actionsMouseUp,this,event,variables);\n\t}\n\t// TODO remove the following if() once IE is gone!\n\tif ($tw.browser.isIE) {\n\t\tif (this.startValue !== this.inputDomNode.value) {\n\t\t\tthis.handleChangeEvent(event);\n\t\t\tthis.startValue = this.inputDomNode.value;\n\t\t}\n\t}\n}\n\nRangeWidget.prototype.handleChangeEvent = function(event) {\n\tif (this.mouseDown) {  // TODO refactor this function once IE is gone.\n\t\tthis.handleInputEvent(event);\n\t}\n};\n\nRangeWidget.prototype.handleInputEvent = function(event) {\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsInput) {\n\t\t// \"tiddler\" parameter may be missing. See .execute() below\n\t\tvar variables = this.getActionVariables({\"actionValueHasChanged\": \"yes\"}) // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsInput,this,event,variables);\n\t}\n};\n\nRangeWidget.prototype.handleEvent = function(event) {\n\tif(this.getValue() !== this.inputDomNode.value) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,\"\",this.tiddlerIndex,this.inputDomNode.value);\n\t\t} else {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,this.tiddlerField,null,this.inputDomNode.value);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRangeWidget.prototype.execute = function() {\n\t// TODO remove the next 1 lines once IE is gone!\n\tthis.mouseUp = true; // Needed for IE10\n\t// Get the parameters from the attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.tiddlerField = this.getAttribute(\"field\",\"text\");\n\tthis.tiddlerIndex = this.getAttribute(\"index\");\n\tthis.minValue = this.getAttribute(\"min\");\n\tthis.maxValue = this.getAttribute(\"max\");\n\tthis.increment = this.getAttribute(\"increment\");\n\tthis.defaultValue = this.getAttribute(\"default\",\"\");\n\tthis.elementClass = this.getAttribute(\"class\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Actions since 5.1.23\n\t// Next 2 only fire once!\n\tthis.actionsMouseDown = this.getAttribute(\"actionsStart\",\"\");\n\tthis.actionsMouseUp = this.getAttribute(\"actionsStop\",\"\");\n\t// Input fires very often!\n\tthis.actionsInput = this.getAttribute(\"actions\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRangeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.tiddlerTitle]) {\n\t\t\tvar value = this.getValue();\n\t\t\tif(this.inputDomNode.value !== value) {\n\t\t\t\tthis.inputDomNode.value = value;\n\t\t\t}\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.range = RangeWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/raw.js": {
            "title": "$:/core/modules/widgets/raw.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nRaw widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar div = this.document.createElement(\"div\");\n\tdiv.innerHTML=this.parseTreeNode.html;\n\tparent.insertBefore(div,nextSibling);\n\tthis.domNodes.push(div);\t\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.raw = RawWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/reveal.js": {
            "title": "$:/core/modules/widgets/reveal.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.revealTag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\n\t\ttag = this.revealTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tvar left,top;\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"belowright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\t\t\t\n\t\tcase \"right\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tleft = this.popup.left + this.popup.width - domNode.offsetWidth;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t\tcase \"aboveleft\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\t\t\t\n\t\tdefault: // Below\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t}\n\tif(!this.positionAllowNegative) {\n\t\tleft = Math.max(0,left);\n\t\ttop = Math.max(0,top);\n\t}\n\tdomNode.style.left = left + \"px\";\n\tdomNode.style.top = top + \"px\";\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.revealTag = this.getAttribute(\"tag\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis.positionAllowNegative = this.getAttribute(\"positionAllowNegative\") === \"yes\";\n\t// class attribute handled in assignDomNodeClasses()\n\tthis.style = this.getAttribute(\"style\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\tthis.updatePopupPosition = this.getAttribute(\"updatePopupPosition\",\"no\") === \"yes\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTiddlerTitle = this.state;\n\tthis.stateTitle = this.getAttribute(\"stateTitle\");\n\tthis.stateField = this.getAttribute(\"stateField\");\n\tthis.stateIndex = this.getAttribute(\"stateIndex\");\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state,\n\t    defaultState = this[\"default\"];\n\tif(this.stateTitle) {\n\t\tvar stateTitleTiddler = this.wiki.getTiddler(this.stateTitle);\n\t\tif(this.stateField) {\n\t\t\tstate = stateTitleTiddler ? stateTitleTiddler.getFieldString(this.stateField) || defaultState : defaultState;\n\t\t} else if(this.stateIndex) {\n\t\t\tstate = stateTitleTiddler ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) || defaultState : defaultState;\n\t\t} else if(stateTitleTiddler) {\n\t\t\tstate = this.wiki.getTiddlerText(this.stateTitle) || defaultState;\n\t\t} else {\n\t\t\tstate = defaultState;\n\t\t}\n\t} else {\n\t\tstate = this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\t}\n\tif(state === null) {\n\t\tstate = this[\"default\"];\n\t}\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.isOpen = this.text === state;\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.isOpen = this.text !== state;\n\t\t\tbreak;\n\t\tcase \"lt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t\tcase \"gt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"lteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"gteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.compareStateText = function(state) {\n\treturn state.localeCompare(this.text,undefined,{numeric: true,sensitivity: \"case\"});\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(state);\n\t// Check if the state matches the location regexp\n\tif(match) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t\t// Get the location\n\t\tthis.popup = {\n\t\t\tleft: parseFloat(match[1]),\n\t\t\ttop: parseFloat(match[2]),\n\t\t\twidth: parseFloat(match[3]),\n\t\t\theight: parseFloat(match[4])\n\t\t};\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\nRevealWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-reveal\");\n\tthis.domNode.className = classes.join(\" \");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes.positionAllowNegative || changedAttributes[\"default\"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar currentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tthis.refreshSelf();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if(this.type === \"popup\" && this.updatePopupPosition && (changedTiddlers[this.state] || changedTiddlers[this.stateTitle])) {\n\t\t\tthis.positionPopup(this.domNode);\n\t\t}\n\t\tif(changedAttributes.style) {\n\t\t\tthis.domNode.style = this.getAttribute(\"style\",\"\");\n\t\t}\n\t\tif(changedAttributes[\"class\"]) {\n\t\t\tthis.assignDomNodeClasses();\n\t\t}\t\t\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\tvar self = this;\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n        $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\t//make sure that the state hasn't changed during the close animation\n\t\t\tself.readState()\n\t\t\tif(!self.isOpen) {\n\t\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t\t\t}\n\t\t}});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/scrollable.js": {
            "title": "$:/core/modules/widgets/scrollable.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/scrollable.js\ntype: application/javascript\nmodule-type: widget\n\nScrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tif(event.paramObject && event.paramObject.selector) {\n\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector);\n\t} else {\n\t\tthis.scrollIntoView(event.target);\t\t\t\n\t}\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\tsrcWindow = element ? element.ownerDocument.defaultView : window;\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\nScrollableWidget.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) {\n\tbaseElement = baseElement || document.body;\n\tvar element = baseElement.querySelector(selector);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback);\t\t\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/select.js": {
            "title": "$:/core/modules/widgets/select.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/select.js\ntype: application/javascript\nmodule-type: widget\n\nSelect widget:\n\n```\n<$select tiddler=\"MyTiddler\" field=\"text\">\n<$list filter=\"[tag[chapter]]\">\n<option value=<<currentTiddler>>>\n<$view field=\"description\"/>\n</option>\n</$list>\n</$select>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SelectWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSelectWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSelectWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tthis.setSelectValue();\n\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n};\n\n/*\nHandle a change event\n*/\nSelectWidget.prototype.handleChangeEvent = function(event) {\n\t// Get the new value and assign it to the tiddler\n\tif(this.selectMultiple == false) {\n\t\tvar value = this.getSelectDomNode().value;\n\t} else {\n\t\tvar value = this.getSelectValues()\n\t\t\t\tvalue = $tw.utils.stringifyList(value);\n\t}\n\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\n\t// Trigger actions\n\tif(this.selectActions) {\n\t\tthis.invokeActionString(this.selectActions,this,event);\n\t}\n};\n\n/*\nIf necessary, set the value of the select element to the current value\n*/\nSelectWidget.prototype.setSelectValue = function() {\n\tvar value = this.selectDefault;\n\t// Get the value\n\tif(this.selectIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex,value);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\n\t\tif(tiddler) {\n\t\t\tif(this.selectField === \"text\") {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.selectTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.selectField);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.selectField === \"title\") {\n\t\t\t\tvalue = this.selectTitle;\n\t\t\t}\n\t\t}\n\t}\n\t// Assign it to the select element if it's different than the current value\n\tif (this.selectMultiple) {\n\t\tvalue = value === undefined ? \"\" : value;\n\t\tvar select = this.getSelectDomNode();\n\t\tvar values = Array.isArray(value) ? value : $tw.utils.parseStringArray(value);\n\t\tfor(var i=0; i < select.children.length; i++){\n\t\t\tselect.children[i].selected = values.indexOf(select.children[i].value) !== -1\n\t\t}\n\t} else {\n\t\tvar domNode = this.getSelectDomNode();\n\t\tif(domNode.value !== value) {\n\t\t\tdomNode.value = value;\n\t\t}\n\t}\n};\n\n/*\nGet the DOM node of the select element\n*/\nSelectWidget.prototype.getSelectDomNode = function() {\n\treturn this.children[0].domNodes[0];\n};\n\n// Return an array of the selected opion values\n// select is an HTML select element\nSelectWidget.prototype.getSelectValues = function() {\n\tvar select, result, options, opt;\n\tselect = this.getSelectDomNode();\n\tresult = [];\n\toptions = select && select.options;\n\tfor (var i=0; i<options.length; i++) {\n\t\topt = options[i];\n\t\tif (opt.selected) {\n\t\t\tresult.push(opt.value || opt.text);\n\t\t}\n\t}\n\treturn result;\n}\n\n/*\nCompute the internal state of the widget\n*/\nSelectWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.selectActions = this.getAttribute(\"actions\");\n\tthis.selectTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.selectField = this.getAttribute(\"field\",\"text\");\n\tthis.selectIndex = this.getAttribute(\"index\");\n\tthis.selectClass = this.getAttribute(\"class\");\n\tthis.selectDefault = this.getAttribute(\"default\");\n\tthis.selectMultiple = this.getAttribute(\"multiple\", false);\n\tthis.selectSize = this.getAttribute(\"size\");\n\tthis.selectTooltip = this.getAttribute(\"tooltip\");\n\t// Make the child widgets\n\tvar selectNode = {\n\t\ttype: \"element\",\n\t\ttag: \"select\",\n\t\tchildren: this.parseTreeNode.children\n\t};\n\tif(this.selectClass) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"class\",this.selectClass);\n\t}\n\tif(this.selectMultiple) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"multiple\",\"multiple\");\n\t}\n\tif(this.selectSize) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"size\",this.selectSize);\n\t}\n\tif(this.selectTooltip) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"title\",this.selectTooltip);\n\t}\n\tthis.makeChildWidgets([selectNode]);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSelectWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// If we're using a different tiddler/field/index then completely refresh ourselves\n\tif(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex || changedAttributes.selectTooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t// If the target tiddler value has changed, just update setting and refresh the children\n\t} else {\n\t\tvar childrenRefreshed = this.refreshChildren(changedTiddlers);\n\t\tif(changedTiddlers[this.selectTitle] || childrenRefreshed) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn childrenRefreshed;\n\t}\n};\n\nexports.select = SelectWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/set.js": {
            "title": "$:/core/modules/widgets/set.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/set.js\ntype: application/javascript\nmodule-type: widget\n\nSet variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.setName = this.getAttribute(\"name\",\"currentTiddler\");\n\tthis.setFilter = this.getAttribute(\"filter\");\n\tthis.setSelect = this.getAttribute(\"select\");\n\tthis.setTiddler = this.getAttribute(\"tiddler\");\n\tthis.setSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.setField = this.getAttribute(\"field\");\n\tthis.setIndex = this.getAttribute(\"index\");\n\tthis.setValue = this.getAttribute(\"value\");\n\tthis.setEmptyValue = this.getAttribute(\"emptyValue\");\n\t// Set context variable\n\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,!!this.parseTreeNode.isMacroDefinition);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nGet the value to be assigned\n*/\nSetWidget.prototype.getValue = function() {\n\tvar value = this.setValue;\n\tif(this.setTiddler) {\n\t\tvar tiddler;\n\t\tif(this.setSubTiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.setTiddler,this.setSubTiddler);\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.setTiddler);\t\t\t\n\t\t}\n\t\tif(!tiddler) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t} else if(this.setField) {\n\t\t\tvalue = tiddler.getFieldString(this.setField) || this.setEmptyValue;\n\t\t} else if(this.setIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.setTiddler,this.setIndex,this.setEmptyValue);\n\t\t} else {\n\t\t\tvalue = tiddler.fields.text || this.setEmptyValue ;\n\t\t}\n\t} else if(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(this.setValue == null) {\n\t\t\tvar select;\n\t\t\tif(this.setSelect) {\n\t\t\t\tselect = parseInt(this.setSelect,10);\n\t\t\t}\n\t\t\tif(select !== undefined) {\n\t\t\t\tvalue = results[select] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = $tw.utils.stringifyList(results);\t\t\t\n\t\t\t}\n\t\t}\n\t\tif(results.length === 0 && this.setEmptyValue !== undefined) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t}\n\t} else if(!value && this.setEmptyValue) {\n\t\tvalue = this.setEmptyValue;\n\t}\n\treturn value || \"\";\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.select || changedAttributes.tiddler || (this.setTiddler && changedTiddlers[this.setTiddler]) || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes.emptyValue ||\n\t   (this.setFilter && this.getValue() != this.variables[this.setName].value)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.setvariable = SetWidget;\nexports.set = SetWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/text.js": {
            "title": "$:/core/modules/widgets/text.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/text.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TextNodeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTextNodeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\ttext = text.replace(/\\r/mg,\"\");\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTextNodeWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.text = TextNodeWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/tiddler.js": {
            "title": "$:/core/modules/widgets/tiddler.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/tiddler.js\ntype: application/javascript\nmodule-type: widget\n\nTiddler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTiddlerWidget.prototype.execute = function() {\n\tthis.tiddlerState = this.computeTiddlerState();\n\tthis.setVariable(\"currentTiddler\",this.tiddlerState.currentTiddler);\n\tthis.setVariable(\"missingTiddlerClass\",this.tiddlerState.missingTiddlerClass);\n\tthis.setVariable(\"shadowTiddlerClass\",this.tiddlerState.shadowTiddlerClass);\n\tthis.setVariable(\"systemTiddlerClass\",this.tiddlerState.systemTiddlerClass);\n\tthis.setVariable(\"tiddlerTagClasses\",this.tiddlerState.tiddlerTagClasses);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nCompute the tiddler state flags\n*/\nTiddlerWidget.prototype.computeTiddlerState = function() {\n\t// Get our parameters\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Compute the state\n\tvar state = {\n\t\tcurrentTiddler: this.tiddlerTitle || \"\",\n\t\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \"tc-tiddler-exists\" : \"tc-tiddler-missing\",\n\t\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \"tc-tiddler-shadow\" : \"\",\n\t\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \"tc-tiddler-system\" : \"\",\n\t\ttiddlerTagClasses: this.getTagClasses()\n\t};\n\t// Compute a simple hash to make it easier to detect changes\n\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\n\treturn state;\n};\n\n/*\nCreate a string of CSS classes derived from the tags of the current tiddler\n*/\nTiddlerWidget.prototype.getTagClasses = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\tif(tiddler) {\n\t\tvar tags = [];\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\ttags.push(\"tc-tagged-\" + encodeURIComponent(tag));\n\t\t});\n\t\treturn tags.join(\" \");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tnewTiddlerState = this.computeTiddlerState();\n\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.tiddler = TiddlerWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/transclude.js": {
            "title": "$:/core/modules/widgets/transclude.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/transclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.transcludeField = this.getAttribute(\"field\");\n\tthis.transcludeIndex = this.getAttribute(\"index\");\n\tthis.transcludeMode = this.getAttribute(\"mode\");\n\tthis.recursionMarker = this.getAttribute(\"recursionMarker\",\"yes\");\n\t// Parse the text reference\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\tvar parser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler\n\t\t\t\t\t\t}),\n\t\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Set context variables for recursion detection\n\tvar recursionMarker = this.makeRecursionMarker();\n\tif(this.recursionMarker === \"yes\") {\n\t\tthis.setVariable(\"transclusion\",recursionMarker);\n\t}\n\t// Check for recursion\n\tif(parser) {\n\t\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: $tw.language.getString(\"Error/RecursiveTransclusion\")}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/vars.js": {
            "title": "$:/core/modules/widgets/vars.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/vars.js\ntype: application/javascript\nmodule-type: widget\n\nThis widget allows multiple variables to be set in one go:\n\n```\n\\define helloworld() Hello world!\n<$vars greeting=\"Hi\" me={{!!title}} sentence=<<helloworld>>>\n  <<greeting>>! I am <<me>> and I say: <<sentence>>\n</$vars>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar VarsWidget = function(parseTreeNode,options) {\n\t// Call the constructor\n\tWidget.call(this);\n\t// Initialise\t\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nVarsWidget.prototype = Object.create(Widget.prototype);\n\n/*\nRender this widget into the DOM\n*/\nVarsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nVarsWidget.prototype.execute = function() {\n\t// Parse variables\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(val,key) {\n\t\tif(key.charAt(0) !== \"$\") {\n\t\t\tself.setVariable(key,val);\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nVarsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"vars\"] = VarsWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/view.js": {
            "title": "$:/core/modules/widgets/view.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/view.js\ntype: application/javascript\nmodule-type: widget\n\nView widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ViewWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nViewWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nViewWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.text) {\n\t\tvar textNode = this.document.createTextNode(this.text);\n\t\tparent.insertBefore(textNode,nextSibling);\n\t\tthis.domNodes.push(textNode);\n\t} else {\n\t\tthis.makeChildWidgets();\n\t\tthis.renderChildren(parent,nextSibling);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nViewWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.viewTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.viewSubtiddler = this.getAttribute(\"subtiddler\");\n\tthis.viewField = this.getAttribute(\"field\",\"text\");\n\tthis.viewIndex = this.getAttribute(\"index\");\n\tthis.viewFormat = this.getAttribute(\"format\",\"text\");\n\tthis.viewTemplate = this.getAttribute(\"template\",\"\");\n\tthis.viewMode = this.getAttribute(\"mode\",\"block\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"plainwikified\":\n\t\t\tthis.text = this.getValueAsPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencodedplainwikified\":\n\t\t\tthis.text = this.getValueAsHtmlEncodedPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencoded\":\n\t\t\tthis.text = this.getValueAsHtmlEncoded();\n\t\t\tbreak;\n\t\tcase \"urlencoded\":\n\t\t\tthis.text = this.getValueAsUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"doubleurlencoded\":\n\t\t\tthis.text = this.getValueAsDoubleUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"date\":\n\t\t\tthis.text = this.getValueAsDate(this.viewTemplate);\n\t\t\tbreak;\n\t\tcase \"relativedate\":\n\t\t\tthis.text = this.getValueAsRelativeDate();\n\t\t\tbreak;\n\t\tcase \"stripcomments\":\n\t\t\tthis.text = this.getValueAsStrippedComments();\n\t\t\tbreak;\n\t\tcase \"jsencoded\":\n\t\t\tthis.text = this.getValueAsJsEncoded();\n\t\t\tbreak;\n\t\tdefault: // \"text\"\n\t\t\tthis.text = this.getValueAsText();\n\t\t\tbreak;\n\t}\n};\n\n/*\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\n*/\n\n/*\nRetrieve the value of the widget. Options are:\nasString: Optionally return the value as a string\n*/\nViewWidget.prototype.getValue = function(options) {\n\toptions = options || {};\n\tvar value = options.asString ? \"\" : undefined;\n\tif(this.viewIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\n\t} else {\n\t\tvar tiddler;\n\t\tif(this.viewSubtiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\t\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.viewTitle);\n\t\t}\n\t\tif(tiddler) {\n\t\t\tif(this.viewField === \"text\" && !this.viewSubtiddler) {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.viewTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\n\t\t\t\t\tif(options.asString) {\n\t\t\t\t\t\tvalue = tiddler.getFieldString(this.viewField);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = tiddler.fields[this.viewField];\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.viewField === \"title\") {\n\t\t\t\tvalue = this.viewTitle;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nViewWidget.prototype.getValueAsText = function() {\n\treturn this.getValue({asString: true});\n};\n\nViewWidget.prototype.getValueAsHtmlWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsPlainWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsHtmlEncodedPlainWikified = function(mode) {\n\treturn $tw.utils.htmlEncode(this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t}));\n};\n\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\n\treturn $tw.utils.htmlEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn encodeURIComponent(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn encodeURIComponent(encodeURIComponent(this.getValueAsText()));\n};\n\nViewWidget.prototype.getValueAsDate = function(format) {\n\tformat = format || \"YYYY MM DD 0hh:0mm\";\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.formatDateString(value,format);\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsStrippedComments = function() {\n\tvar lines = this.getValueAsText().split(\"\\n\"),\n\t\tout = [];\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar text = lines[line];\n\t\tif(!/^\\s*\\/\\/#/.test(text)) {\n\t\t\tout.push(text);\n\t\t}\n\t}\n\treturn out.join(\"\\n\");\n};\n\nViewWidget.prototype.getValueAsJsEncoded = function() {\n\treturn $tw.utils.stringify(this.getValueAsText());\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nViewWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.view = ViewWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/widget.js": {
            "title": "$:/core/modules/widgets/widget.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/widget.js\ntype: application/javascript\nmodule-type: widget\n\nWidget base class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate a widget object for a parse tree node\n\tparseTreeNode: reference to the parse tree node to be rendered\n\toptions: see below\nOptions include:\n\twiki: mandatory reference to wiki associated with this render tree\n\tparentWidget: optional reference to a parent renderer node for the context chain\n\tdocument: optional document object to use instead of global document\n*/\nvar Widget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\n*/\nWidget.prototype.initialise = function(parseTreeNode,options) {\n\t// Bail if parseTreeNode is undefined, meaning  that the widget constructor was called without any arguments so that it can be subclassed\n\tif(parseTreeNode === undefined) {\n\t\treturn;\n\t}\n\toptions = options || {};\n\t// Save widget info\n\tthis.parseTreeNode = parseTreeNode;\n\tthis.wiki = options.wiki;\n\tthis.parentWidget = options.parentWidget;\n\tthis.variablesConstructor = function() {};\n\tthis.variablesConstructor.prototype = this.parentWidget ? this.parentWidget.variables : {};\n\tthis.variables = new this.variablesConstructor();\n\tthis.document = options.document;\n\tthis.attributes = {};\n\tthis.children = [];\n\tthis.domNodes = [];\n\tthis.eventListeners = {};\n\t// Hashmap of the widget classes\n\tif(!this.widgetClasses) {\n\t\t// Get widget classes\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t\t// Process any subclasses\n\t\t$tw.modules.forEachModuleOfType(\"widget-subclass\",function(title,module) {\n\t\t\tif(module.baseClass) {\n\t\t\t\tvar baseClass = Widget.prototype.widgetClasses[module.baseClass];\n\t\t\t\tif(!baseClass) {\n\t\t\t\t\tthrow \"Module '\" + title + \"' is attemping to extend a non-existent base class '\" + module.baseClass + \"'\";\n\t\t\t\t}\n\t\t\t\tvar subClass = module.constructor;\n\t\t\t\tsubClass.prototype = new baseClass();\n\t\t\t\t$tw.utils.extend(subClass.prototype,module.prototype);\n\t\t\t\tWidget.prototype.widgetClasses[module.name || module.baseClass] = subClass;\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSet the value of a context variable\nname: name of the variable\nvalue: value of the variable\nparams: array of {name:, default:} for each parameter\nisMacroDefinition: true if the variable is set via a \\define macro pragma (and hence should have variable substitution performed)\n*/\nWidget.prototype.setVariable = function(name,value,params,isMacroDefinition) {\n\tthis.variables[name] = {value: value, params: params, isMacroDefinition: !!isMacroDefinition};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\n\nReturns an object with the following fields:\n\nparams: array of {name:,value:} of parameters passed to wikitext variables\ntext: text of variable, with parameters properly substituted\n*/\nWidget.prototype.getVariableInfo = function(name,options) {\n\toptions = options || {};\n\tvar actualParams = options.params || [],\n\t\tparentWidget = this.parentWidget;\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(parentWidget && name in parentWidget.variables) {\n\t\tvar variable = parentWidget.variables[name],\n\t\t\toriginalValue = variable.value,\n\t\t\tvalue = originalValue,\n\t\t\tparams = this.resolveVariableParameters(variable.params,actualParams);\n\t\t// Substitute any parameters specified in the definition\n\t\t$tw.utils.each(params,function(param) {\n\t\t\tvalue = $tw.utils.replaceString(value,new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(param.name) + \"\\\\$\",\"mg\"),param.value);\n\t\t});\n\t\t// Only substitute variable references if this variable was defined with the \\define pragma\n\t\tif(variable.isMacroDefinition) {\n\t\t\tvalue = this.substituteVariableReferences(value);\t\t\t\n\t\t}\n\t\treturn {\n\t\t\ttext: value,\n\t\t\tparams: params,\n\t\t\tsrcVariable: variable,\n\t\t\tisCacheable: originalValue === value\n\t\t};\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\treturn {\n\t\ttext: this.evaluateMacroModule(name,actualParams,options.defaultValue)\n\t};\n};\n\n/*\nSimplified version of getVariableInfo() that just returns the text\n*/\nWidget.prototype.getVariable = function(name,options) {\n\treturn this.getVariableInfo(name,options).text;\n};\n\nWidget.prototype.resolveVariableParameters = function(formalParams,actualParams) {\n\tformalParams = formalParams || [];\n\tactualParams = actualParams || [];\n\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\tparamInfo, paramValue,\n\t\tresults = [];\n\t// Step through each of the parameters in the macro definition\n\tfor(var p=0; p<formalParams.length; p++) {\n\t\t// Check if we've got a macro call parameter with the same name\n\t\tparamInfo = formalParams[p];\n\t\tparamValue = undefined;\n\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t}\n\t\t}\n\t\t// If not, use the next available anonymous macro call parameter\n\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\tnextAnonParameter++;\n\t\t}\n\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t}\n\t\t// If we've still not got a value, use the default, if any\n\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t// Store the parameter name and value\n\t\tresults.push({name: paramInfo.name, value: paramValue});\n\t}\n\treturn results;\n};\n\nWidget.prototype.substituteVariableReferences = function(text) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn self.getVariable(p1,{defaultValue: \"\"});\n\t});\n};\n\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\n\tif($tw.utils.hop($tw.macros,name)) {\n\t\tvar macro = $tw.macros[name],\n\t\t\targs = [];\n\t\tif(macro.params.length > 0) {\n\t\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\t\tparamInfo, paramValue;\n\t\t\t// Step through each of the parameters in the macro definition\n\t\t\tfor(var p=0; p<macro.params.length; p++) {\n\t\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\t\tparamInfo = macro.params[p];\n\t\t\t\tparamValue = undefined;\n\t\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\t\tnextAnonParameter++;\n\t\t\t\t}\n\t\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t\t}\n\t\t\t\t// If we've still not got a value, use the default, if any\n\t\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t\t// Save the parameter\n\t\t\t\targs.push(paramValue);\n\t\t\t}\n\t\t}\n\t\telse for(var i=0; i<actualParams.length; ++i) {\n\t\t\targs.push(actualParams[i].value);\n\t\t}\n\t\treturn (macro.run.apply(this,args) || \"\").toString();\n\t} else {\n\t\treturn defaultValue;\n\t}\n};\n\n/*\nCheck whether a given context variable value exists in the parent chain\n*/\nWidget.prototype.hasVariable = function(name,value) {\n\tvar node = this;\n\twhile(node) {\n\t\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn false;\n};\n\n/*\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\n*/\nWidget.prototype.getStateQualifier = function(name) {\n\tthis.qualifiers = this.qualifiers || Object.create(null);\n\tname = name || \"transclusion\";\n\tif(this.qualifiers[name]) {\n\t\treturn this.qualifiers[name];\n\t} else {\n\t\tvar output = [],\n\t\t\tnode = this;\n\t\twhile(node && node.parentWidget) {\n\t\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\t\toutput.push(node.getVariable(name));\n\t\t\t}\n\t\t\tnode = node.parentWidget;\n\t\t}\n\t\tvar value = $tw.utils.hashString(output.join(\"\"));\n\t\tthis.qualifiers[name] = value;\n\t\treturn value;\n\t}\n};\n\n/*\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed\n*/\nWidget.prototype.computeAttributes = function() {\n\tvar changedAttributes = {},\n\t\tself = this,\n\t\tvalue;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(attribute.type === \"filtered\") {\n\t\t\tvalue = self.wiki.filterTiddlers(attribute.filter,self)[0] || \"\";\n\t\t} else if(attribute.type === \"indirect\") {\n\t\t\tvalue = self.wiki.getTextReference(attribute.textReference,\"\",self.getVariable(\"currentTiddler\"));\n\t\t} else if(attribute.type === \"macro\") {\n\t\t\tvalue = self.getVariable(attribute.value.name,{params: attribute.value.params});\n\t\t} else { // String attribute\n\t\t\tvalue = attribute.value;\n\t\t}\n\t\t// Check whether the attribute has changed\n\t\tif(self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\n/*\nCheck for the presence of an attribute\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nGet the value of an attribute\n*/\nWidget.prototype.getAttribute = function(name,defaultText) {\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\treturn this.attributes[name];\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nAssign the computed attributes of the widget to a domNode\noptions include:\nexcludeEventAttributes: ignores attributes whose name begins with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(v,a) {\n\t\t// Check exclusions\n\t\tif(options.excludeEventAttributes && a.substr(0,2) === \"on\") {\n\t\t\tv = undefined;\n\t\t}\n\t\tif(v !== undefined) {\n\t\t\tvar b = a.split(\":\");\n\t\t\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\n\t\t\ttry {\n\t\t\t\tif (b.length == 2 && b[0] == \"xlink\"){\n\t\t\t\t\tdomNode.setAttributeNS(\"http://www.w3.org/1999/xlink\",b[1],v);\n\t\t\t\t} else {\n\t\t\t\t\tdomNode.setAttributeNS(null,a,v);\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes) {\n\tthis.children = [];\n\tvar self = this;\n\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\tself.children.push(self.makeChildWidget(childNode));\n\t});\n};\n\n/*\nConstruct the widget object for a parse tree node\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode) {\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tvariables: {},\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\tvar children = this.children;\n\tfor(var i = 0; i < children.length; i++) {\n\t\tchildren[i].render(parent,nextSibling);\n\t};\n};\n\n/*\nAdd a list of event listeners from an array [{type:,handler:},...]\n*/\nWidget.prototype.addEventListeners = function(listeners) {\n\tvar self = this;\n\t$tw.utils.each(listeners,function(listenerInfo) {\n\t\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\n\t});\n};\n\n/*\nAdd an event listener\n*/\nWidget.prototype.addEventListener = function(type,handler) {\n\tvar self = this;\n\tif(typeof handler === \"string\") { // The handler is a method name on this widget\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn self[handler].call(self,event);\n\t\t};\n\t} else { // The handler is a function\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn handler.call(self,event);\n\t\t};\n\t}\n};\n\n/*\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\n*/\nWidget.prototype.dispatchEvent = function(event) {\n\tevent.widget = event.widget || this;\n\t// Dispatch the event if this widget handles it\n\tvar listener = this.eventListeners[event.type];\n\tif(listener) {\n\t\t// Don't propagate the event if the listener returned false\n\t\tif(!listener(event)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Dispatch the event to the parent widget\n\tif(this.parentWidget) {\n\t\treturn this.parentWidget.dispatchEvent(event);\n\t}\n\treturn true;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nRebuild a previously rendered widget\n*/\nWidget.prototype.refreshSelf = function() {\n\tvar nextSibling = this.findNextSiblingDomNode();\n\tthis.removeChildDomNodes();\n\tthis.render(this.parentDomNode,nextSibling);\n};\n\n/*\nRefresh all the children of a widget\n*/\nWidget.prototype.refreshChildren = function(changedTiddlers) {\n\tvar children = this.children,\n\t\trefreshed = false;\n\tfor (var i = 0; i < children.length; i++) {\n\t\trefreshed = children[i].refresh(changedTiddlers) || refreshed;\n\t}\n\treturn refreshed;\n};\n\n/*\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\n*/\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\n\t// Refer to this widget by its index within its parents children\n\tvar parent = this.parentWidget,\n\t\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\nif(index === -1) {\n\tthrow \"node not found in parents children\";\n}\n\t// Look for a DOM node in the later siblings\n\twhile(++index < parent.children.length) {\n\t\tvar domNode = parent.children[index].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\t// Go back and look for later siblings of our parent if it has the same parent dom node\n\tvar grandParent = parent.parentWidget;\n\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\n\t\tindex = grandParent.children.indexOf(parent);\n\t\tif(index !== -1) {\n\t\t\treturn parent.findNextSiblingDomNode(index);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nFind the first DOM node generated by a widget or its children\n*/\nWidget.prototype.findFirstDomNode = function() {\n\t// Return the first dom node of this widget, if we've got one\n\tif(this.domNodes.length > 0) {\n\t\treturn this.domNodes[0];\n\t}\n\t// Otherwise, recursively call our children\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar domNode = this.children[t].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRemove any DOM nodes created by this widget or its children\n*/\nWidget.prototype.removeChildDomNodes = function() {\n\t// If this widget has directly created DOM nodes, delete them and exit. This assumes that any child widgets are contained within the created DOM nodes, which would normally be the case\n\tif(this.domNodes.length > 0) {\n\t\t$tw.utils.each(this.domNodes,function(domNode) {\n\t\t\tdomNode.parentNode.removeChild(domNode);\n\t\t});\n\t\tthis.domNodes = [];\n\t} else {\n\t\t// Otherwise, ask the child widgets to delete their DOM nodes\n\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\tchildWidget.removeChildDomNodes();\n\t\t});\n\t}\n};\n\n/*\nInvoke the action widgets that are descendents of the current widget.\n*/\nWidget.prototype.invokeActions = function(triggeringWidget,event) {\n\tvar handled = false;\n\t// For each child widget\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar child = this.children[t];\n\t\t// Invoke the child if it is an action widget\n\t\tif(child.invokeAction) {\n\t\t\tchild.refreshSelf();\n\t\t\tif(child.invokeAction(triggeringWidget,event)) {\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\t\t// Propagate through through the child if it permits it\n\t\tif(child.allowActionPropagation() && child.invokeActions(triggeringWidget,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\n/*\nInvoke the action widgets defined in a string\n*/\nWidget.prototype.invokeActionString = function(actions,triggeringWidget,event,variables) {\n\tactions = actions || \"\";\n\tvar parser = this.wiki.parseText(\"text/vnd.tiddlywiki\",actions,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document\n\t\t}),\n\t\twidgetNode = this.wiki.makeWidget(parser,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document,\n\t\t\tvariables: variables\n\t\t});\n\tvar container = this.document.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn widgetNode.invokeActions(this,event);\n};\n\n/*\nExecute action tiddlers by tag\n*/\nWidget.prototype.invokeActionsByTag = function(tag,event,variables) {\n\tvar self = this;\n\t$tw.utils.each(self.wiki.filterTiddlers(\"[all[shadows+tiddlers]tag[\" + tag + \"]!has[draft.of]]\"),function(title) {\n\t\tself.invokeActionString(self.wiki.getTiddlerText(title),self,event,variables);\n\t});\n};\n\nWidget.prototype.allowActionPropagation = function() {\n\treturn true;\n};\n\nexports.widget = Widget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/wikify.js": {
            "title": "$:/core/modules/widgets/wikify.js",
            "text": "/*\\\ntitle: $:/core/modules/widgets/wikify.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to wikify text into a variable\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar WikifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nWikifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nWikifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWikifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.wikifyName = this.getAttribute(\"name\");\n\tthis.wikifyText = this.getAttribute(\"text\");\n\tthis.wikifyType = this.getAttribute(\"type\");\n\tthis.wikifyMode = this.getAttribute(\"mode\",\"block\");\n\tthis.wikifyOutput = this.getAttribute(\"output\",\"text\");\n\t// Create the parse tree\n\tthis.wikifyParser = this.wiki.parseText(this.wikifyType,this.wikifyText,{\n\t\t\tparseAsInline: this.wikifyMode === \"inline\"\n\t\t});\n\t// Create the widget tree \n\tthis.wikifyWidgetNode = this.wiki.makeWidget(this.wikifyParser,{\n\t\t\tdocument: $tw.fakeDocument,\n\t\t\tparentWidget: this\n\t\t});\n\t// Render the widget tree to the container\n\tthis.wikifyContainer = $tw.fakeDocument.createElement(\"div\");\n\tthis.wikifyWidgetNode.render(this.wikifyContainer,null);\n\tthis.wikifyResult = this.getResult();\n\t// Set context variable\n\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nReturn the result string\n*/\nWikifyWidget.prototype.getResult = function() {\n\tvar result;\n\tswitch(this.wikifyOutput) {\n\t\tcase \"text\":\n\t\t\tresult = this.wikifyContainer.textContent;\n\t\t\tbreak;\n\t\tcase \"formattedtext\":\n\t\t\tresult = this.wikifyContainer.formattedTextContent;\n\t\t\tbreak;\n\t\tcase \"html\":\n\t\t\tresult = this.wikifyContainer.innerHTML;\n\t\t\tbreak;\n\t\tcase \"parsetree\":\n\t\t\tresult = JSON.stringify(this.wikifyParser.tree,0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t\tcase \"widgettree\":\n\t\t\tresult = JSON.stringify(this.getWidgetTree(),0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t}\n\treturn result;\n};\n\n/*\nReturn a string of the widget tree\n*/\nWikifyWidget.prototype.getWidgetTree = function() {\n\tvar copyNode = function(widgetNode,resultNode) {\n\t\t\tvar type = widgetNode.parseTreeNode.type;\n\t\t\tresultNode.type = type;\n\t\t\tswitch(type) {\n\t\t\t\tcase \"element\":\n\t\t\t\t\tresultNode.tag = widgetNode.parseTreeNode.tag;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tresultNode.text = widgetNode.parseTreeNode.text;\n\t\t\t\t\tbreak;\t\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.attributes || {}).length > 0) {\n\t\t\t\tresultNode.attributes = {};\n\t\t\t\t$tw.utils.each(widgetNode.attributes,function(attr,attrName) {\n\t\t\t\t\tresultNode.attributes[attrName] = widgetNode.getAttribute(attrName);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.children || {}).length > 0) {\n\t\t\t\tresultNode.children = [];\n\t\t\t\t$tw.utils.each(widgetNode.children,function(widgetChildNode) {\n\t\t\t\t\tvar node = {};\n\t\t\t\t\tresultNode.children.push(node);\n\t\t\t\t\tcopyNode(widgetChildNode,node);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresults = {};\n\tcopyNode(this.wikifyWidgetNode,results);\n\treturn results;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWikifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh ourselves entirely if any of our attributes have changed\n\tif(changedAttributes.name || changedAttributes.text || changedAttributes.type || changedAttributes.mode || changedAttributes.output) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\t// Refresh the widget tree\n\t\tif(this.wikifyWidgetNode.refresh(changedTiddlers)) {\n\t\t\t// Check if there was any change\n\t\t\tvar result = this.getResult();\n\t\t\tif(result !== this.wikifyResult) {\n\t\t\t\t// If so, save the change\n\t\t\t\tthis.wikifyResult = result;\n\t\t\t\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t\t\t\t// Refresh each of our child widgets\n\t\t\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\t\t\tchildWidget.refreshSelf();\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t// Just refresh the children\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.wikify = WikifyWidget;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/wiki-bulkops.js": {
            "title": "$:/core/modules/wiki-bulkops.js",
            "text": "/*\\\ntitle: $:/core/modules/wiki-bulkops.js\ntype: application/javascript\nmodule-type: wikimethod\n\nBulk tiddler operations such as rename.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRename a tiddler, and relink any tags or lists that reference it.\n*/\nfunction renameTiddler(fromTitle,toTitle,options) {\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\t// Rename the tiddler itself\n\t\tvar oldTiddler = this.getTiddler(fromTitle),\n\t\t\tnewTiddler = new $tw.Tiddler(oldTiddler,{title: toTitle},this.getModificationFields());\n\t\tnewTiddler = $tw.hooks.invokeHook(\"th-renaming-tiddler\",newTiddler,oldTiddler);\n\t\tthis.addTiddler(newTiddler);\n\t\tthis.deleteTiddler(fromTitle);\n\t\t// Rename any tags or lists that reference it\n\t\tthis.relinkTiddler(fromTitle,toTitle,options)\n\t}\n}\n\n/*\nRelink any tags or lists that reference a given tiddler\n*/\nfunction relinkTiddler(fromTitle,toTitle,options) {\n\tvar self = this;\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\tthis.each(function(tiddler,title) {\n\t\t\tvar type = tiddler.fields.type || \"\";\n\t\t\t// Don't touch plugins or JavaScript modules\n\t\t\tif(!tiddler.fields[\"plugin-type\"] && type !== \"application/javascript\") {\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,\n\t\t\t\t\tlist = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,\n\t\t\t\t\tisModified = false;\n\t\t\t\tif(!options.dontRenameInTags) {\n\t\t\t\t\t// Rename tags\n\t\t\t\t\t$tw.utils.each(tags,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming tag '\" + tags[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\ttags[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(!options.dontRenameInLists) {\n\t\t\t\t\t// Rename lists\n\t\t\t\t\t$tw.utils.each(list,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming list item '\" + list[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\tlist[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(isModified) {\n\t\t\t\t\tvar newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields())\n\t\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-relinking-tiddler\",newTiddler,tiddler);\n\t\t\t\t\tself.addTiddler(newTiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\nexports.renameTiddler = renameTiddler;\nexports.relinkTiddler = relinkTiddler;\n\n})();\n",
            "type": "application/javascript",
            "module-type": "wikimethod"
        },
        "$:/core/modules/wiki.js": {
            "title": "$:/core/modules/wiki.js",
            "text": "/*\\\ntitle: $:/core/modules/wiki.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\n* `eventListeners` is a hashmap by type of arrays of listener functions\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\n\tmodified: true/false\n\tdeleted: true/false\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar USER_NAME_TITLE = \"$:/status/UserName\",\n\tTIMESTAMP_DISABLE_TITLE = \"$:/config/TimestampDisable\";\n\n/*\nAdd available indexers to this wiki\n*/\nexports.addIndexersToWiki = function() {\n\tvar self = this;\n\t$tw.utils.each($tw.modules.applyMethods(\"indexer\"),function(Indexer,name) {\n\t\tself.addIndexer(new Indexer(self),name);\n\t});\n};\n\n/*\nGet the value of a text reference. Text references can have any of these forms:\n\t<tiddlertitle>\n\t<tiddlertitle>!!<fieldname>\n\t!!<fieldname> - specifies a field of the current tiddlers\n\t<tiddlertitle>##<index>\n*/\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tif(tr.field) {\n\t\tvar tiddler = this.getTiddler(title);\n\t\tif(tr.field === \"title\") { // Special case so we can return the title of a non-existent tiddler\n\t\t\treturn title;\n\t\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\treturn tiddler.getFieldString(tr.field);\n\t\t} else {\n\t\t\treturn defaultText;\n\t\t}\n\t} else if(tr.index) {\n\t\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\n\t} else {\n\t\treturn this.getTiddlerText(title,defaultText);\n\t}\n};\n\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tthis.setText(title,tr.field,tr.index,value);\n};\n\nexports.setText = function(title,field,index,value,options) {\n\toptions = options || {};\n\tvar creationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\n\t\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields();\n\t// Check if it is a reference to a tiddler field\n\tif(index) {\n\t\tvar data = this.getTiddlerData(title,Object.create(null));\n\t\tif(value !== undefined) {\n\t\t\tdata[index] = value;\n\t\t} else {\n\t\t\tdelete data[index];\n\t\t}\n\t\tthis.setTiddlerData(title,data,modificationFields);\n\t} else {\n\t\tvar tiddler = this.getTiddler(title),\n\t\t\tfields = {title: title};\n\t\tfields[field || \"text\"] = value;\n\t\tthis.addTiddler(new $tw.Tiddler(creationFields,tiddler,fields,modificationFields));\n\t}\n};\n\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle,tiddler,fields;\n\t// Check if it is a reference to a tiddler\n\tif(tr.title && !tr.field) {\n\t\tthis.deleteTiddler(tr.title);\n\t// Else check for a field reference\n\t} else if(tr.field) {\n\t\ttitle = tr.title || currTiddlerTitle;\n\t\ttiddler = this.getTiddler(title);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\tfields = Object.create(null);\n\t\t\tfields[tr.field] = undefined;\n\t\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t\t}\n\t}\n};\n\nexports.addEventListener = function(type,listener) {\n\tthis.eventListeners = this.eventListeners || {};\n\tthis.eventListeners[type] = this.eventListeners[type]  || [];\n\tthis.eventListeners[type].push(listener);\t\n};\n\nexports.removeEventListener = function(type,listener) {\n\tvar listeners = this.eventListeners[type];\n\tif(listeners) {\n\t\tvar p = listeners.indexOf(listener);\n\t\tif(p !== -1) {\n\t\t\tlisteners.splice(p,1);\n\t\t}\n\t}\n};\n\nexports.dispatchEvent = function(type /*, args */) {\n\tvar args = Array.prototype.slice.call(arguments,1),\n\t\tlisteners = this.eventListeners[type];\n\tif(listeners) {\n\t\tfor(var p=0; p<listeners.length; p++) {\n\t\t\tvar listener = listeners[p];\n\t\t\tlistener.apply(listener,args);\n\t\t}\n\t}\n};\n\n/*\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\n\ttitle: Title of tiddler\n\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\n\t\ttrue if the tiddler has been deleted\n*/\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\n\t// Record the touch in the list of changed tiddlers\n\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\n\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\n\tthis.changedTiddlers[title][isDeleted ? \"deleted\" : \"modified\"] = true;\n\t// Increment the change count\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\tthis.changeCount[title]++;\n\t} else {\n\t\tthis.changeCount[title] = 1;\n\t}\n\t// Trigger events\n\tthis.eventListeners = this.eventListeners || {};\n\tif(!this.eventsTriggered) {\n\t\tvar self = this;\n\t\t$tw.utils.nextTick(function() {\n\t\t\tvar changes = self.changedTiddlers;\n\t\t\tself.changedTiddlers = Object.create(null);\n\t\t\tself.eventsTriggered = false;\n\t\t\tif($tw.utils.count(changes) > 0) {\n\t\t\t\tself.dispatchEvent(\"change\",changes);\n\t\t\t}\n\t\t});\n\t\tthis.eventsTriggered = true;\n\t}\n};\n\nexports.getSizeOfTiddlerEventQueue = function() {\n\treturn $tw.utils.count(this.changedTiddlers);\n};\n\nexports.clearTiddlerEventQueue = function() {\n\tthis.changedTiddlers = Object.create(null);\n\tthis.changeCount = Object.create(null);\n};\n\nexports.getChangeCount = function(title) {\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\treturn this.changeCount[title];\n\t} else {\n\t\treturn 0;\n\t}\n};\n\n/*\nGenerate an unused title from the specified base\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar c = 0,\n\t\ttitle = baseTitle;\n\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\ttitle = baseTitle + \n\t\t\t(options.prefix || \" \") + \n\t\t\t(++c);\n\t}\n\treturn title;\n};\n\nexports.isSystemTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/temp/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\"image\") !== -1;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.isBinaryTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.encoding === \"base64\";\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\n*/\nexports.importTiddler = function(tiddler) {\n\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\n\t// Check if we're dealing with a plugin\n\tif(tiddler && tiddler.hasField(\"plugin-type\") && tiddler.hasField(\"version\") && existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t// Reject the incoming plugin if it is older\n\t\tif(!$tw.utils.checkVersions(tiddler.fields.version,existingTiddler.fields.version)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Fall through to adding the tiddler\n\tthis.addTiddler(tiddler);\n\treturn true;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is created\n*/\nexports.getCreationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = {\n\t\t\t\tcreated: new Date()\n\t\t\t},\n\t\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\t\tif(creator) {\n\t\t\tfields.creator = creator;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = Object.create(null),\n\t\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\t\tfields.modified = new Date();\n\t\tif(modifier) {\n\t\t\tfields.modifier = modifier;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a sorted array of tiddler titles.  Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.getTiddlers = function(options) {\n\toptions = options || Object.create(null);\n\tvar self = this,\n\t\tsortField = options.sortField || \"title\",\n\t\ttiddlers = [], t, titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tif(options.includeSystem || !self.isSystemTiddler(title)) {\n\t\t\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t});\n\ttiddlers.sort(function(a,b) {\n\t\tvar aa = a.fields[sortField].toLowerCase() || \"\",\n\t\t\tbb = b.fields[sortField].toLowerCase() || \"\";\n\t\tif(aa < bb) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(aa > bb) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n\tfor(t=0; t<tiddlers.length; t++) {\n\t\ttitles.push(tiddlers[t].fields.title);\n\t}\n\treturn titles;\n};\n\nexports.countTiddlers = function(excludeTag) {\n\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\n\treturn $tw.utils.count(tiddlers);\n};\n\n/*\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\n*/\nexports.makeTiddlerIterator = function(titles) {\n\tvar self = this;\n\tif(!$tw.utils.isArray(titles)) {\n\t\ttitles = Object.keys(titles);\n\t} else {\n\t\ttitles = titles.slice(0);\n\t}\n\treturn function(callback) {\n\t\ttitles.forEach(function(title) {\n\t\t\tcallback(self.getTiddler(title),title);\n\t\t});\n\t};\n};\n\n/*\nSort an array of tiddler titles by a specified field\n\ttitles: array of titles (sorted in place)\n\tsortField: name of field to sort by\n\tisDescending: true if the sort should be descending\n\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\n*/\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric) {\n\tvar self = this;\n\ttitles.sort(function(a,b) {\n\t\tvar x,y,\n\t\t\tcompareNumbers = function(x,y) {\n\t\t\t\tvar result = \n\t\t\t\t\tisNaN(x) && !isNaN(y) ? (isDescending ? -1 : 1) :\n\t\t\t\t\t!isNaN(x) && isNaN(y) ? (isDescending ? 1 : -1) :\n\t\t\t\t\t\t\t\t\t\t\t(isDescending ? y - x :  x - y);\n\t\t\t\treturn result;\n\t\t\t};\n\t\tif(sortField !== \"title\") {\n\t\t\tvar tiddlerA = self.getTiddler(a),\n\t\t\t\ttiddlerB = self.getTiddler(b);\n\t\t\tif(tiddlerA) {\n\t\t\t\ta = tiddlerA.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\ta = \"\";\n\t\t\t}\n\t\t\tif(tiddlerB) {\n\t\t\t\tb = tiddlerB.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\tb = \"\";\n\t\t\t}\n\t\t}\n\t\tx = Number(a);\n\t\ty = Number(b);\n\t\tif(isNumeric && (!isNaN(x) || !isNaN(y))) {\n\t\t\treturn compareNumbers(x,y);\n\t\t} else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else if(isAlphaNumeric) {\n\t\t\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t} else {\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t}\n\t});\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked within the given parse tree\n */\nexports.extractLinks = function(parseTreeRoot) {\n\t// Count up the links\n\tvar links = [],\n\t\tcheckParseTree = function(parseTree) {\n\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcheckParseTree(parseTreeRoot);\n\treturn links;\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinks = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\tif(parser) {\n\t\t\treturn self.extractLinks(parser.tree);\n\t\t}\n\t\treturn [];\n\t});\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbacklinksIndexer = this.getIndexer(\"BacklinksIndexer\"),\n\t\tbacklinks = backlinksIndexer && backlinksIndexer.lookup(targetTitle);\n\n\tif(!backlinks) {\n\t\tbacklinks = [];\n\t\tthis.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self.getTiddlerLinks(title);\n\t\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\t\tbacklinks.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn backlinks;\n};\n\n/*\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\n*/\nexports.getMissingTitles = function() {\n\tvar self = this,\n\t\tmissing = [];\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\n\t\t\t\tmissing.push(link);\n\t\t\t}\n\t\t});\n\t});\n\treturn missing;\n};\n\nexports.getOrphanTitles = function() {\n\tvar self = this,\n\t\torphans = this.getTiddlers();\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tvar p = orphans.indexOf(link);\n\t\t\tif(p !== -1) {\n\t\t\t\torphans.splice(p,1);\n\t\t\t}\n\t\t});\n\t});\n\treturn orphans; // Todo\n};\n\n/*\nRetrieves a list of the tiddler titles that are tagged with a given tag\n*/\nexports.getTiddlersWithTag = function(tag) {\n\t// Try to use the indexer\n\tvar self = this,\n\t\ttagIndexer = this.getIndexer(\"TagIndexer\"),\n\t\tresults = tagIndexer && tagIndexer.subIndexers[3].lookup(tag);\n\tif(!results) {\n\t\t// If not available, perform a manual scan\n\t\tresults = this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\t\tvar tagmap = self.getTagMap();\n\t\t\treturn self.sortByList(tagmap[tag],tag);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nGet a hashmap by tag of arrays of tiddler titles\n*/\nexports.getTagMap = function() {\n\tvar self = this;\n\treturn this.getGlobalCache(\"tagmap\",function() {\n\t\tvar tags = Object.create(null),\n\t\t\tstoreTags = function(tagArray,title) {\n\t\t\t\tif(tagArray) {\n\t\t\t\t\tfor(var index=0; index<tagArray.length; index++) {\n\t\t\t\t\t\tvar tag = tagArray[index];\n\t\t\t\t\t\tif($tw.utils.hop(tags,tag)) {\n\t\t\t\t\t\t\ttags[tag].push(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttags[tag] = [title];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttitle, tiddler;\n\t\t// Collect up all the tags\n\t\tself.eachShadow(function(tiddler,title) {\n\t\t\tif(!self.tiddlerExists(title)) {\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t\t}\n\t\t});\n\t\tself.each(function(tiddler,title) {\n\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t});\n\t\treturn tags;\n\t});\n};\n\n/*\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\n*/\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\n\tfieldName = fieldName || \"list\";\n\tvar titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\tif(list && list.indexOf(targetTitle) !== -1) {\n\t\t\ttitles.push(title);\n\t\t}\n\t});\n\treturn titles;\n};\n\n/*\nSorts an array of tiddler titles according to an ordered list\n*/\nexports.sortByList = function(array,listTitle) {\n\tvar self = this,\n\t\treplacedTitles = Object.create(null);\n\t// Given a title, this function will place it in the correct location\n\t// within titles.\n\tfunction moveItemInList(title) {\n\t\tif(!$tw.utils.hop(replacedTitles, title)) {\n\t\t\treplacedTitles[title] = true;\n\t\t\tvar newPos = -1,\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\tvar beforeTitle = tiddler.fields[\"list-before\"],\n\t\t\t\t\tafterTitle = tiddler.fields[\"list-after\"];\n\t\t\t\tif(beforeTitle === \"\") {\n\t\t\t\t\tnewPos = 0;\n\t\t\t\t} else if(afterTitle === \"\") {\n\t\t\t\t\tnewPos = titles.length;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\t// if this title is placed relative\n\t\t\t\t\t// to another title, make sure that\n\t\t\t\t\t// title is placed before we place\n\t\t\t\t\t// this one.\n\t\t\t\t\tmoveItemInList(beforeTitle);\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\t// Same deal\n\t\t\t\t\tmoveItemInList(afterTitle);\n\t\t\t\t\tnewPos = titles.indexOf(afterTitle);\n\t\t\t\t\tif(newPos >= 0) {\n\t\t\t\t\t\t++newPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If a new position is specified, let's move it\n\t\t\t\tif (newPos !== -1) {\n\t\t\t\t\t// get its current Pos, and make sure\n\t\t\t\t\t// sure that it's _actually_ in the list\n\t\t\t\t\t// and that it would _actually_ move\n\t\t\t\t\t// (#4275) We don't bother calling\n\t\t\t\t\t//         indexOf unless we have a new\n\t\t\t\t\t//         position to work with\n\t\t\t\t\tvar currPos = titles.indexOf(title);\n\t\t\t\t\tif(currPos >= 0 && newPos !== currPos) {\n\t\t\t\t\t\t// move it!\n\t\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvar list = this.getTiddlerList(listTitle);\n\tif(!array || array.length === 0) {\n\t\treturn [];\n\t} else {\n\t\tvar titles = [], t, title;\n\t\t// First place any entries that are present in the list\n\t\tfor(t=0; t<list.length; t++) {\n\t\t\ttitle = list[t];\n\t\t\tif(array.indexOf(title) !== -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Then place any remaining entries\n\t\tfor(t=0; t<array.length; t++) {\n\t\t\ttitle = array[t];\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Finally obey the list-before and list-after fields of each tiddler in turn\n\t\tvar sortedTitles = titles.slice(0);\n\t\tfor(t=0; t<sortedTitles.length; t++) {\n\t\t\ttitle = sortedTitles[t];\n\t\t\tmoveItemInList(title);\n\t\t}\n\t\treturn titles;\n\t}\n};\n\nexports.getSubTiddler = function(title,subTiddlerTitle) {\n\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerDataCached(title);\n\tif(bundleInfo && bundleInfo.tiddlers) {\n\t\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\n\t\tif(subTiddler) {\n\t\t\treturn new $tw.Tiddler(subTiddler);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRetrieve a tiddler as a JSON string of the fields\n*/\nexports.getTiddlerAsJson = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar fields = Object.create(null);\n\t\t$tw.utils.each(tiddler.fields,function(value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\treturn JSON.stringify(fields);\n\t} else {\n\t\treturn JSON.stringify({title: title});\n\t}\n};\n\nexports.getTiddlersAsJson = function(filter,spaces) {\n\tvar tiddlers = this.filterTiddlers(filter),\n\t\tspaces = (spaces === undefined) ? $tw.config.preferences.jsonSpaces : spaces,\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn JSON.stringify(data,null,spaces);\n};\n\n/*\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\n\napplication/json: the tiddler JSON is parsed into an object\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\n\nOther types currently just return null.\n\ntitleOrTiddler: string tiddler title or a tiddler object\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\n\nNote that the same value is returned for repeated calls for the same tiddler data. The value is frozen to prevent modification; otherwise modifications would be visible to all callers\n*/\nexports.getTiddlerDataCached = function(titleOrTiddler,defaultData) {\n\tvar self = this,\n\t\ttiddler = titleOrTiddler;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler) {\n\t\treturn this.getCacheForTiddler(tiddler.fields.title,\"data\",function() {\n\t\t\t// Return the frozen value\n\t\t\tvar value = self.getTiddlerData(tiddler.fields.title,undefined);\n\t\t\t$tw.utils.deepFreeze(value);\n\t\t\treturn value;\n\t\t}) || defaultData;\n\t} else {\n\t\treturn defaultData;\n\t}\n};\n\n/*\nAlternative, uncached version of getTiddlerDataCached(). The return value can be mutated freely and reused\n*/\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\n\tvar tiddler = titleOrTiddler,\n\t\tdata;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler && tiddler.fields.text) {\n\t\tswitch(tiddler.fields.type) {\n\t\t\tcase \"application/json\":\n\t\t\t\t// JSON tiddler\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(tiddler.fields.text);\n\t\t\t\t} catch(ex) {\n\t\t\t\t\treturn defaultData;\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\treturn $tw.utils.parseFields(tiddler.fields.text);\n\t\t}\n\t}\n\treturn defaultData;\n};\n\n/*\nExtract an indexed field from within a data tiddler\n*/\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\n\tvar data = this.getTiddlerDataCached(titleOrTiddler,Object.create(null)),\n\t\ttext;\n\tif(data && $tw.utils.hop(data,index)) {\n\t\ttext = data[index];\n\t}\n\tif(typeof text === \"string\" || typeof text === \"number\") {\n\t\treturn text.toString();\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \"application/json\" and setting the text to the JSON text of the data.\ntitle: title of tiddler\ndata: object that can be serialised to JSON\nfields: optional hashmap of additional tiddler fields to be set\n*/\nexports.setTiddlerData = function(title,data,fields) {\n\tvar existingTiddler = this.getTiddler(title),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t};\n\tif(existingTiddler && existingTiddler.fields.type === \"application/x-tiddler-dictionary\") {\n\t\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\n\t} else {\n\t\tnewFields.type = \"application/json\";\n\t\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n\t}\n\tthis.addTiddler(new $tw.Tiddler(this.getCreationFields(),existingTiddler,fields,newFields,this.getModificationFields()));\n};\n\n/*\nReturn the content of a tiddler as an array containing each line\n*/\nexports.getTiddlerList = function(title,field,index) {\n\tif(index) {\n\t\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\"\"));\n\t}\n\tfield = field || \"list\";\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\n\t}\n\treturn [];\n};\n\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\nexports.getGlobalCache = function(cacheName,initializer) {\n\tthis.globalCache = this.globalCache || Object.create(null);\n\tif($tw.utils.hop(this.globalCache,cacheName)) {\n\t\treturn this.globalCache[cacheName];\n\t} else {\n\t\tthis.globalCache[cacheName] = initializer();\n\t\treturn this.globalCache[cacheName];\n\t}\n};\n\nexports.clearGlobalCache = function() {\n\tthis.globalCache = Object.create(null);\n};\n\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\n\tthis.caches = this.caches || Object.create(null);\n\tvar caches = this.caches[title];\n\tif(caches && caches[cacheName]) {\n\t\treturn caches[cacheName];\n\t} else {\n\t\tif(!caches) {\n\t\t\tcaches = Object.create(null);\n\t\t\tthis.caches[title] = caches;\n\t\t}\n\t\tcaches[cacheName] = initializer();\n\t\treturn caches[cacheName];\n\t}\n};\n\n// Clear all caches associated with a particular tiddler, or, if the title is null, clear all the caches for all the tiddlers\nexports.clearCache = function(title) {\n\tif(title) {\n\t\tthis.caches = this.caches || Object.create(null);\n\t\tif($tw.utils.hop(this.caches,title)) {\n\t\t\tdelete this.caches[title];\n\t\t}\n\t} else {\n\t\tthis.caches = Object.create(null);\n\t}\n};\n\nexports.initParsers = function(moduleType) {\n\t// Install the parser modules\n\t$tw.Wiki.parsers = {};\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(\"parser\",function(title,module) {\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\n\t\t\t}\n\t\t}\n\t});\n\t// Use the generic binary parser for any binary types not registered so far\n\tif($tw.Wiki.parsers[\"application/octet-stream\"]) {\n\t\tObject.keys($tw.config.contentTypeInfo).forEach(function(type) {\n\t\t\tif(!$tw.utils.hop($tw.Wiki.parsers,type) && $tw.config.contentTypeInfo[type].encoding === \"base64\") {\n\t\t\t\t$tw.Wiki.parsers[type] = $tw.Wiki.parsers[\"application/octet-stream\"];\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n\t_canonical_uri: optional string of the canonical URI of this content\n*/\nexports.parseText = function(type,text,options) {\n\ttext = text || \"\";\n\toptions = options || {};\n\t// Select a parser\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.utils.getFileExtensionInfo(type)) {\n\t\tParser = $tw.Wiki.parsers[$tw.utils.getFileExtensionInfo(type).type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri\n\t});\n};\n\n/*\nParse a tiddler according to its MIME type\n*/\nexports.parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"inlineParseTree\" : \"blockParseTree\",\n\t\ttiddler = this.getTiddler(title),\n\t\tself = this;\n\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\n\t\t\tif(tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t\toptions._canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t}\n\t\t\treturn self.parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\n};\n\nexports.parseTextReference = function(title,field,index,options) {\n\tvar tiddler,text;\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t\tif(field === \"text\" || (!field && !index)) {\n\t\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\t\treturn this.parseTiddler(title,options);\n\t\t}\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\treturn this.parseText(tiddler.fields.type,tiddler.fields.text,options);\t\t\t\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\ttext = title;\n\t\t} else {\n\t\t\tif(!tiddler || !tiddler.hasField(field)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttext = tiddler.fields[field];\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text.toString(),options);\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\ttext = this.extractTiddlerDataItem(tiddler,index,undefined);\n\t\tif(text === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text,options);\n\t}\n};\n\n/*\nMake a widget tree for a parse tree\nparser: parser object\noptions: see below\nOptions include:\ndocument: optional document to use\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.makeWidget = function(parser,options) {\n\toptions = options || {};\n\tvar widgetNode = {\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},\n\t\tcurrWidgetNode = widgetNode;\n\t// Create set variable widgets for each variable\n\t$tw.utils.each(options.variables,function(value,name) {\n\t\tvar setVariableWidget = {\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\tcurrWidgetNode.children = [setVariableWidget];\n\t\tcurrWidgetNode = setVariableWidget;\n\t});\n\t// Add in the supplied parse tree nodes\n\tcurrWidgetNode.children = parser ? parser.tree : [];\n\t// Create the widget\n\treturn new widget.widget(widgetNode,{\n\t\twiki: this,\n\t\tdocument: options.document || $tw.fakeDocument,\n\t\tparentWidget: options.parentWidget\n\t});\n};\n\n/*\nMake a widget tree for transclusion\ntitle: target tiddler title\noptions: as for wiki.makeWidget() plus:\noptions.field: optional field to transclude (defaults to \"text\")\noptions.mode: transclusion mode \"inline\" or \"block\"\noptions.recursionMarker : optional flag to set a recursion marker, defaults to \"yes\"\noptions.children: optional array of children for the transclude widget\noptions.importVariables: optional importvariables filter string for macros to be included\noptions.importPageMacros: optional boolean; if true, equivalent to passing \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\" to options.importVariables\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTreeDiv = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: []}]},\n\t\tparseTreeImportVariables = {\n\t\t\ttype: \"importvariables\",\n\t\t\tattributes: {\n\t\t\t\tfilter: {\n\t\t\t\t\tname: \"filter\",\n\t\t\t\t\ttype: \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: false,\n\t\t\tchildren: []},\n\t\tparseTreeTransclude = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\trecursionMarker: {\n\t\t\t\t\tname: \"recursionMarker\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: options.recursionMarker || \"yes\"\n\t\t\t\t\t},\n\t\t\t\ttiddler: {\n\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: !options.parseAsInline};\n\tif(options.importVariables || options.importPageMacros) {\n\t\tif(options.importVariables) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = options.importVariables;\n\t\t} else if(options.importPageMacros) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\";\n\t\t}\n\t\tparseTreeDiv.tree[0].children.push(parseTreeImportVariables);\n\t\tparseTreeImportVariables.children.push(parseTreeTransclude);\n\t} else {\n\t\tparseTreeDiv.tree[0].children.push(parseTreeTransclude);\n\t}\n\tif(options.field) {\n\t\tparseTreeTransclude.attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.mode) {\n\t\tparseTreeTransclude.attributes.mode = {type: \"string\", value: options.mode};\n\t}\n\tif(options.children) {\n\t\tparseTreeTransclude.children = options.children;\n\t}\n\treturn this.makeWidget(parseTreeDiv,options);\n};\n\n/*\nParse text in a specified format and render it into another format\n\toutputType: content type for the output\n\ttextType: content type of the input text\n\ttext: input text\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderText = function(outputType,textType,text,options) {\n\toptions = options || {};\n\tvar parser = this.parseText(textType,text,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : container.textContent;\n};\n\n/*\nParse text from a tiddler and render it into another format\n\toutputType: content type for the output\n\ttitle: title of the tiddler to be rendered\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderTiddler = function(outputType,title,options) {\n\toptions = options || {};\n\tvar parser = this.parseTiddler(title,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : (outputType === \"text/plain-formatted\" ? container.formattedTextContent : container.textContent);\n};\n\n/*\nReturn an array of tiddler titles that match a search string\n\ttext: The text string to search for\n\toptions: see below\nOptions available:\n\tsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\n\texclude: An array of tiddler titles to exclude from the search\n\tinvert: If true returns tiddlers that do not contain the specified string\n\tcaseSensitive: If true forces a case sensitive search\n\tfield: If specified, restricts the search to the specified field, or an array of field names\n\tanchored: If true, forces all but regexp searches to be anchored to the start of text\n\texcludeField: If true, the field options are inverted to specify the fields that are not to be searched\n\tThe search mode is determined by the first of these boolean flags to be true\n\t\tliteral: searches for literal string\n\t\twhitespace: same as literal except runs of whitespace are treated as a single space\n\t\tregexp: treats the search term as a regular expression\n\t\twords: (default) treats search string as a list of tokens, and matches if all tokens are found, regardless of adjacency or ordering\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tinvert = !!options.invert;\n\t// Convert the search string into a regexp for each term\n\tvar terms, searchTermsRegExps,\n\t\tflags = options.caseSensitive ? \"\" : \"i\",\n\t\tanchor = options.anchored ? \"^\" : \"\";\n\tif(options.literal) {\n\t\tif(text.length === 0) {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else if(options.whitespace) {\n\t\tterms = [];\n\t\t$tw.utils.each(text.split(/\\s+/g),function(term) {\n\t\t\tif(term) {\n\t\t\t\tterms.push($tw.utils.escapeRegExp(term));\n\t\t\t}\n\t\t});\n\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + terms.join(\"\\\\s+\") + \")\",flags)];\n\t} else if(options.regexp) {\n\t\ttry {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + text + \")\",flags)];\t\t\t\n\t\t} catch(e) {\n\t\t\tsearchTermsRegExps = null;\n\t\t\tconsole.log(\"Regexp error parsing /(\" + text + \")/\" + flags + \": \",e);\n\t\t}\n\t} else {\n\t\tterms = text.split(/ +/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n\t// Accumulate the array of fields to be searched or excluded from the search\n\tvar fields = [];\n\tif(options.field) {\n\t\tif($tw.utils.isArray(options.field)) {\n\t\t\t$tw.utils.each(options.field,function(fieldName) {\n\t\t\t\tif(fieldName) {\n\t\t\t\t\tfields.push(fieldName);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tfields.push(options.field);\n\t\t}\n\t}\n\t// Use default fields if none specified and we're not excluding fields (excluding fields with an empty field array is the same as searching all fields)\n\tif(fields.length === 0 && !options.excludeField) {\n\t\tfields.push(\"title\");\n\t\tfields.push(\"tags\");\n\t\tfields.push(\"text\");\n\t}\n\t// Function to check a given tiddler for the search term\n\tvar searchTiddler = function(title) {\n\t\tif(!searchTermsRegExps) {\n\t\t\treturn true;\n\t\t}\n\t\tvar notYetFound = searchTermsRegExps.slice();\n\n\t\tvar tiddler = self.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\ttiddler = new $tw.Tiddler({title: title, text: \"\", type: \"text/vnd.tiddlywiki\"});\n\t\t}\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"],\n\t\t\tsearchFields;\n\t\t// Get the list of fields we're searching\n\t\tif(options.excludeField) {\n\t\t\tsearchFields = Object.keys(tiddler.fields);\n\t\t\t$tw.utils.each(fields,function(fieldName) {\n\t\t\t\tvar p = searchFields.indexOf(fieldName);\n\t\t\t\tif(p !== -1) {\n\t\t\t\t\tsearchFields.splice(p,1);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsearchFields = fields;\n\t\t}\n\t\tfor(var fieldIndex=0; notYetFound.length>0 && fieldIndex<searchFields.length; fieldIndex++) {\n\t\t\t// Don't search the text field if the content type is binary\n\t\t\tvar fieldName = searchFields[fieldIndex];\n\t\t\tif(fieldName === \"text\" && contentTypeInfo.encoding !== \"utf8\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar str = tiddler.fields[fieldName],\n\t\t\t\tt;\n\t\t\tif(str) {\n\t\t\t\tif($tw.utils.isArray(str)) {\n\t\t\t\t\t// If the field value is an array, test each regexp against each field array entry and fail if each regexp doesn't match at least one field array entry\n\t\t\t\t\tfor(var s=0; s<str.length; s++) {\n\t\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\t\tif(notYetFound[t].test(str[s])) {\n\t\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// If the field isn't an array, force it to a string and test each regexp against it and fail if any do not match\n\t\t\t\t\tstr = tiddler.getFieldString(fieldName);\n\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\tif(notYetFound[t].test(str)) {\n\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn notYetFound.length == 0;\n\t};\n\t// Loop through all the tiddlers doing the search\n\tvar results = [],\n\t\tsource = options.source || this.each;\n\tsource(function(tiddler,title) {\n\t\tif(searchTiddler(title) !== options.invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(!tiddler.hasField(\"_is_skinny\")) {\n\t\t// Just return the text if we've got it\n\t\treturn tiddler.fields.text || \"\";\n\t} else {\n\t\t// Tell any listeners about the need to lazily load this tiddler\n\t\tthis.dispatchEvent(\"lazyLoad\",title);\n\t\t// Indicate that the text is being loaded\n\t\treturn null;\n\t}\n};\n\n/*\nCheck whether the text of a tiddler matches a given value. By default, the comparison is case insensitive, and any spaces at either end of the tiddler text is trimmed\n*/\nexports.checkTiddlerText = function(title,targetText,options) {\n\toptions = options || {};\n\tvar text = this.getTiddlerText(title,\"\");\n\tif(!options.noTrim) {\n\t\ttext = text.trim();\n\t}\n\tif(!options.caseSensitive) {\n\t\ttext = text.toLowerCase();\n\t\ttargetText = targetText.toLowerCase();\n\t}\n\treturn text === targetText;\n}\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\tvar result = [],\n\t\toutstanding = files.length,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tresult.push.apply(result,tiddlerFieldsArray);\n\t\t\tif(--outstanding === 0) {\n\t\t\t\tcallback(result);\n\t\t\t}\n\t\t};\n\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],$tw.utils.extend({},options,{callback: readFileCallback}));\n\t}\n\treturn files.length;\n};\n\n/*\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFile = function(file,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\t// Get the type, falling back to the filename extension\n\tvar self = this,\n\t\ttype = file.type;\n\tif(type === \"\" || !type) {\n\t\tvar dotPos = file.name.lastIndexOf(\".\");\n\t\tif(dotPos !== -1) {\n\t\t\tvar fileExtensionInfo = $tw.utils.getFileExtensionInfo(file.name.substr(dotPos));\n\t\t\tif(fileExtensionInfo) {\n\t\t\t\ttype = fileExtensionInfo.type;\n\t\t\t}\n\t\t}\n\t}\n\t// Figure out if we're reading a binary file\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\n\t\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \"base64\" : false;\n\t// Log some debugging information\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Importing file '\" + file.name + \"', type: '\" + type + \"', isBinary: \" + isBinary);\n\t}\n\t// Give the hook a chance to process the drag\n\tif($tw.hooks.invokeHook(\"th-importing-file\",{\n\t\tfile: file,\n\t\ttype: type,\n\t\tisBinary: isBinary,\n\t\tcallback: callback\n\t}) !== true) {\n\t\tthis.readFileContent(file,type,isBinary,options.deserializer,callback);\n\t}\n};\n\n/*\nLower level utility to read the content of a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFileContent = function(file,type,isBinary,deserializer,callback) {\n\tvar self = this;\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\"};\n\t\tif(isBinary) {\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttext = text.substr(commaPos + 1);\n\t\t\t}\n\t\t}\n\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedJson) {\n\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\tcallback(tiddlers);\n\t\t\t});\n\t\t} else {\n\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields,{deserializer: deserializer}));\n\t\t}\n\t};\n\t// Kick off the read\n\tif(isBinary) {\n\t\treader.readAsDataURL(file);\n\t} else {\n\t\treader.readAsText(file);\n\t}\n};\n\n/*\nFind any existing draft of a specified tiddler\n*/\nexports.findDraft = function(targetTitle) {\n\tvar draftTitle = undefined;\n\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\n\t\tif(tiddler.fields[\"draft.title\"] && tiddler.fields[\"draft.of\"] === targetTitle) {\n\t\t\tdraftTitle = title;\n\t\t}\n\t});\n\treturn draftTitle;\n}\n\n/*\nCheck whether the specified draft tiddler has been modified.\nIf the original tiddler doesn't exist, create  a vanilla tiddler variable,\nto check if additional fields have been added.\n*/\nexports.isDraftModified = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(!tiddler.isDraft()) {\n\t\treturn false;\n\t}\n\tvar ignoredFields = [\"created\", \"modified\", \"title\", \"draft.title\", \"draft.of\"],\n\t\torigTiddler = this.getTiddler(tiddler.fields[\"draft.of\"]) || new $tw.Tiddler({text:\"\", tags:[]}),\n\t\ttitleModified = tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"];\n\treturn titleModified || !tiddler.isEqual(origTiddler,ignoredFields);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\n*/\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\n\tvar story = new $tw.Story({wiki: this, historyTitle: historyTitle});\n\tstory.addToHistory(title,fromPageRect);\t\n\tconsole.log(\"$tw.wiki.addToHistory() is deprecated since V5.1.23! Use the this.story.addToHistory() from the story-object!\")\n};\n\n/*\nAdd a new tiddler to the story river\ntitle: a title string or an array of title strings\nfromTitle: the title of the tiddler from which the navigation originated\nstoryTitle: title of story tiddler (defaults to $:/StoryList)\noptions: see story.js\n*/\nexports.addToStory = function(title,fromTitle,storyTitle,options) {\n\tvar story = new $tw.Story({wiki: this, storyTitle: storyTitle});\n\tstory.addToStory(title,fromTitle,options);\n\tconsole.log(\"$tw.wiki.addToStory() is deprecated since V5.1.23! Use the this.story.addToStory() from the story-object!\")\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nexports.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle,\n\t\tusername = this.getTiddlerText(\"$:/status/UserName\"),\n\t\tattribution = username ? \" by \" + username : \"\";\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\" + attribution;\n\t\tc++;\n\t} while(this.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n/*\nInvoke the available upgrader modules\ntitles: array of tiddler titles to be processed\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\nReturns a hashmap of messages keyed by tiddler title.\n*/\nexports.invokeUpgraders = function(titles,tiddlers) {\n\t// Collect up the available upgrader modules\n\tvar self = this;\n\tif(!this.upgraderModules) {\n\t\tthis.upgraderModules = [];\n\t\t$tw.modules.forEachModuleOfType(\"upgrader\",function(title,module) {\n\t\t\tif(module.upgrade) {\n\t\t\t\tself.upgraderModules.push(module);\n\t\t\t}\n\t\t});\n\t}\n\t// Invoke each upgrader in turn\n\tvar messages = {};\n\tfor(var t=0; t<this.upgraderModules.length; t++) {\n\t\tvar upgrader = this.upgraderModules[t],\n\t\t\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\n\t\t$tw.utils.extend(messages,upgraderMessages);\n\t}\n\treturn messages;\n};\n\n// Determine whether a plugin by title is dynamically loadable\nexports.doesPluginRequireReload = function(title) {\n\treturn this.doesPluginInfoRequireReload(this.getPluginInfo(title) || this.getTiddlerDataCached(title));\n};\n\n// Determine whether a plugin info structure is dynamically loadable\nexports.doesPluginInfoRequireReload = function(pluginInfo) {\n\tif(pluginInfo) {\n\t\tvar foundModule = false;\n\t\t$tw.utils.each(pluginInfo.tiddlers,function(tiddler) {\n\t\t\tif(tiddler.type === \"application/javascript\" && $tw.utils.hop(tiddler,\"module-type\")) {\n\t\t\t\tfoundModule = true;\n\t\t\t}\n\t\t});\n\t\treturn foundModule;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.slugify = function(title,options) {\n\tvar tiddler = this.getTiddler(title),\n\t\tslug;\n\tif(tiddler && tiddler.fields.slug) {\n\t\tslug = tiddler.fields.slug;\n\t} else {\n\t\tslug = $tw.utils.transliterate(title.toString().toLowerCase()) // Replace diacritics with basic lowercase ASCII\n\t\t\t.replace(/\\s+/g,\"-\")                                       // Replace spaces with -\n\t\t\t.replace(/[^\\w\\-\\.]+/g,\"\")                                 // Remove all non-word chars except dash and dot\n\t\t\t.replace(/\\-\\-+/g,\"-\")                                     // Replace multiple - with single -\n\t\t\t.replace(/^-+/,\"\")                                         // Trim - from start of text\n\t\t\t.replace(/-+$/,\"\");                                        // Trim - from end of text\n\t}\n\t// If the resulting slug is blank (eg because the title is just punctuation characters)\n\tif(!slug) {\n\t\t// ...then just use the character codes of the title\n\t\tvar result = [];\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tresult.push(char.charCodeAt(0).toString());\n\t\t});\n\t\tslug = result.join(\"-\");\n\t}\n\treturn slug;\n};\n\n})();\n\n",
            "type": "application/javascript",
            "module-type": "wikimethod"
        },
        "$:/palettes/Blanca": {
            "title": "$:/palettes/Blanca",
            "name": "Blanca",
            "description": "A clean white palette to let you focus",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ffffff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #7897f3\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ccc\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #7897f3\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #eee\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #ff9900\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/Blue": {
            "title": "$:/palettes/Blue",
            "name": "Blue",
            "description": "A blue theme",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333353\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ddddff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #5959c0\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: #ccccdd\ntab-border-selected: #ccccdd\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #eeeeff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #666666\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #ffffff\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #ffffff\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #5959c0\ntoolbar-new-button: #5eb95e\ntoolbar-options-button: rgb(128, 88, 165)\ntoolbar-save-button: #0e90d2\ntoolbar-info-button: #0e90d2\ntoolbar-edit-button: rgb(243, 123, 29)\ntoolbar-close-button: #dd514c\ntoolbar-delete-button: #dd514c\ntoolbar-cancel-button: rgb(243, 123, 29)\ntoolbar-done-button: #5eb95e\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/Muted": {
            "title": "$:/palettes/Muted",
            "name": "Muted",
            "description": "Bright tiddlers on a muted background",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #6f6f70\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #29a6ee\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #c2c1c2\nsidebar-foreground-shadow: rgba(255,255,255,0)\nsidebar-foreground: #d3d2d4\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #6f6f70\nsidebar-tab-background: #666667\nsidebar-tab-border-selected: #999\nsidebar-tab-border: #515151\nsidebar-tab-divider: #999\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #999\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #d1d0d2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/ContrastLight": {
            "title": "$:/palettes/ContrastLight",
            "name": "Contrast (Light)",
            "description": "High contrast and unambiguous (light version)",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #000\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #000\ntag-foreground: #fff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/ContrastDark": {
            "title": "$:/palettes/ContrastDark",
            "name": "Contrast (Dark)",
            "description": "High contrast and unambiguous (dark version)",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #000\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #fff\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #fff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/CupertinoDark": {
            "title": "$:/palettes/CupertinoDark",
            "tags": "$:/tags/Palette",
            "name": "Cupertino Dark",
            "description": "A macOS inspired dark palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #FF453A\nalert-border: #FF453A\nalert-highlight: #FFD60A\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #282828\nblockquote-bar: <<colour page-background>>\nbutton-foreground: <<colour background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #FF453A\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour tiddler-info-background>>\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: #3F638B\ndropdown-tab-background: #323232\ndropzone-background: #30D158\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #BF5AF2\nexternal-link-foreground: #32D74B\nforeground: #FFFFFF\nmenubar-background: #464646\nmenubar-foreground: #ffffff\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: #98989D\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #323232\npre-background: #464646\npre-border: transparent\nprimary: #0A84FF\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour background>>\nsidebar-controls-foreground-hover: #FF9F0A\nsidebar-controls-foreground: #8E8E93\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: #3F638B\nsidebar-tab-background: <<colour background>>\nsidebar-tab-border-selected: <<colour background>>\nsidebar-tab-border: <<colour background>>\nsidebar-tab-divider: <<colour background>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: #ffffff\nstatic-alert-foreground: #B4B4B4\ntab-background-selected: #3F638B\ntab-background: <<colour page-background>>\ntab-border-selected: <<colour page-background>>\ntab-border: <<colour page-background>>\ntab-divider: <<colour page-background>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #464646\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #48484A\ntag-foreground: #323232\ntiddler-background: <<colour background>>\ntiddler-border: transparent\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: #48484A\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #1E1E1E\ntiddler-info-border: #1E1E1E\ntiddler-info-tab-background: #3F638B\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: #464646\nselection-background: #3F638B\nselection-foreground: #ffffff\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #3F638B\nwikilist-button-foreground: <<colour foreground>>\nwikilist-button-open: #32D74B\nwikilist-button-open-hover: #32D74B\nwikilist-button-reveal: #0A84FF\nwikilist-button-reveal-hover: #0A84FF\nwikilist-button-remove: #FF453A\nwikilist-button-remove-hover: #FF453A\nwikilist-droplink-dragover: #32D74B\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour foreground>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-url: <<colour muted-foreground>>\n"
        },
        "$:/palettes/DarkPhotos": {
            "title": "$:/palettes/DarkPhotos",
            "created": "20150402111612188",
            "description": "Good with dark photo backgrounds",
            "modified": "20150402112344080",
            "name": "DarkPhotos",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: \nbutton-foreground: \nbutton-border: \ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #ddd\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #336438\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #ccf\nsidebar-controls-foreground: #fff\nsidebar-foreground-shadow: rgba(0,0,0, 0.5)\nsidebar-foreground: #fff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #eee\nsidebar-tab-background-selected: rgba(255,255,255, 0.8)\nsidebar-tab-background: rgba(255,255,255, 0.4)\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: rgba(255,255,255, 0.2)\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #aaf\nsidebar-tiddler-link-foreground: #ddf\nsite-title-foreground: #fff\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/DesertSand": {
            "title": "$:/palettes/DesertSand",
            "tags": "$:/tags/Palette",
            "name": "Desert Sand",
            "description": "A desert sand palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #E9E0C7\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour foreground>>\ncode-background: #F3EDDF\ncode-border: #C3BAA1\ncode-foreground: #ab3250\ndiff-delete-background: #bd8b8b\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #91c093\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ad3434\ndownload-background: #6ca16c\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #E9E0C7\ndropdown-tab-background: #BAB29C\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #313163\nexternal-link-foreground: #555592\nforeground: #2D2A23\nmenubar-background: #CDC2A6\nmenubar-foreground: #5A5446\nmessage-background: #ECE5CF\nmessage-border: #D6CBAA\nmessage-foreground: #5f6e7d\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #8A8885\nmodal-footer-background: #CDC2A6\nmodal-footer-border: #9D998E\nmodal-header-border: #9D998E\nmuted-foreground: #9D998E\nnotification-background: #F0E9D7\nnotification-border: #939189\npage-background: #e0d3af\npre-background: #D6CBAA\npre-border: #CDC2A6\nprimary: #5B6F55\nselection-background: #9D947B\nselection-foreground: <<colour foreground>>\nselect-tag-background: #F0E9D7\nselect-tag-foreground: #2D2A23\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #2D2A23\nsidebar-controls-foreground: #867F69\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #867F69\nsidebar-muted-foreground-hover: #706A58\nsidebar-muted-foreground: #B3A98C\nsidebar-tab-background-selected: #e0d3af\nsidebar-tab-background: #A6A193\nsidebar-tab-border-selected: #C3BAA1\nsidebar-tab-border: #C3BAA1\nsidebar-tab-divider: #CDC2A6\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #2D2A23\nsidebar-tiddler-link-foreground-hover: #433F35\nsidebar-tiddler-link-foreground: #706A58\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #A6A193\ntab-background-selected: #E9E0C7\ntab-background: #A6A193\ntab-border-selected: #C3BAA1\ntab-border: #C3BAA1\ntab-divider: #CDC2A6\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #2D2A23\ntable-border: #9D998E\ntable-footer-background: #8A8885\ntable-header-background: #B0AA98\ntag-background: #706A58\ntag-foreground: #E3D7B7\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #9D947B\ntiddler-controls-foreground-selected: #706A58\ntiddler-controls-foreground: #C3BAA1\ntiddler-editor-background: #E9E0C7\ntiddler-editor-border-image: #A6A193\ntiddler-editor-border: #A6A193\ntiddler-editor-fields-even: #D6CBAA\ntiddler-editor-fields-odd: #C3BAA1\ntiddler-info-background: #E3D7B7\ntiddler-info-border: #BAB29C\ntiddler-info-tab-background: #E9E0C7\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #867F69\ntiddler-title-foreground: #374464\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #8A8885\nvery-muted-foreground: #CDC2A6\nwikilist-background: <<colour page-background>>\nwikilist-item: #CDC2A6\nwikilist-info: #161512\nwikilist-title: #433F35\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #706A58\nwikilist-button-open: #7db66a\nwikilist-button-open-hover: #56a556\nwikilist-button-reveal: #5a6c9e\nwikilist-button-reveal-hover: #454591\nwikilist-button-remove: #bc5972\nwikilist-button-remove-hover: #814040\nwikilist-toolbar-background: #CDC2A6\nwikilist-toolbar-foreground: #2D2A23\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #A6A193\nwikilist-button-foreground: #161512\n"
        },
        "$:/palettes/GruvboxDark": {
            "title": "$:/palettes/GruvboxDark",
            "name": "Gruvbox Dark",
            "description": "Retro groove color scheme",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "license": "https://github.com/morhetz/gruvbox",
            "text": "alert-background: #cc241d\nalert-border: #cc241d\nalert-highlight: #d79921\nalert-muted-foreground: #504945\nbackground: #3c3836\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour page-background>>\ncode-background: #504945\ncode-border: #504945\ncode-foreground: #fb4934\ndiff-delete-background: #fb4934\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #b8bb26\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #fb4934\ndownload-background: #b8bb26\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #665c54\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ebdbb2\ndropdown-tab-background: #665c54\ndropzone-background: #98971a\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #d3869b\nexternal-link-foreground: #8ec07c\nforeground: #fbf1c7\nmenubar-background: #504945\nmenubar-foreground: <<colour foreground>>\nmessage-background: #83a598\nmessage-border: #83a598\nmessage-foreground: #3c3836\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #504945\nmodal-footer-background: #3c3836\nmodal-footer-border: #3c3836\nmodal-header-border: #3c3836\nmuted-foreground: #d5c4a1\nnotification-background: <<colour primary>>\nnotification-border: <<colour primary>>\npage-background: #282828\npre-background: #504945\npre-border: #504945\nprimary: #d79921\nselect-tag-background: #665c54\nselect-tag-foreground: <<colour foreground>>\nselection-background: #458588\nselection-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour page-background>>\nsidebar-controls-foreground-hover: #7c6f64\nsidebar-controls-foreground: #504945\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #fbf1c7\nsidebar-muted-foreground-hover: #7c6f64\nsidebar-muted-foreground: #504945\nsidebar-tab-background-selected: #bdae93\nsidebar-tab-background: #3c3836\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #bdae93\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #282828\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #458588\nsidebar-tiddler-link-foreground: #98971a\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ebdbb2\ntab-background: #665c54\ntab-border-selected: #665c54\ntab-border: #665c54\ntab-divider: #bdae93\ntab-foreground-selected: #282828\ntab-foreground: #ebdbb2\ntable-border: #7c6f64\ntable-footer-background: #665c54\ntable-header-background: #504945\ntag-background: #d3869b\ntag-foreground: #282828\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #7c6f64\ntiddler-controls-foreground-selected: <<colour primary>>\ntiddler-controls-foreground: #665c54\ntiddler-editor-background: #32302f\ntiddler-editor-border-image: #282828\ntiddler-editor-border: #282828\ntiddler-editor-fields-even: #504945\ntiddler-editor-fields-odd: #7c6f64\ntiddler-info-background: #32302f\ntiddler-info-border: #ebdbb2\ntiddler-info-tab-background: #ebdbb2\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #7c6f64\ntiddler-title-foreground: #a89984\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #504945\nvery-muted-foreground: #bdae93\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #acacac\nwikilist-button-foreground: <<colour button-foreground>>\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: <<colour muted-foreground>>\nwikilist-button-open-hover: <<colour primary>>\nwikilist-button-open: <<colour dropzone-background>>\nwikilist-button-remove: <<colour dirty-indicator>>\nwikilist-button-remove-hover: <<colour alert-background>>\nwikilist-droplink-dragover: <<colour dropzone-background>>\nwikilist-button-reveal: <<colour sidebar-tiddler-link-foreground-hover>>\nwikilist-button-reveal-hover: <<colour message-background>>\n"
        },
        "$:/palettes/Nord": {
            "title": "$:/palettes/Nord",
            "name": "Nord",
            "description": "An arctic, north-bluish color palette.",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "license": "MIT, arcticicestudio, https://github.com/arcticicestudio/nord/blob/develop/LICENSE.md",
            "text": "alert-background: #D08770\nalert-border: #D08770\nalert-highlight: #B48EAD\nalert-muted-foreground: #4C566A\nbackground: #3b4252\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour page-background>>\ncode-background: #2E3440\ncode-border: #2E3440\ncode-foreground: #BF616A\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #A3BE8C\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #BF616A\ndownload-background: #A3BE8C\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ECEFF4\ndropdown-tab-background: #4C566A\ndropzone-background: #A3BE8C\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #5E81AC\nexternal-link-foreground: #8FBCBB\nforeground: #d8dee9\nmenubar-background: #2E3440\nmenubar-foreground: #d8dee9\nmessage-background: #2E3440\nmessage-border: #2E3440\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #3b4252\nmodal-footer-background: #3b4252\nmodal-footer-border: #3b4252\nmodal-header-border: #3b4252\nmuted-foreground: #4C566A\nnotification-background: <<colour primary>>\nnotification-border: #EBCB8B\npage-background: #2e3440\npre-background: #2E3440\npre-border: #2E3440\nprimary: #5E81AC\nselect-tag-background: #3b4252\nselect-tag-foreground: <<colour foreground>>\nselection-background: #5E81AC\nselection-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour page-background>>\nsidebar-controls-foreground-hover: #D8DEE9\nsidebar-controls-foreground: #4C566A\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #D8DEE9\nsidebar-muted-foreground-hover: #4C566A\nsidebar-muted-foreground: #4C566A\nsidebar-tab-background-selected: #ECEFF4\nsidebar-tab-background: #4C566A\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #4C566A\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #4C566A\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #A3BE8C\nsidebar-tiddler-link-foreground: #81A1C1\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ECEFF4\ntab-background: #4C566A\ntab-border-selected: #4C566A\ntab-border: #4C566A\ntab-divider: #4C566A\ntab-foreground-selected: #4C566A\ntab-foreground: #D8DEE9\ntable-border: #4C566A\ntable-footer-background: #2e3440\ntable-header-background: #2e3440\ntag-background: #A3BE8C\ntag-foreground: #4C566A\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: \ntiddler-controls-foreground-selected: #EBCB8B\ntiddler-controls-foreground: #4C566A\ntiddler-editor-background: #2e3440\ntiddler-editor-border-image: #2e3440\ntiddler-editor-border: #3b4252\ntiddler-editor-fields-even: #2e3440\ntiddler-editor-fields-odd: #2e3440\ntiddler-info-background: #2e3440\ntiddler-info-border: #2e3440\ntiddler-info-tab-background: #2e3440\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #4C566A\ntiddler-title-foreground: #81A1C1\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #2d3038\nvery-muted-foreground: #2d3038\nwikilist-background: <<colour page-background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-item: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-info: <<colour muted-foreground>>\nwikilist-button-open: #A3BE8C\nwikilist-button-open-hover: #A3BE8C\nwikilist-button-reveal: #81A1C1\nwikilist-button-reveal-hover: #81A1C1\nwikilist-button-remove: #B48EAD\nwikilist-button-remove-hover: #B48EAD\n"
        },
        "$:/palettes/Rocker": {
            "title": "$:/palettes/Rocker",
            "name": "Rocker",
            "description": "A dark theme",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #cc0000\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #000\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #ffbb99\nsidebar-tiddler-link-foreground: #cc0000\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffbb99\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #cc0000\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/SolarFlare": {
            "title": "$:/palettes/SolarFlare",
            "name": "Solar Flare",
            "description": "Warm, relaxing earth colours",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": ": Background Tones\n\nbase03: #002b36\nbase02: #073642\n\n: Content Tones\n\nbase01: #586e75\nbase00: #657b83\nbase0: #839496\nbase1: #93a1a1\n\n: Background Tones\n\nbase2: #eee8d5\nbase3: #fdf6e3\n\n: Accent Colors\n\nyellow: #b58900\norange: #cb4b16\nred: #dc322f\nmagenta: #d33682\nviolet: #6c71c4\nblue: #268bd2\ncyan: #2aa198\ngreen: #859900\n\n: Additional Tones (RA)\n\nbase10: #c0c4bb\nviolet-muted: #7c81b0\nblue-muted: #4e7baa\n\nyellow-hot: #ffcc44\norange-hot: #eb6d20\nred-hot: #ff2222\nblue-hot: #2298ee\ngreen-hot: #98ee22\n\n: Palette\n\n: Do not use colour macro for background and foreground\nbackground: #fdf6e3\n    download-foreground: <<colour background>>\n    dragger-foreground: <<colour background>>\n    dropdown-background: <<colour background>>\n    modal-background: <<colour background>>\n    sidebar-foreground-shadow: <<colour background>>\n    tiddler-background: <<colour background>>\n    tiddler-border: <<colour background>>\n    tiddler-link-background: <<colour background>>\n    tab-background-selected: <<colour background>>\n        dropdown-tab-background-selected: <<colour tab-background-selected>>\nforeground: #657b83\n    dragger-background: <<colour foreground>>\n    tab-foreground: <<colour foreground>>\n        tab-foreground-selected: <<colour tab-foreground>>\n            sidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\n        sidebar-tab-foreground: <<colour tab-foreground>>\n    sidebar-button-foreground: <<colour foreground>>\n    sidebar-controls-foreground: <<colour foreground>>\n    sidebar-foreground: <<colour foreground>>\n: base03\n: base02\n: base01\n    alert-muted-foreground: <<colour base01>>\n: base00\n    code-foreground: <<colour base00>>\n    message-foreground: <<colour base00>>\n    tag-foreground: <<colour base00>>\n: base0\n    sidebar-tiddler-link-foreground: <<colour base0>>\n: base1\n    muted-foreground: <<colour base1>>\n        blockquote-bar: <<colour muted-foreground>>\n        dropdown-border: <<colour muted-foreground>>\n        sidebar-muted-foreground: <<colour muted-foreground>>\n        tiddler-title-foreground: <<colour muted-foreground>>\n            site-title-foreground: <<colour tiddler-title-foreground>>\n: base2\n    modal-footer-background: <<colour base2>>\n    page-background: <<colour base2>>\n        modal-backdrop: <<colour page-background>>\n        notification-background: <<colour page-background>>\n        code-background: <<colour page-background>>\n            code-border: <<colour code-background>>\n        pre-background: <<colour page-background>>\n            pre-border: <<colour pre-background>>\n        sidebar-tab-background-selected: <<colour page-background>>\n    table-header-background: <<colour base2>>\n    tag-background: <<colour base2>>\n    tiddler-editor-background: <<colour base2>>\n    tiddler-info-background: <<colour base2>>\n    tiddler-info-tab-background: <<colour base2>>\n    tab-background: <<colour base2>>\n        dropdown-tab-background: <<colour tab-background>>\n: base3\n    alert-background: <<colour base3>>\n    message-background: <<colour base3>>\n: yellow\n: orange\n: red\n: magenta\n    alert-highlight: <<colour magenta>>\n: violet\n    external-link-foreground: <<colour violet>>\n: blue\n: cyan\n: green\n: base10\n    tiddler-controls-foreground: <<colour base10>>\n: violet-muted\n    external-link-foreground-visited: <<colour violet-muted>>\n: blue-muted\n    primary: <<colour blue-muted>>\n        download-background: <<colour primary>>\n        tiddler-link-foreground: <<colour primary>>\n\nalert-border: #b99e2f\ndirty-indicator: #ff0000\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nmessage-border: #cfd6e6\nmodal-border: #999999\nselect-tag-background:\nselect-tag-foreground:\nsidebar-controls-foreground-hover:\nsidebar-muted-foreground-hover:\nsidebar-tab-background: #ded8c5\nsidebar-tiddler-link-foreground-hover:\nstatic-alert-foreground: #aaaaaa\ntab-border: #cccccc\n    modal-footer-border: <<colour tab-border>>\n    modal-header-border: <<colour tab-border>>\n    notification-border: <<colour tab-border>>\n    sidebar-tab-border: <<colour tab-border>>\n    tab-border-selected: <<colour tab-border>>\n        sidebar-tab-border-selected: <<colour tab-border-selected>>\ntab-divider: #d8d8d8\n    sidebar-tab-divider: <<colour tab-divider>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-border: #dddddd\ntiddler-subtitle-foreground: #c0c0c0\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
        },
        "$:/palettes/SolarizedDark": {
            "title": "$:/palettes/SolarizedDark",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Precision dark colors for machines and people",
            "license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE",
            "name": "SolarizedDark",
            "text": "alert-background: #073642\nalert-border: #93a1a1\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #073642\nblockquote-bar: #d33682\nbutton-background: #073642\nbutton-border: #586e75\nbutton-foreground: #93a1a1\ncode-background: #073642\ncode-border: #586e75\ncode-foreground: #93a1a1\ndirty-indicator: inherit\ndownload-background: #859900\ndownload-foreground: #073642\ndragger-background: #073642\ndragger-foreground: #839496\ndropdown-background: #073642\ndropdown-border: #93a1a1\ndropdown-tab-background: #002b36\ndropdown-tab-background-selected: #073642\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover:\nexternal-link-foreground-visited: #268bd2\nforeground: #839496\nmessage-background: #002b36\nmessage-border: #586e75\nmessage-foreground: #839496\nmodal-backdrop: #657b83\nmodal-background: #002b36\nmodal-border: #586e75\nmodal-footer-background: #073642\nmodal-footer-border: #586e75\nmodal-header-border: #586e75\nmuted-foreground: #93a1a1\nnotification-background: #002b36\nnotification-border: #586e75\npage-background: #073642\npre-background: inherit\npre-border: #657b83\nprimary: #859900\nselect-tag-background: #002b36\nselect-tag-foreground: #839496\nsidebar-button-foreground: #93a1a1\nsidebar-controls-foreground: #93a1a1\nsidebar-controls-foreground-hover: #eee8d5\nsidebar-foreground: #93a1a1\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #839496\nsidebar-muted-foreground-hover: #93a1a1\nsidebar-tab-background: #002b36\nsidebar-tab-background-selected: #073642\nsidebar-tab-border: #073642\nsidebar-tab-border-selected: #839496\nsidebar-tab-divider: #002b36\nsidebar-tab-foreground: #657b83\nsidebar-tab-foreground-selected: #93a1a1\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #eee8d5\nsite-title-foreground: #d33682\nstatic-alert-foreground: #93a1a1\ntab-background: #073642\ntab-background-selected: #002b36\ntab-border: #586e75\ntab-border-selected: #93a1a1\ntab-divider: #93a1a1\ntab-foreground: #839496\ntab-foreground-selected: #93a1a1\ntable-border: #586e75\ntable-footer-background: #073642\ntable-header-background: #073642\ntag-background: #b58900\ntag-foreground: #002b36\ntiddler-background: #002b36\ntiddler-border: #586e75\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #002b36\ntiddler-editor-border: #073642\ntiddler-editor-border-image: #002b36\ntiddler-editor-fields-even: #002b36\ntiddler-editor-fields-odd: #073642\ntiddler-info-background: #073642\ntiddler-info-border: #657b83\ntiddler-info-tab-background: #002b36\ntiddler-link-background: #002b36\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #839496\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #839496\ntoolbar-close-button: #839496\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #839496\ntoolbar-edit-button: #839496\ntoolbar-info-button: #839496\ntoolbar-new-button: #839496\ntoolbar-options-button: #839496\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #586e75\n"
        },
        "$:/palettes/SolarizedLight": {
            "title": "$:/palettes/SolarizedLight",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Precision colors for machines and people",
            "license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE",
            "name": "SolarizedLight",
            "text": "alert-background: #eee8d5\nalert-border: #586e75\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #eee8d5\nblockquote-bar: #d33682\nbutton-background: #eee8d5\nbutton-border: #93a1a1\nbutton-foreground: #586e75\ncode-background: #eee8d5\ncode-border: #93a1a1\ncode-foreground: #586e75\ndirty-indicator: inherit\ndownload-background: #859900\ndownload-foreground: #eee8d5\ndragger-background: #eee8d5\ndragger-foreground: #657b83\ndropdown-background: #eee8d5\ndropdown-border: #586e75\ndropdown-tab-background: #fdf6e3\ndropdown-tab-background-selected: #eee8d5\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #268bd2\nforeground: #657b83\nmessage-background: #fdf6e3\nmessage-border: #93a1a1\nmessage-foreground: #657b83\nmodal-backdrop: #839496\nmodal-background: #fdf6e3\nmodal-border: #93a1a1\nmodal-footer-background: #eee8d5\nmodal-footer-border: #93a1a1\nmodal-header-border: #93a1a1\nmuted-foreground: #586e75\nnotification-background: #fdf6e3\nnotification-border: #93a1a1\npage-background: #eee8d5\npre-background: #eee8d5\npre-border: #839496\nprimary: #859900\nselect-tag-background: #fdf6e3\nselect-tag-foreground: #657b83\nsidebar-button-foreground: #586e75\nsidebar-controls-foreground: #586e75\nsidebar-controls-foreground-hover: #d33682\nsidebar-foreground: #586e75\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #657b83\nsidebar-muted-foreground-hover: #586e75\nsidebar-tab-background: #fdf6e3\nsidebar-tab-background-selected: #eee8d5\nsidebar-tab-border: #eee8d5\nsidebar-tab-border-selected: #657b83\nsidebar-tab-divider: #fdf6e3\nsidebar-tab-foreground: #839496\nsidebar-tab-foreground-selected: #586e75\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #002b36\nsite-title-foreground: #d33682\nstatic-alert-foreground: #586e75\ntab-background: #eee8d5\ntab-background-selected: #fdf6e3\ntab-border: #93a1a1\ntab-border-selected: #586e75\ntab-divider: #586e75\ntab-foreground: #657b83\ntab-foreground-selected: #586e75\ntable-border: #93a1a1\ntable-footer-background: #eee8d5\ntable-header-background: #eee8d5\ntag-background: #b58900\ntag-foreground: #fdf6e3\ntiddler-background: #fdf6e3\ntiddler-border: #93a1a1\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #fdf6e3\ntiddler-editor-border: #eee8d5\ntiddler-editor-border-image: #fdf6e3\ntiddler-editor-fields-even: #fdf6e3\ntiddler-editor-fields-odd: #eee8d5\ntiddler-info-background: #eee8d5\ntiddler-info-border: #839496\ntiddler-info-tab-background: #fdf6e3\ntiddler-link-background: #fdf6e3\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #657b83\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #657b83\ntoolbar-close-button: #657b83\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #657b83\ntoolbar-edit-button: #657b83\ntoolbar-info-button: #657b83\ntoolbar-new-button: #657b83\ntoolbar-options-button: #657b83\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #93a1a1\n"
        },
        "$:/palettes/SpartanDay": {
            "title": "$:/palettes/SpartanDay",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Cold, spartan day colors",
            "name": "Spartan Day",
            "text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #FAFAFA\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: #ececec\ncode-border: #ececec\ncode-foreground: \ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #FFFFFF\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #F5F5F5\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: \nexternal-link-foreground: \nforeground: rgba(0, 0, 0, 0.87)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(0, 0, 0, 0.54)\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour very-muted-foreground>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(0, 0, 0, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #f4f4f4\npre-background: #ececec\npre-border: #ececec\nprimary: #3949ab\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #aeaeae\nsidebar-controls-foreground: #c6c6c6\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground-hover: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground: rgba(0, 0, 0, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(0, 0, 0, 0.87)\nsidebar-tab-foreground: rgba(0, 0, 0, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(0, 0, 0, 0.87)\nsidebar-tiddler-link-foreground: rgba(0, 0, 0, 0.54)\nsite-title-foreground: rgba(0, 0, 0, 0.87)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(0, 0, 0, 0.87)\ntab-foreground: rgba(0, 0, 0, 0.54)\ntable-border: #d8d8d8\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: #f9f9f9\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: #e8e7e7\ntiddler-editor-fields-even: rgba(0, 0, 0, 0.1)\ntiddler-editor-fields-odd: rgba(0, 0, 0, 0.04)\ntiddler-info-background: #F5F5F5\ntiddler-info-border: #F5F5F5\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #000000\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(0, 0, 0, 0.12)\n"
        },
        "$:/palettes/SpartanNight": {
            "title": "$:/palettes/SpartanNight",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "description": "Dark spartan colors",
            "name": "Spartan Night",
            "text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #303030\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #424242\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #050505\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #7c318c\nexternal-link-foreground: #9e3eb3\nforeground: rgba(255, 255, 255, 0.7)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(255, 255, 255, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #212121\npre-background: #2a2a2a\npre-border: transparent\nprimary: #5656f3\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #494949\nsidebar-controls-foreground: #5d5d5d\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: rgba(255, 255, 255, 0.7)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #3a3a3a\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: rgb(55,55,55)\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #454545\ntiddler-info-border: #454545\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(255, 255, 255, 0.12)\n"
        },
        "$:/palettes/Twilight": {
            "title": "$:/palettes/Twilight",
            "tags": "$:/tags/Palette",
            "author": "Thomas Elmiger",
            "type": "application/x-tiddler-dictionary",
            "name": "Twilight",
            "description": "Delightful, soft darkness.",
            "text": "alert-background: rgb(255, 255, 102)\nalert-border: rgb(232, 232, 125)\nalert-highlight: rgb(255, 51, 51)\nalert-muted-foreground: rgb(224, 82, 82)\nbackground: rgb(38, 38, 38)\nblockquote-bar: rgba(240, 196, 117, 0.7)\nbutton-background: rgb(63, 63, 63)\nbutton-border: rgb(127, 127, 127)\nbutton-foreground: rgb(179, 179, 179)\ncode-background: rgba(0,0,0,0.03)\ncode-border: rgba(0,0,0,0.08)\ncode-foreground: rgb(255, 94, 94)\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: rgb(255, 94, 94)\ndownload-background: #19a974\ndownload-foreground: rgb(38, 38, 38)\ndragger-background: rgb(179, 179, 179)\ndragger-foreground: rgb(38, 38, 38)\ndropdown-background: rgb(38, 38, 38)\ndropdown-border: rgb(255, 255, 255)\ndropdown-tab-background: rgba(0,0,0,.1)\ndropdown-tab-background-selected: rgba(255,255,255,1)\ndropzone-background: #9eebcf\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: rgb(179, 179, 255)\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: rgb(153, 153, 255)\nforeground: rgb(179, 179, 179)\nmessage-background: <<colour tag-foreground>>\nmessage-border: #96ccff\nmessage-foreground: <<colour tag-background>>\nmodal-backdrop: rgb(179, 179, 179)\nmodal-background: rgb(38, 38, 38)\nmodal-border: rgba(0,0,0,.5)\nmodal-footer-background: #f4f4f4\nmodal-footer-border: rgba(0,0,0,.1)\nmodal-header-border: rgba(0,0,0,.2)\nmuted-foreground: rgb(255, 255, 255)\nnotification-background: <<colour tag-foreground>>\nnotification-border: <<colour tag-background>>\npage-background: rgb(26, 26, 26)\npre-background: rgb(25, 25, 25)\npre-border: rgba(0,0,0,.2)\nprimary: rgb(255, 201, 102)\nselect-tag-background: \nselect-tag-foreground: \nsidebar-button-foreground: rgb(179, 179, 179)\nsidebar-controls-foreground: rgb(153, 153, 153)\nsidebar-controls-foreground-hover: <<colour tiddler-controls-foreground-hover>>\nsidebar-foreground: rgb(141, 141, 141)\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: rgba(0, 0, 0, 0.5)\nsidebar-muted-foreground-hover: rgb(141, 141, 141)\nsidebar-tab-background: rgba(141, 141, 141, 0.2)\nsidebar-tab-background-selected: rgb(26, 26, 26)\nsidebar-tab-border: rgb(127, 127, 127)\nsidebar-tab-border-selected: rgb(127, 127, 127)\nsidebar-tab-divider: rgb(127, 127, 127)\nsidebar-tab-foreground: rgb(179, 179, 179)\nsidebar-tab-foreground-selected: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground-hover: rgb(115, 115, 115)\nsite-title-foreground: rgb(255, 201, 102)\nstatic-alert-foreground: rgba(0,0,0,.3)\ntab-background: rgba(0,0,0,0.125)\ntab-background-selected: rgb(38, 38, 38)\ntab-border: rgb(255, 201, 102)\ntab-border-selected: rgb(255, 201, 102)\ntab-divider: rgb(255, 201, 102)\ntab-foreground: rgb(179, 179, 179)\ntab-foreground-selected: rgb(179, 179, 179)\ntable-border: rgba(255,255,255,.3)\ntable-footer-background: rgba(0,0,0,.4)\ntable-header-background: rgba(0,0,0,.1)\ntag-background: rgb(255, 201, 102)\ntag-foreground: rgb(25, 25, 25)\ntiddler-background: rgb(38, 38, 38)\ntiddler-border: rgba(240, 196, 117, 0.7)\ntiddler-controls-foreground: rgb(128, 128, 128)\ntiddler-controls-foreground-hover: rgba(255, 255, 255, 0.8)\ntiddler-controls-foreground-selected: rgba(255, 255, 255, 0.9)\ntiddler-editor-background: rgb(33, 33, 33)\ntiddler-editor-border: rgb(63, 63, 63)\ntiddler-editor-border-image: rgb(25, 25, 25)\ntiddler-editor-fields-even: rgb(33, 33, 33)\ntiddler-editor-fields-odd: rgb(28, 28, 28)\ntiddler-info-background: rgb(43, 43, 43)\ntiddler-info-border: rgb(25, 25, 25)\ntiddler-info-tab-background: rgb(43, 43, 43)\ntiddler-link-background: rgb(38, 38, 38)\ntiddler-link-foreground: rgb(204, 204, 255)\ntiddler-subtitle-foreground: rgb(255, 255, 255)\ntiddler-title-foreground: rgb(255, 192, 76)\ntoolbar-cancel-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-done-button: \ntoolbar-edit-button: \ntoolbar-info-button: \ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \nuntagged-background: rgb(255, 255, 255)\nvery-muted-foreground: rgba(240, 196, 117, 0.7)\n"
        },
        "$:/palettes/Vanilla": {
            "title": "$:/palettes/Vanilla",
            "name": "Vanilla",
            "description": "Pale and unobtrusive",
            "tags": "$:/tags/Palette",
            "type": "application/x-tiddler-dictionary",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f4f4f4\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselection-background:\nselection-foreground:\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #f4f4f4\nsidebar-tab-background: #e0e0e0\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected:\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\nwikilist-background: #e5e5e5\nwikilist-item: #fff\nwikilist-info: #000\nwikilist-title: #666\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #aaa\nwikilist-button-open: #4fb82b\nwikilist-button-open-hover: green\nwikilist-button-reveal: #5778d8\nwikilist-button-reveal-hover: blue\nwikilist-button-remove: #d85778\nwikilist-button-remove-hover: red\nwikilist-toolbar-background: #d3d3d3\nwikilist-toolbar-foreground: #888\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #acacac\nwikilist-button-foreground: #000\n"
        },
        "$:/core/readme": {
            "title": "$:/core/readme",
            "text": "This plugin contains TiddlyWiki's core components, comprising:\n\n* JavaScript code modules\n* Icons\n* Templates needed to create TiddlyWiki's user interface\n* British English (''en-GB'') translations of the localisable strings used by the core\n"
        },
        "$:/library/sjcl.js/license": {
            "title": "$:/library/sjcl.js/license",
            "type": "text/plain",
            "text": "SJCL is open. You can use, modify and redistribute it under a BSD\nlicense or under the GNU GPL, version 2.0.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/BSD-2-Clause\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/GPL-2.0\n\nThe Stanford Javascript Crypto Library (hosted here on GitHub) is a\nproject by the Stanford Computer Security Lab to build a secure,\npowerful, fast, small, easy-to-use, cross-browser library for\ncryptography in Javascript.\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University.\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation; either version 2 of the License, or (at your\noption) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"
        },
        "$:/core/templates/MOTW.html": {
            "title": "$:/core/templates/MOTW.html",
            "text": "\\rules only filteredtranscludeinline transcludeinline entity\n<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\n<!-- saved from url=(0021)https://tiddlywiki.com -->&#13;&#10;"
        },
        "$:/core/templates/alltiddlers.template.html": {
            "title": "$:/core/templates/alltiddlers.template.html",
            "type": "text/vnd.tiddlywiki-html",
            "text": "<!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\n\n<$set name=\"exportFilter\" value=\"[!is[system]sort[title]]\">\n\n{{$:/core/templates/exporters/StaticRiver}}\n\n</$set>\n"
        },
        "$:/core/templates/canonical-uri-external-image": {
            "title": "$:/core/templates/canonical-uri-external-image",
            "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external images.\n\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./images/<$view field=\"title\" format=\"doubleurlencoded\"/>"
        },
        "$:/core/templates/canonical-uri-external-raw": {
            "title": "$:/core/templates/canonical-uri-external-raw",
            "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external raw files that are stored in the same directory\n\n-->\n<$view field=\"title\" format=\"doubleurlencoded\"/>"
        },
        "$:/core/templates/canonical-uri-external-text": {
            "title": "$:/core/templates/canonical-uri-external-text",
            "text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external text files.\n\nChange the `./text/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./text/<$view field=\"title\" format=\"doubleurlencoded\"/>.tid"
        },
        "$:/core/templates/css-tiddler": {
            "title": "$:/core/templates/css-tiddler",
            "text": "<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`"
        },
        "$:/core/templates/exporters/CsvFile": {
            "title": "$:/core/templates/exporters/CsvFile",
            "tags": "$:/tags/Exporter",
            "description": "{{$:/language/Exporters/CsvFile}}",
            "extension": ".csv",
            "text": "<$macrocall $name=\"csvtiddlers\" filter=<<exportFilter>> format=\"quoted-comma-sep\" $output=\"text/raw\"/>\n"
        },
        "$:/core/templates/exporters/JsonFile": {
            "title": "$:/core/templates/exporters/JsonFile",
            "tags": "$:/tags/Exporter",
            "description": "{{$:/language/Exporters/JsonFile}}",
            "extension": ".json",
            "text": "<$macrocall $name=\"jsontiddlers\" filter=<<exportFilter>> $output=\"text/raw\"/>\n"
        },
        "$:/core/templates/exporters/StaticRiver": {
            "title": "$:/core/templates/exporters/StaticRiver",
            "tags": "$:/tags/Exporter",
            "description": "{{$:/language/Exporters/StaticRiver}}",
            "extension": ".html",
            "text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river tc-static-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n"
        },
        "$:/core/templates/exporters/StaticRiver/Content": {
            "title": "$:/core/templates/exporters/StaticRiver/Content",
            "text": "\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>\n"
        },
        "$:/core/templates/exporters/TidFile": {
            "title": "$:/core/templates/exporters/TidFile",
            "tags": "$:/tags/Exporter",
            "description": "{{$:/language/Exporters/TidFile}}",
            "extension": ".tid",
            "condition": "[<count>compare:lte[1]]",
            "text": "\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>"
        },
        "$:/core/save/all-external-js": {
            "title": "$:/core/save/all-external-js",
            "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5-external-js.html}}\n"
        },
        "$:/core/templates/tiddlywiki5.js": {
            "title": "$:/core/templates/tiddlywiki5.js",
            "text": "\\rules only filteredtranscludeinline transcludeinline codeinline\n\n/*\n{{ $:/core/copyright.txt ||$:/core/templates/plain-text-tiddler}}\n`*/\n`<!--~~ Library modules ~~-->\n{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/plain-text-tiddler}}}\n<!--~~ Boot prefix ~~-->\n{{ $:/boot/bootprefix.js ||$:/core/templates/plain-text-tiddler}}\n<!--~~ Core plugin ~~-->\n{{$:/core/templates/tiddlywiki5.js/tiddlers}}\n<!--~~ Boot kernel ~~-->\n{{ $:/boot/boot.js ||$:/core/templates/plain-text-tiddler}}\n"
        },
        "$:/core/templates/tiddlywiki5.js/tiddlers": {
            "title": "$:/core/templates/tiddlywiki5.js/tiddlers",
            "text": "`\n$tw.preloadTiddlerArray(`<$text text=<<jsontiddlers \"[[$:/core]]\">>/>`);\n`\n"
        },
        "$:/core/templates/tiddlywiki5-external-js.html": {
            "title": "$:/core/templates/tiddlywiki5-external-js.html",
            "text": "\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n{{$:/core/templates/MOTW.html}}<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"{{$:/core/copyright.txt}}\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/core/wiki/rawmarkup]] [all[shadows+tiddlers]tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n{{$:/core/templates/static.area}}\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n{{$:/core/templates/store.area.template.html}}\n<!--~~ Raw markup for the bottom of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}\n</body>\n<script src=\"%24%3A%2Fcore%2Ftemplates%2Ftiddlywiki5.js\" onerror=\"alert('Error: Cannot load tiddlywiki.js');\"></script>\n</html>\n"
        },
        "$:/core/templates/html-div-skinny-tiddler": {
            "title": "$:/core/templates/html-div-skinny-tiddler",
            "text": "<!--\n\nThis template is a variant of $:/core/templates/html-div-tiddler used for saving skinny tiddlers (with no text field)\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre></pre>\n</div>`\n"
        },
        "$:/core/templates/html-div-tiddler": {
            "title": "$:/core/templates/html-div-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre>`<$view field=\"text\" format=\"htmlencoded\" />`</pre>\n</div>`\n"
        },
        "$:/core/templates/html-tiddler": {
            "title": "$:/core/templates/html-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers as raw HTML\n\n--><$view field=\"text\" format=\"htmlwikified\" />"
        },
        "$:/core/templates/javascript-tiddler": {
            "title": "$:/core/templates/javascript-tiddler",
            "text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`"
        },
        "$:/core/templates/json-tiddler": {
            "title": "$:/core/templates/json-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers as raw JSON\n\n--><$text text=<<jsontiddler>>/>"
        },
        "$:/core/templates/module-tiddler": {
            "title": "$:/core/templates/module-tiddler",
            "text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\" data-module=\"yes\">$tw.modules.define(\"`<$view field=\"title\" format=\"jsencoded\" />`\",\"`<$view field=\"module-type\" format=\"jsencoded\" />`\",function(module,exports,require) {`<$view field=\"text\" format=\"text\" />`});\n</script>`"
        },
        "$:/core/templates/plain-text-tiddler": {
            "title": "$:/core/templates/plain-text-tiddler",
            "text": "<$view field=\"text\" format=\"text\" />"
        },
        "$:/core/templates/raw-static-tiddler": {
            "title": "$:/core/templates/raw-static-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers as static HTML\n\n--><$view field=\"text\" format=\"plainwikified\" />"
        },
        "$:/core/save/all": {
            "title": "$:/core/save/all",
            "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
        },
        "$:/core/save/empty": {
            "title": "$:/core/save/empty",
            "text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
        },
        "$:/core/save/lazy-all": {
            "title": "$:/core/save/lazy-all",
            "text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[!is[system]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
        },
        "$:/core/save/lazy-images": {
            "title": "$:/core/save/lazy-images",
            "text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[is[image]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
        },
        "$:/core/templates/server/static.sidebar.wikitext": {
            "title": "$:/core/templates/server/static.sidebar.wikitext",
            "text": "\\whitespace trim\n<div class=\"tc-sidebar-scrollable\" style=\"overflow: auto;\">\n<div class=\"tc-sidebar-header\">\n<h1 class=\"tc-site-title\">\n<$transclude tiddler=\"$:/SiteTitle\"/>\n</h1>\n<div class=\"tc-site-subtitle\">\n<$transclude tiddler=\"$:/SiteSubtitle\"/>\n</div>\n<h2>\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$list filter={{$:/DefaultTiddlers}}>\n<div class=\"tc-menu-list-subitem\">\n<$link><$text text=<<currentTiddler>>/></$link>\n</div>\n</$list>\n</div>\n<!-- Currently disabled the recent list as it is unweildy when the responsive narrow view kicks in\n<h2>\n{{$:/language/SideBar/Recent/Caption}}\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n</div>\n</div>\n</div>\n-->\n"
        },
        "$:/core/templates/server/static.tiddler.html": {
            "title": "$:/core/templates/server/static.tiddler.html",
            "text": "\\whitespace trim\n\\define tv-wikilink-template() $uri_encoded$\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content={{$:/core/templates/version}} />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"%24%3A%2Fcore%2Ftemplates%2Fstatic.template.css\">\n<title><$view field=\"caption\" format=\"plainwikified\"><$view field=\"title\"/></$view>: <$view tiddler=\"$:/core/wiki/title\" format=\"plainwikified\"/></title>\n</head>\n<body class=\"tc-body\">\n<$transclude tiddler=\"$:/core/templates/server/static.sidebar.wikitext\" mode=\"inline\"/>\n<section class=\"tc-story-river\">\n<div class=\"tc-tiddler-frame\">\n<$transclude tiddler=\"$:/core/templates/server/static.tiddler.wikitext\" mode=\"inline\"/>\n</div>\n</section>\n</body>\n</html>"
        },
        "$:/core/templates/server/static.tiddler.wikitext": {
            "title": "$:/core/templates/server/static.tiddler.wikitext",
            "text": "\\whitespace trim\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<h2><$text text=<<currentTiddler>>/></h2>\n</div>\n</div>\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n<div class=\"tc-tags-wrapper\">\n<$list filter=\"[all[current]tags[]sort[title]]\">\n<a href={{{ [<currentTiddler>encodeuricomponent[]] }}}>\n<$macrocall $name=\"tag-pill\" tag=<<currentTiddler>>/>\n</a>\n</$list>\n</div>\n<div class=\"tc-tiddler-body\">\n<$transclude mode=\"block\"/>\n</div>\n"
        },
        "$:/core/templates/single.tiddler.window": {
            "title": "$:/core/templates/single.tiddler.window",
            "text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$transclude mode=\"block\"/>\n\n</$navigator>\n\n</div>\n\n</$vars>\n"
        },
        "$:/core/templates/split-recipe": {
            "title": "$:/core/templates/split-recipe",
            "text": "<$list filter=\"[!is[system]]\">\ntiddler: <$view field=\"title\" format=\"urlencoded\"/>.tid\n</$list>\n"
        },
        "$:/core/templates/static-tiddler": {
            "title": "$:/core/templates/static-tiddler",
            "text": "<a name=<<currentTiddler>>>\n<$transclude tiddler=\"$:/core/ui/ViewTemplate\"/>\n</a>"
        },
        "$:/core/templates/static.area": {
            "title": "$:/core/templates/static.area",
            "text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawStaticContent]!has[draft.of]] ||$:/core/templates/raw-static-tiddler}}}\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\n</$reveal>\n<!-- ensure splash screen isn't shown when JS is disabled -->\n`<style>\n.tc-remove-when-wiki-loaded {display: none;}\n</style>`\n"
        },
        "$:/core/templates/static.content": {
            "title": "$:/core/templates/static.content",
            "text": "<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|https://tiddlywiki.com]] contains the following tiddlers:\n\n<ul>\n<$list filter=<<saveTiddlerFilter>>>\n<li><$view field=\"title\" format=\"text\"></$view></li>\n</$list>\n</ul>\n"
        },
        "$:/core/templates/static.template.css": {
            "title": "$:/core/templates/static.template.css",
            "text": "{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\n\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n"
        },
        "$:/core/templates/static.template.html": {
            "title": "$:/core/templates/static.template.html",
            "type": "text/vnd.tiddlywiki-html",
            "text": "\\define tv-wikilink-template() static/$uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\n</body>\n</html>\n"
        },
        "$:/core/templates/static.tiddler.html": {
            "title": "$:/core/templates/static.tiddler.html",
            "text": "\\define tv-wikilink-template() $uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n`<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"static.css\">\n<title>`<$view field=\"caption\"><$view field=\"title\"/></$view>: {{$:/core/wiki/title}}`</title>\n</head>\n<body class=\"tc-body\">\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\n<section class=\"tc-story-river tc-static-story-river\">\n`<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>`\n</section>\n</body>\n</html>\n`\n"
        },
        "$:/core/templates/store.area.template.html": {
            "title": "$:/core/templates/store.area.template.html",
            "text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n`<div id=\"storeArea\" style=\"display:none;\">`\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n<$list filter={{{ [<skinnySaveTiddlerFilter>] }}} template=\"$:/core/templates/html-div-skinny-tiddler\"/>\n`</div>`\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n`<!--~~ Encrypted tiddlers ~~-->`\n`<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n<$encrypt filter=<<saveTiddlerFilter>>/>\n`</pre>`\n</$reveal>"
        },
        "$:/core/templates/tid-tiddler": {
            "title": "$:/core/templates/tid-tiddler",
            "text": "<!--\n\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>`\n`<$view field=\"text\" format=\"text\" />"
        },
        "$:/core/templates/tiddler-metadata": {
            "title": "$:/core/templates/tiddler-metadata",
            "text": "<!--\n\nThis template is used for saving tiddler metadata *.meta files\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>"
        },
        "$:/core/templates/tiddlywiki5.html": {
            "title": "$:/core/templates/tiddlywiki5.html",
            "text": "<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n`<!doctype html>\n`{{$:/core/templates/MOTW.html}}`<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n`{{{ [<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"`{{$:/core/copyright.txt}}`\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>`{{$:/core/wiki/title}}`</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n`{{$:/boot/boot.css||$:/core/templates/css-tiddler}}`\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n`{{$:/core/templates/static.area}}`\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n`{{$:/core/templates/store.area.template.html}}`\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}`\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n`{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n`{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Raw markup for the bottom of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\n</body>\n</html>`\n"
        },
        "$:/core/templates/version": {
            "title": "$:/core/templates/version",
            "text": "<<version>>"
        },
        "$:/core/templates/wikified-tiddler": {
            "title": "$:/core/templates/wikified-tiddler",
            "text": "<$transclude />"
        },
        "$:/core/ui/AboveStory/tw2-plugin-check": {
            "title": "$:/core/ui/AboveStory/tw2-plugin-check",
            "tags": "$:/tags/AboveStory",
            "text": "\\define lingo-base() $:/language/AboveStory/ClassicPlugin/\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]limit[1]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n<ul>\n\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]]\">\n\n<li>\n\n<$link><$view field=\"title\"/></$link>\n\n</li>\n\n</$list>\n\n</ul>\n\n</div>\n\n</$list>\n"
        },
        "$:/core/ui/Actions/new-image": {
            "title": "$:/core/ui/Actions/new-image",
            "tags": "$:/tags/Actions",
            "description": "create a new image tiddler",
            "text": "\\define get-type()\nimage/$(imageType)$\n\\end\n\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars imageType={{$:/config/NewImageType}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=<<get-type>> tags=<<get-tags>>/>\n</$vars>\n"
        },
        "$:/core/ui/Actions/new-journal": {
            "title": "$:/core/ui/Actions/new-journal",
            "tags": "$:/tags/Actions",
            "description": "create a new journal tiddler",
            "text": "\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$reveal type=\"nomatch\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text={{{ [<journalTitle>get[]] }}}/>\n</$reveal>\n<$reveal type=\"match\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text=<<journalText>>/>\n</$reveal>\n</$wikify>\n</$vars>\n"
        },
        "$:/core/ui/Actions/new-tiddler": {
            "title": "$:/core/ui/Actions/new-tiddler",
            "tags": "$:/tags/Actions",
            "description": "create a new empty tiddler",
            "text": "\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars textFieldTags={{$:/config/NewTiddler/Tags}} tagsFieldTags={{$:/config/NewTiddler/Tags!!tags}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<get-tags>>/>\n</$vars>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter": {
            "title": "$:/core/ui/AdvancedSearch/Filter",
            "tags": "$:/tags/AdvancedSearch",
            "caption": "{{$:/language/Search/Filter/Caption}}",
            "text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch/input}!match{$:/temp/advancedsearch}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\" \n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\" \n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/temp/advancedsearch]]\" firstSearchFilterField=\"text\" \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> \n\t\tinputCancelActions=<<cancel-search-actions>>/>\n</$keyboard>\n</$keyboard>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]\"><$transclude/></$list>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}}>\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</div>\n</$set>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button popup=<<qualify \"$:/state/filterDeleteDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}\n</$button>\n</$reveal>\n\n<$reveal state=<<qualify \"$:/state/filterDeleteDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<div class=\"tc-dropdown-item-plain\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\nAre you sure you wish to delete <<resultCount>> tiddler(s)?\n</$set>\n</div>\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn\">\n<$action-deletetiddler $filter={{$:/temp/advancedsearch}}/>\nDelete these tiddlers\n</$button>\n</div>\n</div>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</span>\n\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text=<<navigateTo>>/><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text=<<navigateTo>>/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/><$action-sendmessage $message=\"tm-focus-selector\" $param='.tc-advanced-search input' />\"\"\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</div>\n</$linkcatcher>\n</$set>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export": {
            "title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export",
            "tags": "$:/tags/AdvancedSearch/FilterButton",
            "text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Shadows": {
            "title": "$:/core/ui/AdvancedSearch/Shadows",
            "tags": "$:/tags/AdvancedSearch",
            "caption": "{{$:/language/Search/Shadows/Caption}}",
            "first-search-filter": "[all[shadows]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]",
            "text": "\\define lingo-base() $:/language/Search/\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\"\n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/Shadows]]\"\n\t\tinputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> \n\t\tinputAcceptVariantActions=<<input-accept-variant-actions>>  filterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/Standard": {
            "title": "$:/core/ui/AdvancedSearch/Standard",
            "tags": "$:/tags/AdvancedSearch",
            "caption": "{{$:/language/Search/Standard/Caption}}",
            "text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define next-search-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/advancedsearch\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/standard/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$keyboard key=\"shift-alt-Right\" actions=<<next-search-tab>>>\n<$keyboard key=\"shift-alt-Left\" actions=<<next-search-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\"\n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\"\n\t\tfilterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$vars userInput={{{ [[$:/temp/advancedsearch]get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} searchListState=\"$:/temp/advancedsearch/selected-item\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/standard/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab/search-results/advancedsearch\" />\n</$list>\n</$vars>\n</$list>\n</$reveal>\n"
        },
        "$:/core/ui/AdvancedSearch/System": {
            "title": "$:/core/ui/AdvancedSearch/System",
            "tags": "$:/tags/AdvancedSearch",
            "caption": "{{$:/language/Search/System/Caption}}",
            "first-search-filter": "[is[system]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]",
            "text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\",stateTitle,tag,defaultState,currentTabTiddler) <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\"\n\t\ttype=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/System]]\"\n\t\tinputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> \n\t\tinputAcceptVariantActions=<<input-accept-variant-actions>> filterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
        },
        "$:/AdvancedSearch": {
            "title": "$:/AdvancedSearch",
            "icon": "$:/core/images/advanced-search-button",
            "color": "#bbb",
            "text": "<div class=\"tc-advanced-search\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" default=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab--1498284803\"/>\n</div>\n"
        },
        "$:/core/ui/AlertTemplate": {
            "title": "$:/core/ui/AlertTemplate",
            "text": "<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button class=\"tc-btn-invisible\"><$action-deletetiddler $tiddler=<<currentTiddler>>/>{{$:/core/images/cancel-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$wikify name=\"format\" text=<<lingo Tiddler/DateFormat>>>\n<$view field=\"component\"/> - <$view field=\"modified\" format=\"date\" template=<<format>>/> <$reveal type=\"nomatch\" state=\"!!count\" text=\"\"><span class=\"tc-alert-highlight\">({{$:/language/Count}}: <$view field=\"count\"/>)</span></$reveal>\n</$wikify>\n</div>\n<div class=\"tc-alert-body\">\n\n<$transclude/>\n\n</div>\n</div>\n"
        },
        "$:/core/ui/BinaryWarning": {
            "title": "$:/core/ui/BinaryWarning",
            "text": "\\define lingo-base() $:/language/BinaryWarning/\n<<lingo Prompt>>\n"
        },
        "$:/core/ui/Components/plugin-info": {
            "title": "$:/core/ui/Components/plugin-info",
            "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\n\\define plugin-table-body(type,disabledMessage,default-popup-state)\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1>\n''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$view field=\"description\"><$view field=\"title\"/></$view> $disabledMessage$\n</h1>\n<h2>\n<$view field=\"title\"/>\n</h2>\n<h2>\n<div><em><$view field=\"version\"/></em></div>\n</h2>\n</div>\n\\end\n\n\\define plugin-info(type,default-popup-state)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>> default=\"\"\"$default-popup-state$\"\"\">\n<div class=\"tc-plugin-info-dropdown\">\n<div class=\"tc-plugin-info-dropdown-body\">\n<$list filter=\"[all[current]] -[[$:/core]]\">\n<div style=\"float:right;\">\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n<<lingo Disable/Caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n<<lingo Enable/Caption>>\n</$button>\n</$reveal>\n</div>\n</$list>\n<$set name=\"tabsList\" filter=\"[<currentTiddler>list[]] contents\">\n<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList=<<tabsList>> default={{{ [enlist<tabsList>] }}} template=\"$:/core/ui/PluginInfo\"/>\n</$set>\n</div>\n</div>\n</$reveal>\n</$set>\n\\end\n\n<$macrocall $name=\"plugin-info\" type=<<plugin-type>> default-popup-state=<<default-popup-state>>/>\n"
        },
        "$:/core/ui/Components/tag-link": {
            "title": "$:/core/ui/Components/tag-link",
            "text": "<$link>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\"/>\n</span>\n</$set>\n</$link>"
        },
        "$:/core/ui/ControlPanel/Advanced": {
            "title": "$:/core/ui/ControlPanel/Advanced",
            "tags": "$:/tags/ControlPanel/Info",
            "caption": "{{$:/language/ControlPanel/Advanced/Caption}}",
            "text": "{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/TiddlerFields\" explicitState=\"$:/state/tab--959111941\"/>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/Appearance": {
            "title": "$:/core/ui/ControlPanel/Appearance",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Appearance/Caption}}",
            "text": "{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Theme\" explicitState=\"$:/state/tab--1963855381\"/>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/Basics": {
            "title": "$:/core/ui/ControlPanel/Basics",
            "tags": "$:/tags/ControlPanel/Info",
            "caption": "{{$:/language/ControlPanel/Basics/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Basics/\n\n\\define show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-advanced-search input\"/>\n''<$count filter=\"\"\"$filter$\"\"\"/>''\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\" class=\"tc-edit-texteditor\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/language/DefaultNewTiddlerTitle\"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/language/DefaultNewTiddlerTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Title\"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Title\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Text\"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler=\"$:/config/NewJournal/Text\" tag=\"textarea\" class=\"tc-edit-texteditor\" default=\"\"/> |\n|<$link to=\"$:/config/NewTiddler/Tags\"><<lingo NewTiddler/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewTiddler/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewJournal/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/AutoFocus\"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} |\n|<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\n|<<lingo Tiddlers/Prompt>> |<<show-filter-count \"[!is[system]sort[title]]\">> |\n|<<lingo Tags/Prompt>> |<<show-filter-count \"[tags[]sort[title]]\">> |\n|<<lingo SystemTiddlers/Prompt>> |<<show-filter-count \"[is[system]sort[title]]\">> |\n|<<lingo ShadowTiddlers/Prompt>> |<<show-filter-count \"[all[shadows]sort[title]]\">> |\n|<<lingo OverriddenShadowTiddlers/Prompt>> |<<show-filter-count \"[is[tiddler]is[shadow]sort[title]]\">> |\n"
        },
        "$:/core/ui/ControlPanel/EditorTypes": {
            "title": "$:/core/ui/ControlPanel/EditorTypes",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/EditorTypes/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/EditorTypes/\n\n<<lingo Hint>>\n\n<table>\n<tbody>\n<tr>\n<th><<lingo Type/Caption>></th>\n<th><<lingo Editor/Caption>></th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\">\n<tr>\n<td>\n<$link>\n<$list filter=\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\">\n<$text text={{!!title}}/>\n</$list>\n</$link>\n</td>\n<td>\n<$view field=\"text\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/ControlPanel/Info": {
            "title": "$:/core/ui/ControlPanel/Info",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Info/Caption}}",
            "text": "{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Basics\" explicitState=\"$:/state/tab--2112689675\"/>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/KeyboardShortcuts": {
            "title": "$:/core/ui/ControlPanel/KeyboardShortcuts",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/KeyboardShortcuts/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/KeyboardShortcuts/\n\n\\define new-shortcut(title)\n<div class=\"tc-dropdown-item-plain\">\n<$edit-shortcut tiddler=\"$title$\" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} focus=\"true\" style=\"width:auto;\"/> <$button>\n<<lingo Add/Caption>>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"[{$title$}]\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"$title$\"\n/>\n</$button>\n</div>\n\\end\n\n\\define shortcut-list-item(caption)\n<td>\n</td>\n<td style=\"text-align:right;font-size:0.7em;\">\n<<lingo Platform/$caption$>>\n</td>\n<td>\n<div style=\"position:relative;\">\n<$button popup=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> class=\"tc-btn-invisible\">\n{{$:/core/images/edit-button}}\n</$button>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutTitle)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\n<$reveal state=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown tc-popup-keep\">\n<$list filter=\"[list[$(shortcutTitle)$!!text]sort[title]]\" variable=\"shortcut\" emptyMessage=\"\"\"\n<div class=\"tc-dropdown-item-plain\">\n//<<lingo NoShortcuts/Caption>>//\n</div>\n\"\"\">\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint}}>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"+[remove<shortcut>]\"\n/>\n<small>{{$:/core/images/close-button}}</small>\n</$button>\n<kbd>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts=<<shortcut>>/>\n</kbd>\n</div>\n</$list>\n<hr/>\n<$macrocall $name=\"new-shortcut\" title=<<qualify \"$:/state/new-shortcut/$(shortcutTitle)$\">>/>\n</div>\n</div>\n</$reveal>\n</div>\n</td>\n\\end\n\n\\define shortcut-list(caption,prefix)\n<tr>\n<$list filter=\"[[$prefix$$(shortcutName)$]]\" variable=\"shortcutTitle\">\n<<shortcut-list-item \"$caption$\">>\n</$list>\n</tr>\n\\end\n\n\\define shortcut-editor()\n<<shortcut-list \"All\" \"$:/config/shortcuts/\">>\n<<shortcut-list \"Mac\" \"$:/config/shortcuts-mac/\">>\n<<shortcut-list \"NonMac\" \"$:/config/shortcuts-not-mac/\">>\n<<shortcut-list \"Linux\" \"$:/config/shortcuts-linux/\">>\n<<shortcut-list \"NonLinux\" \"$:/config/shortcuts-not-linux/\">>\n<<shortcut-list \"Windows\" \"$:/config/shortcuts-windows/\">>\n<<shortcut-list \"NonWindows\" \"$:/config/shortcuts-not-windows/\">>\n\\end\n\n\\define shortcut-preview()\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutPrefix)$$(shortcutName)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\\end\n\n\\define shortcut-item-inner()\n<tr>\n<td>\n<$reveal type=\"nomatch\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"open\"\n/>\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"close\"\n/>\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n''<$text text=<<shortcutName>>/>''\n</td>\n<td>\n<$transclude tiddler=\"$:/config/ShortcutInfo/$(shortcutName)$\"/>\n</td>\n<td>\n<$list filter=\"$:/config/shortcuts/ $:/config/shortcuts-mac/ $:/config/shortcuts-not-mac/ $:/config/shortcuts-linux/ $:/config/shortcuts-not-linux/ $:/config/shortcuts-windows/ $:/config/shortcuts-not-windows/\" variable=\"shortcutPrefix\">\n<<shortcut-preview>>\n</$list>\n</td>\n</tr>\n<$set name=\"dropdownState\" value={{$(dropdownStateTitle)$}}>\n<$list filter=\"[<dropdownState>match[open]]\" variable=\"listItem\">\n<<shortcut-editor>>\n</$list>\n</$set>\n\\end\n\n\\define shortcut-item()\n<$set name=\"dropdownStateTitle\" value=<<qualify \"$:/state/dropdown/keyboardshortcut/$(shortcutName)$\">>>\n<<shortcut-item-inner>>\n</$set>\n\\end\n\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]removeprefix[$:/config/ShortcutInfo/]]\" variable=\"shortcutName\">\n<<shortcut-item>>\n</$list>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/ControlPanel/LoadedModules": {
            "title": "$:/core/ui/ControlPanel/LoadedModules",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/LoadedModules/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/\n<<lingo LoadedModules/Hint>>\n\n{{$:/snippets/modules}}\n"
        },
        "$:/core/ui/ControlPanel/Modals/AddPlugins": {
            "title": "$:/core/ui/ControlPanel/Modals/AddPlugins",
            "subtitle": "{{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/Add/Caption}}",
            "text": "\\define install-plugin-actions()\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url={{!!url}} title={{$(assetInfo)$!!original-title}}/>\n<$set name=\"url\" value={{!!url}}>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\" variable=\"dependency\">\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url=<<url>> title=<<dependency>>/>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define install-plugin-button()\n<div>\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$set name=\"reinstall-type\" value={{{ [<libraryVersion>compare:version:eq<installedVersion>then[tc-reinstall]] [<libraryVersion>compare:version:gt<installedVersion>then[tc-reinstall-upgrade]] [<libraryVersion>compare:version:lt<installedVersion>then[tc-reinstall-downgrade]] }}}>\n<$button actions=<<install-plugin-actions>> class={{{ [<assetInfo>get[original-title]has[version]then<reinstall-type>] tc-btn-invisible tc-install-plugin +[join[ ]] }}}>\n{{$:/core/images/download-button}}\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Install/Caption}}\">\n<$list filter=\"[<libraryVersion>compare:version:gt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[<libraryVersion>compare:version:lt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Reinstall/Caption}}\">\n{{$:/language/ControlPanel/Plugins/Downgrade/Caption}}\n</$list>\n\"\"\">\n{{$:/language/ControlPanel/Plugins/Update/Caption}}\n</$list>\n</$list>\n</$button>\n<div>\n</div>\n<$reveal stateTitle=<<assetInfo>> stateField=\"requires-reload\" type=\"match\" text=\"yes\">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal>\n</$set>\n</$set>\n</$set>\n</div>\n\\end\n\n\\define popup-state-macro()\n$:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$\n\\end\n\n\\define display-plugin-info(type)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<div class=\"tc-plugin-info\">\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$list filter=\"[<assetInfo>has[icon]]\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\"\"\">\n<img src={{$(assetInfo)$!!icon}}/>\n</$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1><strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$view tiddler=<<assetInfo>> field=\"description\"/></h1>\n<h2><$view tiddler=<<assetInfo>> field=\"original-title\"/></h2>\n<div><em><$view tiddler=<<assetInfo>> field=\"version\"/></em></div>\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\"><div><em>{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}</em></div></$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-buttons\">\n<<install-plugin-button>>\n</div>\n</div>\n<$set name=\"original-title\" value={{{ [<assetInfo>get[original-title]] }}}>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]] ~[<assetInfo>get[original-title]!is[tiddler]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-dropdown-message\">\n<$list filter=\"[<assetInfo>get[original-title]!is[tiddler]]\">\n{{$:/language/ControlPanel/Plugins/NotInstalled/Hint}}\n</$list>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]]\" variable=\"ignore\">\n<div>\n{{$:/language/ControlPanel/Plugins/AlsoRequires}}\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\" variable=\"dependency\">\n<$text text=<<dependency>>/>\n</$list>\n</div>\n</$list>\n</$set>\n</div>\n</$list>\n<div class=\"tc-plugin-info-dropdown-body\">\n<$transclude tiddler=<<assetInfo>> field=\"readme\" mode=\"block\"/>\n</div>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-sub-plugins\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[name]]\" variable=\"assetInfo\">\n<<display-plugin-info \"$type$\">>\n</$list>\n</div>\n</$list>\n</div>\n</$reveal>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<$reveal type=\"nomatch\" text=\"yes\" state=<<popup-state>> tag=\"div\" class=\"tc-plugin-info-sub-plugin-indicator\">\n<$wikify name=\"count\" text=\"\"\"<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>]\"/>\"\"\">\n<$button class=\"tc-btn-invisible\" set=<<popup-state>> setTo=\"yes\">\n{{$:/language/ControlPanel/Plugins/SubPluginPrompt}}\n</$button>\n</$wikify>\n</$reveal>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define load-plugin-library-button()\n<$list filter=\"[<currentTiddler>get[enabled]else[yes]match[yes]]\" variable=\"ignore\">\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-load-plugin-library\" url={{!!url}} infoTitlePrefix=\"$:/temp/RemoteAssetInfo/\"/>\n{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Plugins/OpenPluginLibrary}}\n</$button>\n</$list>\n\\end\n\n\\define display-server-assets(type)\n{{$:/language/Search/Search}}: <$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<div class=\"tc-plugin-library-listing\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[name]]\" variable=\"assetInfo\">\n<$list filter=\"[[$:/temp/RemoteAssetSearch/$(currentTiddler)$]has[text]] ~[<assetInfo>!has[parent-plugin]]\" variable=\"ignore\"><!-- Hide sub-plugins if we're not searching -->\n<<display-plugin-info \"$type$\">>\n</$list>\n</$list>\n</div>\n\\end\n\n\\define display-server-connection()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]\" variable=\"connectionTiddler\" emptyMessage=<<load-plugin-library-button>>>\n\n<$set name=\"transclusion\" value=<<connectionTiddler>>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Add/Plugins\">>\n\n</$set>\n\n</$list>\n\\end\n\n\\define close-library-button()\n<$reveal type='nomatch' state='$:/temp/ServerConnection/$(PluginLibraryURL)$' text=''>\n<$button class='tc-btn-big-green'>\n<$action-sendmessage $message=\"tm-unload-plugin-library\" url={{!!url}}/>\n{{$:/core/images/chevron-left}} {{$:/language/ControlPanel/Plugins/ClosePluginLibrary}}\n<$action-deletetiddler $filter=\"[prefix[$:/temp/ServerConnection/$(PluginLibraryURL)$]][prefix[$:/temp/RemoteAssetInfo/$(PluginLibraryURL)$]]\"/>\n</$button>\n</$reveal>\n\\end\n\n\\define plugin-library-listing()\n<div class=\"tc-tab-set\">\n<$set name=\"defaultTab\" value={{{ [all[tiddlers+shadows]tag[$:/tags/PluginLibrary]] }}}>\n<div class=\"tc-tab-buttons\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$button set=<<qualify \"$:/state/addplugins/tab\">> setTo=<<currentTiddler>> default=<<defaultTab>> selectedClass=\"tc-tab-selected\">\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude field=\"caption\"/>\n</$set>\n</$button>\n</$list>\n</div>\n<div class=\"tc-tab-divider\"/>\n<div class=\"tc-tab-content\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$reveal type=\"match\" state=<<qualify \"$:/state/addplugins/tab\">> text=<<currentTiddler>> default=<<defaultTab>>>\n<h2><$link><$transclude field=\"caption\"><$view field=\"title\"/></$transclude></$link></h2>\n//<$view field=\"url\"/>//\n<$transclude mode=\"block\"/>\n<$set name=PluginLibraryURL value={{!!url}}>\n<<close-library-button>>\n</$set>\n<<display-server-connection>>\n</$reveal>\n</$list>\n</div>\n</$set>\n</div>\n\\end\n\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<div>\n<<plugin-library-listing>>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/Palette": {
            "title": "$:/core/ui/ControlPanel/Palette",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/Palette/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n\n{{$:/snippets/paletteswitcher}}\n\n<$reveal type=\"nomatch\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"yes\"><<lingo ShowEditor/Caption>></$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"no\"><<lingo HideEditor/Caption>></$button>\n{{$:/PaletteManager}}\n\n</$reveal>\n\n"
        },
        "$:/core/ui/ControlPanel/Parsing": {
            "title": "$:/core/ui/ControlPanel/Parsing",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/Parsing/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Parsing/\n\n\\define toggle(Type)\n<$checkbox\ntiddler=\"\"\"$:/config/WikiParserRules/$Type$/$(rule)$\"\"\"\nfield=\"text\"\nchecked=\"enable\"\nunchecked=\"disable\"\ndefault=\"enable\">\n<<rule>>\n</$checkbox>\n\\end\n\n\\define rules(type,Type)\n<$list filter=\"[wikiparserrules[$type$]]\" variable=\"rule\">\n<dd><<toggle $Type$>></dd>\n</$list>\n\\end\n\n<<lingo Hint>>\n\n<dl>\n<dt><<lingo Pragma/Caption>></dt>\n<<rules pragma Pragma>>\n<dt><<lingo Inline/Caption>></dt>\n<<rules inline Inline>>\n<dt><<lingo Block/Caption>></dt>\n<<rules block Block>>\n</dl>"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Languages": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Languages",
            "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[language]]\"/>)",
            "text": "<<display-server-assets language>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Plugins": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}}  (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[plugin]]\"/>)",
            "text": "<<display-server-assets plugin>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Themes": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Themes",
            "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}}  (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[theme]]\"/>)",
            "text": "<<display-server-assets theme>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Add/Updates": {
            "title": "$:/core/ui/ControlPanel/Plugins/Add/Updates",
            "caption": "<$importvariables filter=\"$:/core/ui/ControlPanel/Plugins/Add/Updates\">{{$:/language/ControlPanel/Plugins/Updates/Caption}} (<<update-count>>)</$importvariables>",
            "text": "\\define each-updateable-plugin(body)\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}sort[title]]\" variable=\"assetInfo\">\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$list filter=\"[<assetInfo>get[original-title]has[version]!version<libraryVersion>]\" variable=\"ignore\">\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$list filter=\"[<installedversion>!match<libraryVersion>]\" variable=\"ignore\">\n$body$\n</$list>\n</$set>\n</$list>\n</$set>\n</$list>\n\\end\n\n\\define update-all-actions()\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<<install-plugin-actions>>\n\"\"\"/>\n\\end\n\n\\define update-count()\n<$wikify name=\"count-filter\" text=<<each-updateable-plugin \"&#91;&#91;<$text text=<<assetInfo>>/>]]\">>><$count filter=<<count-filter>>/></$wikify>\n\\end\n\n<$button actions=<<update-all-actions>> class=\"tc-btn-invisible tc-install-plugin tc-reinstall-upgrade\">\n{{$:/core/images/download-button}} {{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}}\n</$button>\n\n<div class=\"tc-plugin-library-listing\">\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<$macrocall $name=\"display-plugin-info\" type={{{ [<assetInfo>get[original-plugin-type]] }}}/>\n\"\"\"/>\n</div>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/AddPlugins": {
            "title": "$:/core/ui/ControlPanel/Plugins/AddPlugins",
            "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n<$button message=\"tm-modal\" param=\"$:/core/ui/ControlPanel/Modals/AddPlugins\" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class=\"tc-btn-big-green tc-primary-btn\">\n{{$:/core/images/download-button}} <<lingo Add/Caption>>\n</$button>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Installed/Languages": {
            "title": "$:/core/ui/ControlPanel/Plugins/Installed/Languages",
            "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[language]]\"/>)",
            "text": "<<plugin-table language>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Installed/Plugins": {
            "title": "$:/core/ui/ControlPanel/Plugins/Installed/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[plugin]]\"/>)",
            "text": "<<plugin-table plugin>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins/Installed/Themes": {
            "title": "$:/core/ui/ControlPanel/Plugins/Installed/Themes",
            "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[theme]]\"/>)",
            "text": "<<plugin-table theme>>\n"
        },
        "$:/core/ui/ControlPanel/Plugins": {
            "title": "$:/core/ui/ControlPanel/Plugins",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define plugin-table(type)\n<$set name=\"plugin-type\" value=\"\"\"$type$\"\"\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[name]]\" emptyMessage=<<lingo \"Empty/Hint\">> template=\"$:/core/ui/Components/plugin-info\"/>\n</$set>\n</$set>\n\\end\n\n{{$:/core/ui/ControlPanel/Plugins/AddPlugins}}\n\n<<lingo Installed/Hint>>\n\n<$macrocall $name=\"tabs\" tabsList=\"[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]\" default=\"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\" explicitState=\"$:/state/tab--86143343\"/>\n"
        },
        "$:/core/ui/ControlPanel/Saving/DownloadSaver": {
            "title": "$:/core/ui/ControlPanel/Saving/DownloadSaver",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/DownloadSaver/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/DownloadSaver/\n\n<<lingo Hint>>\n\n!! <$link to=\"$:/config/DownloadSaver/AutoSave\"><<lingo AutoSave/Hint>></$link>\n\n<$checkbox tiddler=\"$:/config/DownloadSaver/AutoSave\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <<lingo AutoSave/Description>> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Saving/General": {
            "title": "$:/core/ui/ControlPanel/Saving/General",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/General/Caption}}",
            "list-before": "",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n{{$:/language/ControlPanel/Saving/General/Hint}}\n\n!! <$link to=\"$:/config/AutoSave\"><<lingo AutoSave/Caption>></$link>\n\n<<lingo AutoSave/Hint>>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\"> <<lingo AutoSave/Enabled/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\"> <<lingo AutoSave/Disabled/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Saving/GitHub": {
            "title": "$:/core/ui/ControlPanel/Saving/GitHub",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/GitService/GitHub/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitHub\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitHub/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitHub/Password>> |<$password name=\"github\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitHub/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitHub/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitHub/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitHub/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitHub/ServerURL\" default=\"https://api.github.com\" tag=\"input\"/> |"
        },
        "$:/core/ui/ControlPanel/Saving/GitLab": {
            "title": "$:/core/ui/ControlPanel/Saving/GitLab",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/GitService/GitLab/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitLab\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitLab/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitLab/Password>> |<$password name=\"gitlab\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitLab/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitLab/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitLab/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitLab/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitLab/ServerURL\" default=\"https://gitlab.com/api/v4\" tag=\"input\"/> |"
        },
        "$:/core/ui/ControlPanel/Saving/TiddlySpot": {
            "title": "$:/core/ui/ControlPanel/Saving/TiddlySpot",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/TiddlySpot/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/TiddlySpot/\n\n\\define siteURL(path)\nhttp://$(userName)$.tiddlyspot.com/$path$/\n\\end\n\\define siteLink(path)\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<siteURL $path$>>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/UploadURL\" text=\"\">\n<$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}>>\n</$reveal>\n</$set>\n</$reveal>\n\\end\n\n<div class=\"tc-message-box\">\n\n<<lingo ReadOnly>>\n\n</div>\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo Password>> |<$password name=\"upload\"/> |\n|<<lingo Backups>> |<<siteLink backup>> |\n|<<lingo ControlPanel>> |<<siteLink controlpanel>> |\n\n''<<lingo Advanced/Heading>>''\n\n|<<lingo ServerURL>>  |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>\n"
        },
        "$:/core/ui/ControlPanel/Saving/Gitea": {
            "title": "$:/core/ui/ControlPanel/Saving/Gitea",
            "tags": "$:/tags/ControlPanel/Saving",
            "caption": "{{$:/language/ControlPanel/Saving/GitService/Gitea/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~Gitea\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/Gitea/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo Gitea/Password>> |<$password name=\"Gitea\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/Gitea/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/Gitea/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/Gitea/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/Gitea/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/Gitea/ServerURL\" default=\"https://gitea/api/v1\" tag=\"input\"/> |\n"
        },
        "$:/core/ui/ControlPanel/Saving": {
            "title": "$:/core/ui/ControlPanel/Saving",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Saving/Caption}}",
            "text": "{{$:/language/ControlPanel/Saving/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Saving/General\" explicitState=\"$:/state/tab-2065006209\"/>\n</div>\n"
        },
        "$:/core/buttonstyles/Borderless": {
            "title": "$:/core/buttonstyles/Borderless",
            "tags": "$:/tags/ToolbarButtonStyle",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless}}",
            "text": "tc-btn-invisible"
        },
        "$:/core/buttonstyles/Boxed": {
            "title": "$:/core/buttonstyles/Boxed",
            "tags": "$:/tags/ToolbarButtonStyle",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed}}",
            "text": "tc-btn-boxed"
        },
        "$:/core/buttonstyles/Rounded": {
            "title": "$:/core/buttonstyles/Rounded",
            "tags": "$:/tags/ToolbarButtonStyle",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded}}",
            "text": "tc-btn-rounded"
        },
        "$:/core/ui/ControlPanel/Settings/CamelCase": {
            "title": "$:/core/ui/ControlPanel/Settings/CamelCase",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/CamelCase/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/CamelCase/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/WikiParserRules/Inline/wikilink\" field=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"> <$link to=\"$:/config/WikiParserRules/Inline/wikilink\"><<lingo Description>></$link> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab": {
            "title": "$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab",
            "caption": "{{$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption}}",
            "tags": "$:/tags/ControlPanel/Settings",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/\n\n<$link to=\"$:/config/DefaultMoreSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultMoreSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
        },
        "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab": {
            "title": "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab",
            "caption": "{{$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption}}",
            "tags": "$:/tags/ControlPanel/Settings",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultSidebarTab/\n\n<$link to=\"$:/config/DefaultSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
        },
        "$:/core/ui/ControlPanel/Settings/EditorToolbar": {
            "title": "$:/core/ui/ControlPanel/Settings/EditorToolbar",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/EditorToolbar/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/EditorToolbar/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/TextEditor/EnableToolbar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/TextEditor/EnableToolbar\"><<lingo Description>></$link> </$checkbox>\n\n"
        },
        "$:/core/ui/ControlPanel/Settings/InfoPanelMode": {
            "title": "$:/core/ui/ControlPanel/Settings/InfoPanelMode",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/InfoPanelMode/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/InfoPanelMode/\n<$link to=\"$:/config/TiddlerInfo/Mode\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"popup\"> <<lingo Popup/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"sticky\"> <<lingo Sticky/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Settings/LinkToBehaviour": {
            "title": "$:/core/ui/ControlPanel/Settings/LinkToBehaviour",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/LinkToBehaviour/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/LinkToBehaviour/\n\n<$link to=\"$:/config/Navigation/openLinkFromInsideRiver\"><<lingo \"InsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromInsideRiver\">\n  <option value=\"above\"><<lingo \"OpenAbove\">></option>\n  <option value=\"below\"><<lingo \"OpenBelow\">></option>\n  <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n  <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n\n<$link to=\"$:/config/Navigation/openLinkFromOutsideRiver\"><<lingo \"OutsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromOutsideRiver\">\n  <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n  <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n"
        },
        "$:/core/ui/ControlPanel/Settings/MissingLinks": {
            "title": "$:/core/ui/ControlPanel/Settings/MissingLinks",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/MissingLinks/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/MissingLinks/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/MissingLinks\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/MissingLinks\"><<lingo Description>></$link> </$checkbox>\n\n"
        },
        "$:/core/ui/ControlPanel/Settings/NavigationAddressBar": {
            "title": "$:/core/ui/ControlPanel/Settings/NavigationAddressBar",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\n\n<$link to=\"$:/config/Navigation/UpdateAddressBar\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permaview\"> <<lingo Permaview/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permalink\"> <<lingo Permalink/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Settings/NavigationHistory": {
            "title": "$:/core/ui/ControlPanel/Settings/NavigationHistory",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\n<$link to=\"$:/config/Navigation/UpdateHistory\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode": {
            "title": "$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationPermalinkviewMode/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/CopyToClipboard\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/CopyToClipboard\"><<lingo CopyToClipboard/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\"><<lingo UpdateAddressBar/Description>></$link> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation": {
            "title": "$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/PerformanceInstrumentation/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Performance/Instrumentation\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Performance/Instrumentation\"><<lingo Description>></$link> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Settings/TitleLinks": {
            "title": "$:/core/ui/ControlPanel/Settings/TitleLinks",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/TitleLinks/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/TitleLinks/\n<$link to=\"$:/config/Tiddlers/TitleLinks\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
        },
        "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle": {
            "title": "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtonStyle/\n<$link to=\"$:/config/Toolbar/ButtonClass\"><<lingo \"Hint\">></$link>\n\n<$select tiddler=\"$:/config/Toolbar/ButtonClass\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ToolbarButtonStyle]]\">\n<option value={{!!text}}>{{!!caption}}</option>\n</$list>\n</$select>\n"
        },
        "$:/core/ui/ControlPanel/Settings/ToolbarButtons": {
            "title": "$:/core/ui/ControlPanel/Settings/ToolbarButtons",
            "tags": "$:/tags/ControlPanel/Settings",
            "caption": "{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Toolbar/Icons\"><<lingo Icons/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Toolbar/Text\"><<lingo Text/Description>></$link> </$checkbox>\n"
        },
        "$:/core/ui/ControlPanel/Settings": {
            "title": "$:/core/ui/ControlPanel/Settings",
            "tags": "$:/tags/ControlPanel",
            "caption": "{{$:/language/ControlPanel/Settings/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
        },
        "$:/core/ui/ControlPanel/StoryView": {
            "title": "$:/core/ui/ControlPanel/StoryView",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/StoryView/Caption}}",
            "text": "{{$:/snippets/viewswitcher}}\n"
        },
        "$:/core/ui/ControlPanel/Stylesheets": {
            "title": "$:/core/ui/ControlPanel/Stylesheets",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/Stylesheets/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo Stylesheets/Hint>>\n\n{{$:/snippets/peek-stylesheets}}\n"
        },
        "$:/core/ui/ControlPanel/Theme": {
            "title": "$:/core/ui/ControlPanel/Theme",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/Theme/Caption}}",
            "text": "{{$:/snippets/themeswitcher}}\n"
        },
        "$:/core/ui/ControlPanel/TiddlerFields": {
            "title": "$:/core/ui/ControlPanel/TiddlerFields",
            "tags": "$:/tags/ControlPanel/Advanced",
            "caption": "{{$:/language/ControlPanel/TiddlerFields/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo TiddlerFields/Hint>>\n\n{{$:/snippets/allfields}}"
        },
        "$:/core/ui/ControlPanel/Toolbars/EditToolbar": {
            "title": "$:/core/ui/ControlPanel/Toolbars/EditToolbar",
            "tags": "$:/tags/ControlPanel/Toolbars",
            "caption": "{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>"
        },
        "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate": {
            "title": "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate",
            "text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"><$transclude tiddler={{!!icon}}/></span> <$transclude field=\"caption\"/> -- <i class=\"tc-muted\"><$transclude field=\"description\"/></i>\n</$draggable>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars/EditorToolbar": {
            "title": "$:/core/ui/ControlPanel/Toolbars/EditorToolbar",
            "tags": "$:/tags/ControlPanel/Toolbars",
            "caption": "{{$:/language/ControlPanel/Toolbars/EditorToolbar/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditorToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditorToolbar/Hint}}\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditorToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate\"/>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars/ItemTemplate": {
            "title": "$:/core/ui/ControlPanel/Toolbars/ItemTemplate",
            "text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"> <$transclude field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude field=\"description\"/></i></span>\n</$draggable>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars/PageControls": {
            "title": "$:/core/ui/ControlPanel/Toolbars/PageControls",
            "tags": "$:/tags/ControlPanel/Toolbars",
            "caption": "{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/PageControlButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/PageControls\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars/ViewToolbar": {
            "title": "$:/core/ui/ControlPanel/Toolbars/ViewToolbar",
            "tags": "$:/tags/ControlPanel/Toolbars",
            "caption": "{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/ViewToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/ViewToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/ControlPanel/Toolbars": {
            "title": "$:/core/ui/ControlPanel/Toolbars",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/Toolbars/Caption}}",
            "text": "{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" class=\"tc-vertical\" explicitState=\"$:/state/tabs/controlpanel/toolbars-1345989671\"/>\n</div>\n"
        },
        "$:/ControlPanel": {
            "title": "$:/ControlPanel",
            "icon": "$:/core/images/options-button",
            "color": "#bbb",
            "text": "<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Info\" explicitState=\"$:/state/tab-1749438307\"/>\n</div>\n"
        },
        "$:/core/ui/DefaultSearchResultList": {
            "title": "$:/core/ui/DefaultSearchResultList",
            "tags": "$:/tags/SearchResults",
            "caption": "{{$:/language/Search/DefaultResults/Caption}}",
            "first-search-filter": "[!is[system]search:title<userInput>sort[title]limit[250]]",
            "second-search-filter": "[!is[system]search<userInput>sort[title]limit[250]]",
            "text": "\\define searchResultList()\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[first-search-filter]] }}}>\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n//<small>{{$:/language/Search/Matches/All}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[second-search-filter]] }}}>\n<span class={{{[<currentTiddler>addsuffix[-secondaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n\\end\n<<searchResultList>>\n"
        },
        "$:/core/ui/EditTemplate/body/preview/diffs-current": {
            "title": "$:/core/ui/EditTemplate/body/preview/diffs-current",
            "tags": "$:/tags/EditPreview",
            "caption": "differences from current",
            "list-after": "$:/core/ui/EditTemplate/body/preview/output",
            "text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
        },
        "$:/core/ui/EditTemplate/body/preview/diffs-shadow": {
            "title": "$:/core/ui/EditTemplate/body/preview/diffs-shadow",
            "tags": "$:/tags/EditPreview",
            "caption": "differences from shadow (if any)",
            "list-after": "$:/core/ui/EditTemplate/body/preview/output",
            "text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{{ [{!!draft.of}shadowsource[]] }}} sourceSubTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
        },
        "$:/core/ui/EditTemplate/body/preview/output": {
            "title": "$:/core/ui/EditTemplate/body/preview/output",
            "tags": "$:/tags/EditPreview",
            "caption": "{{$:/language/EditTemplate/Body/Preview/Type/Output}}",
            "text": "\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$set name=\"tv-tiddler-preview\" value=\"yes\">\n\n<$transclude />\n\n</$set>\n"
        },
        "$:/state/showeditpreview": {
            "title": "$:/state/showeditpreview",
            "text": "no"
        },
        "$:/core/ui/EditTemplate/body/editor": {
            "title": "$:/core/ui/EditTemplate/body/editor",
            "text": "<$edit\n\n  field=\"text\"\n  class=\"tc-edit-texteditor tc-edit-texteditor-body\"\n  placeholder={{$:/language/EditTemplate/Body/Placeholder}}\n  tabindex={{$:/config/EditTabIndex}}\n  focus={{{ [{$:/config/AutoFocus}match[text]then[true]] ~[[false]] }}}\n  cancelPopups=\"yes\"\n\n><$set\n\n  name=\"targetTiddler\"\n  value=<<currentTiddler>>\n\n><$list\n\n  filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\"\n\n><$reveal\n\n  type=\"nomatch\"\n  state=<<config-visibility-title>>\n  text=\"hide\"\n  class=\"tc-text-editor-toolbar-item-wrapper\"\n\n><$transclude\n\n  tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\"\n  mode=\"inline\"\n\n/></$reveal></$list></$set></$edit>\n"
        },
        "$:/core/ui/EditTemplate/body/toolbar/button": {
            "title": "$:/core/ui/EditTemplate/body/toolbar/button",
            "text": "\\define toolbar-button-icon()\n<$list\n\n  filter=\"[all[current]!has[custom-icon]]\"\n  variable=\"no-custom-icon\"\n\n><$transclude\n\n  tiddler={{!!icon}}\n\n/></$list>\n\\end\n\n\\define toolbar-button-tooltip()\n{{!!description}}<$macrocall $name=\"displayshortcuts\" $output=\"text/plain\" shortcuts={{!!shortcuts}} prefix=\"` - [\" separator=\"] [\" suffix=\"]`\"/>\n\\end\n\n\\define toolbar-button()\n<$list\n\n  filter={{!!condition}}\n  variable=\"list-condition\"\n\n><$wikify\n\n  name=\"tooltip-text\"\n  text=<<toolbar-button-tooltip>>\n  mode=\"inline\"\n  output=\"text\"\n\n><$list\n\n  filter=\"[all[current]!has[dropdown]]\"\n  variable=\"no-dropdown\"\n\n><$button\n\n  class=\"tc-btn-invisible $(buttonClasses)$\"\n  tooltip=<<tooltip-text>>\n  actions={{!!actions}}\n\n><span\n\n  data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n  tiddler=<<currentTiddler>>\n  field=\"text\"\n\n/></$button></$list><$list\n\n  filter=\"[all[current]has[dropdown]]\"\n  variable=\"dropdown\"\n\n><$set\n\n  name=\"dropdown-state\"\n  value=<<qualify \"$:/state/EditorToolbarDropdown\">>\n\n><$button\n\n  popup=<<dropdown-state>>\n  class=\"tc-popup-keep tc-btn-invisible $(buttonClasses)$\"\n  selectedClass=\"tc-selected\"\n  tooltip=<<tooltip-text>>\n  actions={{!!actions}}\n\n><span\n\n  data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n  tiddler=<<currentTiddler>>\n  field=\"text\"\n\n/></$button><$reveal\n\n  state=<<dropdown-state>>\n  type=\"popup\"\n  position=\"below\"\n  animate=\"yes\"\n  tag=\"span\"\n\n><div\n\n  class=\"tc-drop-down tc-popup-keep\"\n\n><$transclude\n\n  tiddler={{!!dropdown}}\n  mode=\"block\"\n\n/></div></$reveal></$set></$list></$wikify></$list>\n\\end\n\n\\define toolbar-button-outer()\n<$set\n\n  name=\"buttonClasses\"\n  value={{!!button-classes}}\n\n><<toolbar-button>></$set>\n\\end\n\n<<toolbar-button-outer>>"
        },
        "$:/core/ui/EditTemplate/body": {
            "title": "$:/core/ui/EditTemplate/body",
            "tags": "$:/tags/EditTemplate",
            "text": "\\define lingo-base() $:/language/EditTemplate/Body/\n\\define config-visibility-title()\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\n\\end\n<$list filter=\"[all[current]has[_canonical_uri]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\" tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[all[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<div class=\"tc-tiddler-preview\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n<div class=\"tc-tiddler-preview-preview\">\n\n<$transclude tiddler={{$:/state/editpreviewtype}} mode=\"inline\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/preview/output\" mode=\"inline\"/>\n\n</$transclude>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n"
        },
        "$:/core/ui/EditTemplate/controls": {
            "title": "$:/core/ui/EditTemplate/controls",
            "tags": "$:/tags/EditTemplate",
            "text": "\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title tc-tiddler-edit-title\">\n<$view field=\"title\"/>\n<span class=\"tc-tiddler-controls tc-titlebar\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list></span>\n<div style=\"clear: both;\"></div>\n</div>\n"
        },
        "$:/core/ui/EditTemplate/fields": {
            "title": "$:/core/ui/EditTemplate/fields",
            "tags": "$:/tags/EditTemplate",
            "text": "\\define lingo-base() $:/language/EditTemplate/\n\\define config-title()\n$:/config/EditTemplateFields/Visibility/$(currentField)$\n\\end\n\n\\define config-filter()\n[[hide]] -[title{$(config-title)$}]\n\\end\n\n\\define current-tiddler-new-field-selector()\n[data-tiddler-title=\"$(currentTiddlerCSSescaped)$\"] .tc-edit-field-add-name-wrapper input\n\\end\n\n\\define new-field-actions()\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<storeTitle>] [<searchListState>]\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/>\n\\end\n\n\\define delete-state-tiddlers() <$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\n\\define cancel-search-actions-inner()\n<$list filter=\"[<storeTitle>has[text]] [<newFieldNameTiddler>has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\">\n<<delete-state-tiddlers>>\n</$list>\n\\end\n\n\\define cancel-search-actions()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<newFieldNameTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<<cancel-search-actions-inner>>\"\"\">\n<$action-setfield $tiddler=<<newFieldNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define new-field()\n<$vars name={{{ [<newFieldNameTiddler>get[text]] }}}>\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button tooltip=<<lingo Fields/Add/Button/Hint>>>\n<$action-sendmessage $message=\"tm-add-field\"\n$name=<<name>>\n$value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<storeTitle>] [<searchListState>]\"/>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=<<name>>>\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n</$vars>\n\\end\n\\whitespace trim\n\n<div class=\"tc-edit-fields\">\n<table class={{{ [all[current]fields[]] :filter[lookup[$:/config/EditTemplateFields/Visibility/]!match[hide]] +[count[]!match[0]] +[then[tc-edit-fields]] ~[[tc-edit-fields tc-edit-fields-small]] }}}>\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\" storyview=\"pop\">\n<$list filter=<<config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$keyboard key=\"((delete-field))\" actions=\"\"\"<$action-deletefield $field=<<currentField>>/><$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/></$set>\"\"\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n</$keyboard>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/><$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/></$set>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit tc-big-gap-right\">\n<<lingo Fields/Add/Prompt>>\n</em>\n<$vars refreshTitle=<<qualify \"$:/temp/fieldname/refresh\">> storeTitle=<<newFieldNameInputTiddler>> searchListState=<<newFieldNameSelectionTiddler>>>\n<div class=\"tc-edit-field-add-name-wrapper\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<newFieldNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>\n\t\tselectionStateTitle=<<searchListState>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}}\n\t\tfocusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}}\n\t\tfocus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups=\"yes\"\n\t\tconfigTiddlerFilter=\"[[$:/config/EditMode/fieldname-filter]]\" inputCancelActions=<<cancel-search-actions>> />\n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/field-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=<<newFieldNameTiddler>>>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/User>>\n</div>\n<$set name=\"newFieldName\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\"  variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-primaryList]] -[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-secondaryList]] -[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n</$set>\n</$linkcatcher>\n</$set>\n</div>\n</$reveal>\n</div>\n<span class=\"tc-edit-field-add-value tc-small-gap-right\">\n<$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}>\n<$keyboard key=\"((add-field))\" actions=<<new-field-actions>>>\n<$edit-text tiddler=<<newFieldValueTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\" tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n</$keyboard>\n</$set>\n</span>\n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\"/>\n</span>\n</$vars>\n</div>\n</$fieldmangler>\n"
        },
        "$:/core/ui/EditTemplate/shadow": {
            "title": "$:/core/ui/EditTemplate/shadow",
            "tags": "$:/tags/EditTemplate",
            "text": "\\define lingo-base() $:/language/EditTemplate/Shadow/\n\\define pluginLinkBody()\n<$link to=\"\"\"$(pluginTitle)$\"\"\">\n<$text text=\"\"\"$(pluginTitle)$\"\"\"/>\n</$link>\n\\end\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>"
        },
        "$:/core/ui/EditTemplate/tags": {
            "title": "$:/core/ui/EditTemplate/tags",
            "tags": "$:/tags/EditTemplate",
            "text": "\\whitespace trim\n\n\\define lingo-base() $:/language/EditTemplate/\n\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon,tagField:\"tags\")\n\\whitespace trim\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<span style=<<tag-styles>> class=\"tc-tag-label tc-tag-list-item\">\n<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view field=\"title\" format=\"text\" />\n<$button class=\"tc-btn-invisible tc-remove-tag-button\"><$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"-[{!!title}]\"/>{{$:/core/images/close-button}}</$button>\n</span>\n</$vars>\n\\end\n\n\\define tag-body(colour,palette,icon,tagField:\"tags\")\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon=\"\"\"$icon$\"\"\" tagField=<<__tagField__>>/>\n\\end\n\n\\define edit-tags-template(tagField:\"tags\")\n\\whitespace trim\n<div class=\"tc-edit-tags\">\n<$list filter=\"[list[!!$tagField$]sort[title]]\" storyview=\"pop\">\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}} tagField=<<__tagField__>>/>\n</$list>\n<$vars tabIndex={{$:/config/EditTabIndex}} cancelPopups=\"yes\">\n<$macrocall $name=\"tag-picker\" tagField=<<__tagField__>>/>\n</$vars>\n</div>\n\\end\n<$set name=\"saveTiddler\" value=<<currentTiddler>>>\n<$macrocall $name=\"edit-tags-template\" tagField=<<tagField>>/>\n</$set>\n"
        },
        "$:/core/ui/EditTemplate/title": {
            "title": "$:/core/ui/EditTemplate/title",
            "tags": "$:/tags/EditTemplate",
            "text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n\n<$vars pattern=\"\"\"[\\|\\[\\]{}]\"\"\" bad-chars=\"\"\"`| [ ] { }`\"\"\">\n\n<$list filter=\"[all[current]regexp:draft.title<pattern>]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/BadCharacterWarning}}\n\n</div>\n\n</$list>\n\n</$vars>\n\n<$reveal state=\"!!draft.title\" type=\"nomatch\" text={{!!draft.of}} tag=\"div\">\n\n<$list filter=\"[{!!draft.title}!is[missing]]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}}\n\n</div>\n\n</$list>\n\n<$list filter=\"[{!!draft.of}!is[missing]]\" variable=\"listItem\">\n\n<$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\n\n<$checkbox tiddler=\"$:/config/RelinkOnRename\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> {{$:/language/EditTemplate/Title/Relink/Prompt}}</$checkbox>\n\n<$list filter=\"[title<fromTitle>backlinks[]limit[1]]\" variable=\"listItem\">\n\n<$vars stateTiddler=<<qualify \"$:/state/edit/references\">> >\n\n<$reveal type=\"nomatch\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"show\" class=\"tc-btn-invisible\">{{$:/core/images/right-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"hide\" class=\"tc-btn-invisible\">{{$:/core/images/down-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$tiddler tiddler=<<fromTitle>> >\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo/References\"/>\n</$tiddler>\n</$reveal>\n\n</$vars>\n\n</$list>\n\n</$vars>\n\n</$list>\n\n</$reveal>\n"
        },
        "$:/core/ui/EditTemplate/type": {
            "title": "$:/core/ui/EditTemplate/type",
            "tags": "$:/tags/EditTemplate",
            "first-search-filter": "[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[description]sort[group-sort]removeprefix[$:/language/Docs/Types/]search<userInput>]",
            "text": "\\define lingo-base() $:/language/EditTemplate/\n\\define input-cancel-actions() <$list filter=\"[<storeTitle>get[text]] [<currentTiddler>get[type]] +[limit[1]]\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\"><$action-sendmessage $message=\"tm-remove-field\" $param=\"type\"/><$action-deletetiddler $filter=\"[<typeInputTiddler>] [<refreshTitle>] [<typeSelectionTiddler>]\"/></$list>\n\\whitespace trim\n<$set name=\"refreshTitle\" value=<<qualify \"$:/temp/type-search/refresh\">>>\n<div class=\"tc-edit-type-selector-wrapper\">\n<em class=\"tc-edit tc-big-gap-right\"><<lingo Type/Prompt>></em>\n<div class=\"tc-type-selector-dropdown-wrapper\">\n<div class=\"tc-type-selector\"><$fieldmangler>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<currentTiddler>> storeTitle=<<typeInputTiddler>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<typeSelectionTiddler>> field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups=\"yes\" configTiddlerFilter=\"[[$:/core/ui/EditTemplate/type]]\" inputCancelActions=<<input-cancel-actions>>/><$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}<$action-deletetiddler $filter=\"[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]\"/></$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group-sort]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$set name=\"userInput\" value={{{ [<typeInputTiddler>get[text]] }}}>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]] +[removeprefix[$:/language/Docs/Types/]] +[search<userInput>]\"><span class={{{ [<currentTiddler>addsuffix[-primaryList]] -[<typeSelectionTiddler>get[text]] +[then[]else[tc-list-item-selected]] }}}><$link to={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]get[name]] }}}><$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"description\"/> (<$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"name\"/>)</$link></span>\n</$list>\n</$set>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</$set>\n</div>\n</div>\n</div>\n</$set>\n"
        },
        "$:/core/ui/EditTemplate": {
            "title": "$:/core/ui/EditTemplate",
            "text": "\\define delete-edittemplate-state-tiddlers() <$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<newFieldNameInputTiddler>] [<newFieldNameSelectionTiddler>] [<newTagNameTiddler>] [<newTagNameInputTiddler>] [<newTagNameSelectionTiddler>] [<typeInputTiddler>] [<typeSelectionTiddler>]\"/>\n\\define save-tiddler-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-save-tiddler\"/>\n\\end\n\\define cancel-delete-tiddler-actions(message)\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\end\n<div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-edit-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}>\n<$fieldmangler>\n<$vars storyTiddler=<<currentTiddler>> newTagNameTiddler=<<qualify \"$:/temp/NewTagName\">> newFieldNameTiddler=<<qualify \"$:/temp/NewFieldName\">> newFieldValueTiddler=<<qualify \"$:/temp/NewFieldValue\">> newFieldNameInputTiddler=<<qualify \"$:/temp/NewFieldName/input\">> newFieldNameSelectionTiddler=<<qualify \"$:/temp/NewFieldName/selected-item\">> newTagNameInputTiddler=<<qualify \"$:/temp/NewTagName/input\">> newTagNameSelectionTiddler=<<qualify \"$:/temp/NewTagName/selected-item\">> typeInputTiddler=<<qualify \"$:/temp/Type/input\">> typeSelectionTiddler=<<qualify \"$:/temp/Type/selected-item\">>>\n<$keyboard key=\"((cancel-edit-tiddler))\" actions=<<cancel-delete-tiddler-actions \"cancel\">>>\n<$keyboard key=\"((save-tiddler))\" actions=<<save-tiddler-actions>>>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>>/>\n</$set>\n</$list>\n</$keyboard>\n</$keyboard>\n</$vars>\n</$fieldmangler>\n</div>\n"
        },
        "$:/core/ui/Buttons/cancel": {
            "title": "$:/core/ui/Buttons/cancel",
            "tags": "$:/tags/EditToolbar",
            "caption": "{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}",
            "description": "{{$:/language/Buttons/Cancel/Hint}}",
            "text": "\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"cancel\">> tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/cancel-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/core/ui/Buttons/delete": {
            "title": "$:/core/ui/Buttons/delete",
            "tags": "$:/tags/EditToolbar $:/tags/ViewToolbar",
            "caption": "{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}",
            "description": "{{$:/language/Buttons/Delete/Hint}}",
            "text": "\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"delete\">> tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/delete-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/core/ui/Buttons/save": {
            "title": "$:/core/ui/Buttons/save",
            "tags": "$:/tags/EditToolbar",
            "caption": "{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}",
            "description": "{{$:/language/Buttons/Save/Hint}}",
            "text": "\\define save-tiddler-button()\n\\whitespace trim\n<$fieldmangler><$button tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<<save-tiddler-actions>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/done-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n</$list>\n</$button></$fieldmangler>\n\\end\n<<save-tiddler-button>>\n"
        },
        "$:/core/ui/EditorToolbar/bold": {
            "title": "$:/core/ui/EditorToolbar/bold",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/bold",
            "caption": "{{$:/language/Buttons/Bold/Caption}}",
            "description": "{{$:/language/Buttons/Bold/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((bold))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"''\"\n\tsuffix=\"''\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/clear-dropdown": {
            "title": "$:/core/ui/EditorToolbar/clear-dropdown",
            "text": "''{{$:/language/Buttons/Clear/Hint}}''\n\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"clear\"\n\tcolour=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n\n</div>\n"
        },
        "$:/core/ui/EditorToolbar/clear": {
            "title": "$:/core/ui/EditorToolbar/clear",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/erase",
            "caption": "{{$:/language/Buttons/Clear/Caption}}",
            "description": "{{$:/language/Buttons/Clear/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/clear-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/editor-height-dropdown": {
            "title": "$:/core/ui/EditorToolbar/editor-height-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/EditorHeight/\n''<<lingo Hint>>''\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"auto\"> {{$:/core/images/auto-height}} <<lingo Caption/Auto>></$radio>\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"fixed\"> {{$:/core/images/fixed-height}} <<lingo Caption/Fixed>> <$edit-text tag=\"input\" tiddler=\"$:/config/TextEditor/EditorHeight/Height\" default=\"100px\"/></$radio>\n"
        },
        "$:/core/ui/EditorToolbar/editor-height": {
            "title": "$:/core/ui/EditorToolbar/editor-height",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/fixed-height",
            "custom-icon": "yes",
            "caption": "{{$:/language/Buttons/EditorHeight/Caption}}",
            "description": "{{$:/language/Buttons/EditorHeight/Hint}}",
            "condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]",
            "dropdown": "$:/core/ui/EditorToolbar/editor-height-dropdown",
            "text": "<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n{{$:/core/images/fixed-height}}\n</$reveal>\n<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n{{$:/core/images/auto-height}}\n</$reveal>\n"
        },
        "$:/core/ui/EditorToolbar/excise-dropdown": {
            "title": "$:/core/ui/EditorToolbar/excise-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Excise/\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<<lingo Caption/NewTitle>> <$edit-text tag=\"input\" tiddler=\"$config-title$/new-title\" default=\"\" focus=\"true\"/>\n\n<$set name=\"new-title\" value={{$config-title$/new-title}}>\n<$list filter=\"\"\"[<new-title>is[tiddler]]\"\"\">\n<div class=\"tc-error\">\n<<lingo Caption/TiddlerExists>>\n</div>\n</$list>\n</$set>\n\n<$checkbox tiddler=\"\"\"$config-title$/tagnew\"\"\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"false\"> <<lingo Caption/Tag>></$checkbox>\n\n<<lingo Caption/Replace>> <$select tiddler=\"\"\"$config-title$/type\"\"\" default=\"transclude\">\n<option value=\"link\"><<lingo Caption/Replace/Link>></option>\n<option value=\"transclude\"><<lingo Caption/Replace/Transclusion>></option>\n<option value=\"macro\"><<lingo Caption/Replace/Macro>></option>\n</$select>\n\n<$reveal state=\"\"\"$config-title$/type\"\"\" type=\"match\" text=\"macro\">\n<<lingo Caption/MacroName>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/macro-title\"\"\" default=\"translink\"/>\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"excise\"\n\ttitle={{$config-title$/new-title}}\n\ttype={{$config-title$/type}}\n\tmacro={{$config-title$/macro-title}}\n\ttagnew={{$config-title$/tagnew}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"$config-title$/new-title\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Excise>>\n</$button>\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Excise/\">>/>\n"
        },
        "$:/core/ui/EditorToolbar/excise": {
            "title": "$:/core/ui/EditorToolbar/excise",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/excise",
            "caption": "{{$:/language/Buttons/Excise/Caption}}",
            "description": "{{$:/language/Buttons/Excise/Hint}}",
            "condition": "[<targetTiddler>type[]] [<targetTiddler>type[text/vnd.tiddlywiki]] +[first[]]",
            "shortcuts": "((excise))",
            "dropdown": "$:/core/ui/EditorToolbar/excise-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/heading-1": {
            "title": "$:/core/ui/EditorToolbar/heading-1",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-1",
            "caption": "{{$:/language/Buttons/Heading1/Caption}}",
            "description": "{{$:/language/Buttons/Heading1/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((heading-1))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-2": {
            "title": "$:/core/ui/EditorToolbar/heading-2",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-2",
            "caption": "{{$:/language/Buttons/Heading2/Caption}}",
            "description": "{{$:/language/Buttons/Heading2/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-2))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"2\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-3": {
            "title": "$:/core/ui/EditorToolbar/heading-3",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-3",
            "caption": "{{$:/language/Buttons/Heading3/Caption}}",
            "description": "{{$:/language/Buttons/Heading3/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-3))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"3\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-4": {
            "title": "$:/core/ui/EditorToolbar/heading-4",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-4",
            "caption": "{{$:/language/Buttons/Heading4/Caption}}",
            "description": "{{$:/language/Buttons/Heading4/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-4))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"4\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-5": {
            "title": "$:/core/ui/EditorToolbar/heading-5",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-5",
            "caption": "{{$:/language/Buttons/Heading5/Caption}}",
            "description": "{{$:/language/Buttons/Heading5/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-5))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"5\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/heading-6": {
            "title": "$:/core/ui/EditorToolbar/heading-6",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/heading-6",
            "caption": "{{$:/language/Buttons/Heading6/Caption}}",
            "description": "{{$:/language/Buttons/Heading6/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((heading-6))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"6\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/italic": {
            "title": "$:/core/ui/EditorToolbar/italic",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/italic",
            "caption": "{{$:/language/Buttons/Italic/Caption}}",
            "description": "{{$:/language/Buttons/Italic/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((italic))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"//\"\n\tsuffix=\"//\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/line-width-dropdown": {
            "title": "$:/core/ui/EditorToolbar/line-width-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/LineWidth/\n\n\\define toolbar-line-width-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(line-width)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/LineWidth\"\n\t$value=\"$(line-width)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; margin: 4px calc(80px - $(line-width)$); background-color: #000; width: calc(100px + $(line-width)$ * 2); height: $(line-width)$; border-radius: 120px; vertical-align: middle;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(line-width)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/LineWidth\" type=\"match\" text=\"\"\"$(line-width)$\"\"\" tag=\"span\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/LineWidths}} variable=\"line-width\">\n\n<<toolbar-line-width-inner>>\n\n</$list>\n"
        },
        "$:/core/ui/EditorToolbar/line-width": {
            "title": "$:/core/ui/EditorToolbar/line-width",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/line-width",
            "caption": "{{$:/language/Buttons/LineWidth/Caption}}",
            "description": "{{$:/language/Buttons/LineWidth/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/line-width-dropdown",
            "text": "<$text text={{$:/config/BitmapEditor/LineWidth}}/>\n"
        },
        "$:/core/ui/EditorToolbar/link-dropdown": {
            "title": "$:/core/ui/EditorToolbar/link-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Link/\n\n\\define add-link-actions()\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"make-link\" text={{$(linkTiddler)$}} />\n<$action-deletetiddler $filter=\"[<dropdown-state>] [<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\\end\n\n\\define get-focus-selector() [data-tiddler-title=\"$(cssEscapedTitle)$\"] .tc-create-wikitext-link input\n\n\\define cancel-search-actions-inner()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}><$list filter=\"[<searchTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]\"/>\"\"\"><$action-setfield $tiddler=<<searchTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/></$list></$set>\n\\end\n\n\\define cancel-search-actions() <$list filter=\"[<storeTitle>!has[text]] +[<searchTiddler>!has[text]]\" emptyMessage=\"\"\"<<cancel-search-actions-inner>>\"\"\"><$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"wrap-selection\" prefix=\"\" suffix=\"\"/></$list>\n\n\\define external-link()\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\" actions=<<add-link-actions>>>\n{{$:/core/images/chevron-right}}\n</$button>\n\\end\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<$vars searchTiddler=\"\"\"$config-title$/search\"\"\" linkTiddler=\"\"\"$config-title$/link\"\"\" linktext=\"\" searchListState=<<qualify \"$:/temp/link-search/selected-item\">> refreshTitle=<<qualify \"$:/temp/link-search/refresh\">> storeTitle=<<qualify \"$:/temp/link-search/input\">>>\n\n<$vars linkTiddler=<<searchTiddler>>>\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">> class=\"tc-create-wikitext-link\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<searchTiddler>> storeTitle=<<storeTitle>>\n\t\tselectionStateTitle=<<searchListState>> refreshTitle=<<refreshTitle>> type=\"search\" filterMinLength=\"1\"\n\t\ttag=\"input\" focus=\"true\" class=\"tc-popup-handle\" inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<add-link-actions>> placeholder={{$:/language/Search/Search}} default=\"\" \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\" />\n</$keyboard>\n</$keyboard>\n<$reveal tag=\"span\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n<<external-link>>\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\">\n<<cancel-search-actions>><$set name=\"cssEscapedTitle\" value={{{ [<storyTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-focus-selector>>/></$set>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$vars>\n\n<$reveal tag=\"div\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n\n<$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>>\n\n<$vars userInput={{{ [<storeTitle>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}>\n\n{{$:/core/ui/SearchResults}}\n\n</$vars>\n\n</$linkcatcher>\n\n</$reveal>\n\n</$vars>\n\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Link/\">>/>\n"
        },
        "$:/core/ui/EditorToolbar/link": {
            "title": "$:/core/ui/EditorToolbar/link",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/link",
            "caption": "{{$:/language/Buttons/Link/Caption}}",
            "description": "{{$:/language/Buttons/Link/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((link))",
            "dropdown": "$:/core/ui/EditorToolbar/link-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/linkify": {
            "title": "$:/core/ui/EditorToolbar/linkify",
            "caption": "{{$:/language/Buttons/Linkify/Caption}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "description": "{{$:/language/Buttons/Linkify/Hint}}",
            "icon": "$:/core/images/linkify",
            "list-before": "$:/core/ui/EditorToolbar/mono-block",
            "shortcuts": "((linkify))",
            "tags": "$:/tags/EditorToolbar",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"[[\"\n\tsuffix=\"]]\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/list-bullet": {
            "title": "$:/core/ui/EditorToolbar/list-bullet",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/list-bullet",
            "caption": "{{$:/language/Buttons/ListBullet/Caption}}",
            "description": "{{$:/language/Buttons/ListBullet/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((list-bullet))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"*\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/list-number": {
            "title": "$:/core/ui/EditorToolbar/list-number",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/list-number",
            "caption": "{{$:/language/Buttons/ListNumber/Caption}}",
            "description": "{{$:/language/Buttons/ListNumber/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((list-number))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"1\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/mono-block": {
            "title": "$:/core/ui/EditorToolbar/mono-block",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/mono-block",
            "caption": "{{$:/language/Buttons/MonoBlock/Caption}}",
            "description": "{{$:/language/Buttons/MonoBlock/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((mono-block))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n```\"\n\tsuffix=\"```\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/mono-line": {
            "title": "$:/core/ui/EditorToolbar/mono-line",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/mono-line",
            "caption": "{{$:/language/Buttons/MonoLine/Caption}}",
            "description": "{{$:/language/Buttons/MonoLine/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((mono-line))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/more-dropdown": {
            "title": "$:/core/ui/EditorToolbar/more-dropdown",
            "text": "\\define config-title()\n$:/config/EditorToolbarButtons/Visibility/$(toolbarItem)$\n\\end\n\n\\define conditional-button()\n<$list filter={{$(toolbarItem)$!!condition}} variable=\"condition\">\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\" mode=\"inline\"/> <$transclude tiddler=<<toolbarItem>> field=\"description\"/>\n</$list>\n\\end\n\n<div class=\"tc-text-editor-toolbar-more\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]] -[[$:/core/ui/EditorToolbar/more]]\">\n<$reveal type=\"match\" state=<<config-visibility-title>> text=\"hide\" tag=\"div\">\n<<conditional-button>>\n</$reveal>\n</$list>\n</div>\n"
        },
        "$:/core/ui/EditorToolbar/more": {
            "title": "$:/core/ui/EditorToolbar/more",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/down-arrow",
            "caption": "{{$:/language/Buttons/More/Caption}}",
            "description": "{{$:/language/Buttons/More/Hint}}",
            "condition": "[<targetTiddler>]",
            "dropdown": "$:/core/ui/EditorToolbar/more-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/opacity-dropdown": {
            "title": "$:/core/ui/EditorToolbar/opacity-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Opacity/\n\n\\define toolbar-opacity-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(opacity)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Opacity\"\n\t$value=\"$(opacity)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(current-paint-colour)$; opacity: $(opacity)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(opacity)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/Opacity\" type=\"match\" text=\"\"\"$(opacity)$\"\"\" tag=\"span\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n\\define toolbar-opacity()\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/Opacities}} variable=\"opacity\">\n\n<<toolbar-opacity-inner>>\n\n</$list>\n\\end\n\n<$set name=\"current-paint-colour\" value={{$:/config/BitmapEditor/Colour}}>\n\n<$set name=\"current-opacity\" value={{$:/config/BitmapEditor/Opacity}}>\n\n<<toolbar-opacity>>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/EditorToolbar/opacity": {
            "title": "$:/core/ui/EditorToolbar/opacity",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/opacity",
            "caption": "{{$:/language/Buttons/Opacity/Caption}}",
            "description": "{{$:/language/Buttons/Opacity/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/opacity-dropdown",
            "text": "<$text text={{$:/config/BitmapEditor/Opacity}}/>\n"
        },
        "$:/core/ui/EditorToolbar/paint-dropdown": {
            "title": "$:/core/ui/EditorToolbar/paint-dropdown",
            "text": "''{{$:/language/Buttons/Paint/Hint}}''\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Colour\"\n\t$value=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
        },
        "$:/core/ui/EditorToolbar/paint": {
            "title": "$:/core/ui/EditorToolbar/paint",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/paint",
            "caption": "{{$:/language/Buttons/Paint/Caption}}",
            "description": "{{$:/language/Buttons/Paint/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/paint-dropdown",
            "text": "\\define toolbar-paint()\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(colour-picker-value)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\\end\n<$set name=\"colour-picker-value\" value={{$:/config/BitmapEditor/Colour}}>\n<<toolbar-paint>>\n</$set>\n"
        },
        "$:/core/ui/EditorToolbar/picture-dropdown": {
            "title": "$:/core/ui/EditorToolbar/picture-dropdown",
            "text": "\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n''{{$:/language/Buttons/Picture/Hint}}''\n\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext=<<replacement-text>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
        },
        "$:/core/ui/EditorToolbar/picture": {
            "title": "$:/core/ui/EditorToolbar/picture",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/picture",
            "caption": "{{$:/language/Buttons/Picture/Caption}}",
            "description": "{{$:/language/Buttons/Picture/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((picture))",
            "dropdown": "$:/core/ui/EditorToolbar/picture-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/preview-type-dropdown": {
            "title": "$:/core/ui/EditorToolbar/preview-type-dropdown",
            "text": "\\define preview-type-button()\n<$button tag=\"a\">\n\n<$action-setfield $tiddler=\"$:/state/editpreviewtype\" $value=\"$(previewType)$\"/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<previewType>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<previewType>> field=\"title\" mode=\"inline\"/>\n\n</$transclude> \n\n<$reveal tag=\"span\" state=\"$:/state/editpreviewtype\" type=\"match\" text=<<previewType>> default=\"$:/core/ui/EditTemplate/body/preview/output\">\n\n<$entity entity=\"&nbsp;\"/>\n\n<$entity entity=\"&#x2713;\"/>\n\n</$reveal>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]]\" variable=\"previewType\">\n\n<<preview-type-button>>\n\n</$list>\n"
        },
        "$:/core/ui/EditorToolbar/preview-type": {
            "title": "$:/core/ui/EditorToolbar/preview-type",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/chevron-down",
            "caption": "{{$:/language/Buttons/PreviewType/Caption}}",
            "description": "{{$:/language/Buttons/PreviewType/Hint}}",
            "condition": "[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]butfirst[]limit[1]]",
            "button-classes": "tc-text-editor-toolbar-item-adjunct",
            "dropdown": "$:/core/ui/EditorToolbar/preview-type-dropdown"
        },
        "$:/core/ui/EditorToolbar/preview": {
            "title": "$:/core/ui/EditorToolbar/preview",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/preview-open",
            "custom-icon": "yes",
            "caption": "{{$:/language/Buttons/Preview/Caption}}",
            "description": "{{$:/language/Buttons/Preview/Hint}}",
            "condition": "[<targetTiddler>]",
            "button-classes": "tc-text-editor-toolbar-item-start-group",
            "shortcuts": "((preview))",
            "text": "<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-open}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"no\"/>\n</$reveal>\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-closed}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"yes\"/>\n</$reveal>\n"
        },
        "$:/core/ui/EditorToolbar/quote": {
            "title": "$:/core/ui/EditorToolbar/quote",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/quote",
            "caption": "{{$:/language/Buttons/Quote/Caption}}",
            "description": "{{$:/language/Buttons/Quote/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((quote))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n<<<\"\n\tsuffix=\"<<<\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/rotate-left": {
            "title": "$:/core/ui/EditorToolbar/rotate-left",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/rotate-left",
            "caption": "{{$:/language/Buttons/RotateLeft/Caption}}",
            "description": "{{$:/language/Buttons/RotateLeft/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"rotate-left\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/size-dropdown": {
            "title": "$:/core/ui/EditorToolbar/size-dropdown",
            "text": "\\define lingo-base() $:/language/Buttons/Size/\n\n\\define toolbar-button-size-preset(config-title)\n<$set name=\"width\" filter=\"$(sizePair)$ +[first[]]\">\n\n<$set name=\"height\" filter=\"$(sizePair)$ +[last[]]\">\n\n<$button tag=\"a\">\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n\t$value=<<width>>\n/>\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n\t$value=<<height>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/presets-popup\"\"\"\n/>\n\n<$text text=<<width>>/> &times; <$text text=<<height>>/>\n\n</$button>\n\n</$set>\n\n</$set>\n\\end\n\n\\define toolbar-button-size(config-title)\n''{{$:/language/Buttons/Size/Hint}}''\n\n<<lingo Caption/Width>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-width\"\"\" default=<<tv-bitmap-editor-width>> focus=\"true\" size=\"8\"/> <<lingo Caption/Height>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-height\"\"\" default=<<tv-bitmap-editor-height>> size=\"8\"/> <$button popup=\"\"\"$config-title$/presets-popup\"\"\" class=\"tc-btn-invisible tc-popup-keep\" style=\"width: auto; display: inline-block; background-colour: inherit;\" selectedClass=\"tc-selected\">\n{{$:/core/images/down-arrow}}\n</$button>\n\n<$reveal tag=\"span\" state=\"\"\"$config-title$/presets-popup\"\"\" type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down tc-popup-keep\">\n\n<$list filter={{$:/config/BitmapEditor/ImageSizes}} variable=\"sizePair\">\n\n<$macrocall $name=\"toolbar-button-size-preset\" config-title=\"$config-title$\"/>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"resize\"\n\twidth={{$config-title$/new-width}}\n\theight={{$config-title$/new-height}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Resize>>\n</$button>\n\\end\n\n<$macrocall $name=\"toolbar-button-size\" config-title=<<qualify \"$:/state/Size/\">>/>\n"
        },
        "$:/core/ui/EditorToolbar/size": {
            "title": "$:/core/ui/EditorToolbar/size",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/size",
            "caption": "{{$:/language/Buttons/Size/Caption}}",
            "description": "{{$:/language/Buttons/Size/Hint}}",
            "condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
            "dropdown": "$:/core/ui/EditorToolbar/size-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/stamp-dropdown": {
            "title": "$:/core/ui/EditorToolbar/stamp-dropdown",
            "text": "\\define toolbar-button-stamp-inner()\n<$button tag=\"a\">\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext={{$(snippetTitle)$}}\n/>\n\n</$list>\n\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix={{{ [[$(snippetTitle)$]addsuffix[/prefix]get[text]] }}}\nsuffix={{{ [[$(snippetTitle)$]addsuffix[/suffix]get[text]] }}}\n/>\n\n</$list>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<snippetTitle>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<snippetTitle>> field=\"title\" />\n\n</$transclude>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TextEditor/Snippet]!has[draft.of]sort[caption]]\" variable=\"snippetTitle\">\n\n<<toolbar-button-stamp-inner>>\n\n</$list>\n\n----\n\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-new-tiddler\"\n\ttags=\"$:/tags/TextEditor/Snippet\"\n\tcaption={{$:/language/Buttons/Stamp/New/Title}}\n\ttext={{$:/language/Buttons/Stamp/New/Text}}\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<em>\n\n<$text text={{$:/language/Buttons/Stamp/Caption/New}}/>\n\n</em>\n\n</$button>\n"
        },
        "$:/core/ui/EditorToolbar/stamp": {
            "title": "$:/core/ui/EditorToolbar/stamp",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/stamp",
            "caption": "{{$:/language/Buttons/Stamp/Caption}}",
            "description": "{{$:/language/Buttons/Stamp/Hint}}",
            "condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]",
            "shortcuts": "((stamp))",
            "dropdown": "$:/core/ui/EditorToolbar/stamp-dropdown",
            "text": ""
        },
        "$:/core/ui/EditorToolbar/strikethrough": {
            "title": "$:/core/ui/EditorToolbar/strikethrough",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/strikethrough",
            "caption": "{{$:/language/Buttons/Strikethrough/Caption}}",
            "description": "{{$:/language/Buttons/Strikethrough/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((strikethrough))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"~~\"\n\tsuffix=\"~~\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/subscript": {
            "title": "$:/core/ui/EditorToolbar/subscript",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/subscript",
            "caption": "{{$:/language/Buttons/Subscript/Caption}}",
            "description": "{{$:/language/Buttons/Subscript/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((subscript))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\",,\"\n\tsuffix=\",,\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/superscript": {
            "title": "$:/core/ui/EditorToolbar/superscript",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/superscript",
            "caption": "{{$:/language/Buttons/Superscript/Caption}}",
            "description": "{{$:/language/Buttons/Superscript/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((superscript))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"^^\"\n\tsuffix=\"^^\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/transcludify": {
            "title": "$:/core/ui/EditorToolbar/transcludify",
            "caption": "{{$:/language/Buttons/Transcludify/Caption}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "description": "{{$:/language/Buttons/Transcludify/Hint}}",
            "icon": "$:/core/images/transcludify",
            "list-before": "$:/core/ui/EditorToolbar/mono-block",
            "shortcuts": "((transcludify))",
            "tags": "$:/tags/EditorToolbar",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"{{\"\n\tsuffix=\"}}\"\n/>\n"
        },
        "$:/core/ui/EditorToolbar/underline": {
            "title": "$:/core/ui/EditorToolbar/underline",
            "tags": "$:/tags/EditorToolbar",
            "icon": "$:/core/images/underline",
            "caption": "{{$:/language/Buttons/Underline/Caption}}",
            "description": "{{$:/language/Buttons/Underline/Hint}}",
            "condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
            "shortcuts": "((underline))",
            "text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"__\"\n\tsuffix=\"__\"\n/>\n"
        },
        "$:/core/Filters/AllTags": {
            "title": "$:/core/Filters/AllTags",
            "tags": "$:/tags/Filter",
            "filter": "[tags[]!is[system]sort[title]]",
            "description": "{{$:/language/Filters/AllTags}}",
            "text": ""
        },
        "$:/core/Filters/AllTiddlers": {
            "title": "$:/core/Filters/AllTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[!is[system]sort[title]]",
            "description": "{{$:/language/Filters/AllTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/Drafts": {
            "title": "$:/core/Filters/Drafts",
            "tags": "$:/tags/Filter",
            "filter": "[has[draft.of]sort[title]]",
            "description": "{{$:/language/Filters/Drafts}}",
            "text": ""
        },
        "$:/core/Filters/Missing": {
            "title": "$:/core/Filters/Missing",
            "tags": "$:/tags/Filter",
            "filter": "[all[missing]sort[title]]",
            "description": "{{$:/language/Filters/Missing}}",
            "text": ""
        },
        "$:/core/Filters/Orphans": {
            "title": "$:/core/Filters/Orphans",
            "tags": "$:/tags/Filter",
            "filter": "[all[orphans]sort[title]]",
            "description": "{{$:/language/Filters/Orphans}}",
            "text": ""
        },
        "$:/core/Filters/OverriddenShadowTiddlers": {
            "title": "$:/core/Filters/OverriddenShadowTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[is[shadow]]",
            "description": "{{$:/language/Filters/OverriddenShadowTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/RecentSystemTiddlers": {
            "title": "$:/core/Filters/RecentSystemTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[has[modified]!sort[modified]limit[50]]",
            "description": "{{$:/language/Filters/RecentSystemTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/RecentTiddlers": {
            "title": "$:/core/Filters/RecentTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[!is[system]has[modified]!sort[modified]limit[50]]",
            "description": "{{$:/language/Filters/RecentTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/SessionTiddlers": {
            "title": "$:/core/Filters/SessionTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[haschanged[]]",
            "description": "{{$:/language/Filters/SessionTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/ShadowTiddlers": {
            "title": "$:/core/Filters/ShadowTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[all[shadows]sort[title]]",
            "description": "{{$:/language/Filters/ShadowTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/StoryList": {
            "title": "$:/core/Filters/StoryList",
            "tags": "$:/tags/Filter",
            "filter": "[list[$:/StoryList]] -$:/AdvancedSearch",
            "description": "{{$:/language/Filters/StoryList}}",
            "text": ""
        },
        "$:/core/Filters/SystemTags": {
            "title": "$:/core/Filters/SystemTags",
            "tags": "$:/tags/Filter",
            "filter": "[all[shadows+tiddlers]tags[]is[system]sort[title]]",
            "description": "{{$:/language/Filters/SystemTags}}",
            "text": ""
        },
        "$:/core/Filters/SystemTiddlers": {
            "title": "$:/core/Filters/SystemTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[is[system]sort[title]]",
            "description": "{{$:/language/Filters/SystemTiddlers}}",
            "text": ""
        },
        "$:/core/Filters/TypedTiddlers": {
            "title": "$:/core/Filters/TypedTiddlers",
            "tags": "$:/tags/Filter",
            "filter": "[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]",
            "description": "{{$:/language/Filters/TypedTiddlers}}",
            "text": ""
        },
        "$:/core/ui/ImportListing": {
            "title": "$:/core/ui/ImportListing",
            "text": "\\define lingo-base() $:/language/Import/\n\n\\define messageField() message-$(payloadTiddler)$\n\n\\define payloadTitleFilter() [<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]\n\n\\define overWriteWarning()\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\">\n<$text text={{{[subfilter<payloadTitleFilter>!is[tiddler]then[]] ~[<lingo-base>addsuffix[Listing/Rename/OverwriteWarning]get[text]]}}}/>\n</$list>\n\\end\n\n\\define selectionField() selection-$(payloadTiddler)$\n\n\\define renameField() rename-$(payloadTiddler)$\n\n\\define suppressedField() suppressed-$(payloadTiddler)$\n\n\\define newImportTitleTiddler() $:/temp/NewImportTitle-$(payloadTiddler)$\n\n\\define previewPopupState() $(currentTiddler)$!!popup-$(payloadTiddler)$\n\n\\define renameFieldState() $(currentTiddler)$!!state-rename-$(payloadTiddler)$\n\n\\define select-all-actions()\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<$action-setfield $field={{{ [<payloadTiddler>addprefix[selection-]] }}} $value={{$:/state/import/select-all}}/>\n</$list>\n\\end\n\n<table class=\"tc-import-table\">\n<tbody>\n<tr>\n<th align=\"left\">\n<$checkbox tiddler=\"$:/state/import/select-all\" field=\"text\" checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" actions=<<select-all-actions>>>\n<<lingo Listing/Select/Caption>>\n</$checkbox>\n</th>\n<th>\n<<lingo Listing/Title/Caption>>\n</th>\n<th>\n<<lingo Listing/Status/Caption>>\n</th>\n</tr>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<tr class={{{[<currentTiddler>has<suppressedField>then[tc-row-disabled]] ~[subfilter<payloadTitleFilter>is[tiddler]then[tc-row-warning]] }}}>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}/>\n</td>\n<td>\n<$reveal type=\"nomatch\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$reveal type=\"nomatch\" state=<<previewPopupState>> text=\"yes\" tag=\"div\" class=\"tc-flex\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown tc-flex-grow-1 tc-word-break\" set=<<previewPopupState>> setTo=\"yes\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}>\n<span class=\"tc-small-gap-right\">{{$:/core/images/right-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\"><$button class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"yes\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button></$list>\n</$reveal>\n<$reveal type=\"match\" state=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"no\">\n<span class=\"tc-small-gap-right\">{{$:/core/images/down-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n</$reveal>\n</$reveal>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$text text={{{[<lingo-base>addsuffix[Listing/Rename/Prompt]get[text]]}}}/>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n<<overWriteWarning>>\n</td>\n</tr>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"tr\">\n<td colspan=\"3\">\n<div class=\"tc-flex\">\n<$edit-text tiddler=<<newImportTitleTiddler>>  default={{{[subfilter<payloadTitleFilter>]}}} tag=\"input\" class=\"tc-import-rename tc-flex-grow-1\"/><span class=\"tc-small-gap-left\"><$button  class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/CancelRename]get[text]]}}}>{{$:/core/images/close-button}}<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button><span class=\"tc-small-gap-right\"/></span><$button  class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/ConfirmRename]get[text]]}}}>{{$:/core/images/done-button}}<$action-setfield $field=<<renameField>> $value={{{[<newImportTitleTiddler>get[text]minlength[1]else<payloadTiddler>]}}} /><$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button>\n</div>\n</td>\n</$reveal>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" state=<<previewPopupState>> tag=\"div\">\n<$list filter=\"[{$:/state/importpreviewtype}has[text]]\" variable=\"listItem\" emptyMessage={{$:/core/ui/ImportPreviews/Text}}>\n<$transclude tiddler={{$:/state/importpreviewtype}}/>\n</$list>\n</$reveal>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/ImportPreviews/Diff": {
            "title": "$:/core/ui/ImportPreviews/Diff",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/Diff}}",
            "text": "<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>>/>\n"
        },
        "$:/core/ui/ImportPreviews/DiffFields": {
            "title": "$:/core/ui/ImportPreviews/DiffFields",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/DiffFields}}",
            "text": "<$macrocall $name=\"compareTiddlers\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>> exclude=\"text\"/>\n"
        },
        "$:/core/ui/ImportPreviews/Fields": {
            "title": "$:/core/ui/ImportPreviews/Fields",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/Fields}}",
            "text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[<payloadTiddler>subtiddlerfields<currentTiddler>sort[]] -text\" variable=\"fieldName\">\n<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<fieldName>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<fieldName>> tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>>/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/ImportPreviews/Text": {
            "title": "$:/core/ui/ImportPreviews/Text",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/Text}}",
            "text": "<$transclude tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> mode=\"block\"/>\n"
        },
        "$:/core/ui/ImportPreviews/TextRaw": {
            "title": "$:/core/ui/ImportPreviews/TextRaw",
            "tags": "$:/tags/ImportPreview",
            "caption": "{{$:/language/Import/Listing/Preview/TextRaw}}",
            "text": "<pre><code><$view tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> /></code></pre>"
        },
        "$:/core/ui/KeyboardShortcuts/advanced-search": {
            "title": "$:/core/ui/KeyboardShortcuts/advanced-search",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((advanced-search))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/>\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/change-sidebar-layout": {
            "title": "$:/core/ui/KeyboardShortcuts/change-sidebar-layout",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((change-sidebar-layout))",
            "text": "<$list filter=\"[{$:/themes/tiddlywiki/vanilla/options/sidebarlayout}match[fixed-fluid]]\" \nemptyMessage=\"\"\"<$action-setfield $tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" text=\"fixed-fluid\"/>\"\"\">\n<$action-setfield $tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" text=\"fluid-fixed\"/>\n</$list>\n"
        },
        "$:/core/ui/KeyboardShortcuts/new-image": {
            "title": "$:/core/ui/KeyboardShortcuts/new-image",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((new-image))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-image}}\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/new-journal": {
            "title": "$:/core/ui/KeyboardShortcuts/new-journal",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((new-journal))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-journal}}\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/new-tiddler": {
            "title": "$:/core/ui/KeyboardShortcuts/new-tiddler",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((new-tiddler))",
            "text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-tiddler}}\n</$navigator>\n"
        },
        "$:/core/ui/KeyboardShortcuts/save-wiki": {
            "title": "$:/core/ui/KeyboardShortcuts/save-wiki",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((save-wiki))",
            "text": "<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n"
        },
        "$:/core/ui/KeyboardShortcuts/sidebar-search": {
            "title": "$:/core/ui/KeyboardShortcuts/sidebar-search",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((sidebar-search))",
            "text": "<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n"
        },
        "$:/core/ui/KeyboardShortcuts/switcher": {
            "title": "$:/core/ui/KeyboardShortcuts/switcher",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((layout-switcher))",
            "text": "<$action-sendmessage $message=\"tm-show-switcher\" switch=\"layout\"/>"
        },
        "$:/core/ui/KeyboardShortcuts/toggle-sidebar": {
            "title": "$:/core/ui/KeyboardShortcuts/toggle-sidebar",
            "tags": "$:/tags/KeyboardShortcut",
            "key": "((toggle-sidebar))",
            "text": "<$list filter=\"[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]\" emptyMessage=\"\"\"\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"yes\"/>\n\"\"\">\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"no\"/>\n</$list>\n"
        },
        "$:/snippets/LayoutSwitcher": {
            "title": "$:/snippets/LayoutSwitcher",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ControlPanel/LayoutSwitcher/Caption}}",
            "text": "<$linkcatcher to=\"$:/layout\">\n<div class=\"tc-chooser\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/Layout]] [[$:/core/ui/PageTemplate]] +[!is[draft]sort[name]]\">\n<$list filter=\"[{$:/layout}!has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/layout}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field=\"name\"/>'' - <$transclude field=\"description\"/></$link></div>\n</$set>\n\"\"\">\n<$set name=\"cls\" filter=\"[all[current]field:title[$:/core/ui/PageTemplate]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field=\"name\"/>'' - <$transclude field=\"description\"/></$link></div>\n</$set>\n</$list>\n</$list>\n</div>\n</$linkcatcher>\n"
        },
        "$:/core/ui/ListItemTemplate": {
            "title": "$:/core/ui/ListItemTemplate",
            "text": "<div class=\"tc-menu-list-item\">\n<$link />\n</div>"
        },
        "$:/Manager/ItemMain/Fields": {
            "title": "$:/Manager/ItemMain/Fields",
            "tags": "$:/tags/Manager/ItemMain",
            "caption": "{{$:/language/Manager/Item/Fields}}",
            "text": "<table>\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
        },
        "$:/Manager/ItemMain/RawText": {
            "title": "$:/Manager/ItemMain/RawText",
            "tags": "$:/tags/Manager/ItemMain",
            "caption": "{{$:/language/Manager/Item/RawText}}",
            "text": "<pre><code><$view/></code></pre>\n"
        },
        "$:/Manager/ItemMain/WikifiedText": {
            "title": "$:/Manager/ItemMain/WikifiedText",
            "tags": "$:/tags/Manager/ItemMain",
            "caption": "{{$:/language/Manager/Item/WikifiedText}}",
            "text": "<$transclude mode=\"block\"/>\n"
        },
        "$:/Manager/ItemSidebar/Colour": {
            "title": "$:/Manager/ItemSidebar/Colour",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Colour}}",
            "text": "\\define swatch-styles()\nheight: 1em;\nbackground-color: $(colour)$\n\\end\n\n<$vars colour={{!!color}}>\n<p style=<<swatch-styles>>/>\n</$vars>\n<p>\n<$edit-text field=\"color\" tag=\"input\" type=\"color\"/> / <$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/>\n</p>\n"
        },
        "$:/Manager/ItemSidebar/Icon": {
            "title": "$:/Manager/ItemSidebar/Icon",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Icon}}",
            "text": "<p>\n<div class=\"tc-manager-icon-editor\">\n<$button popup=<<qualify \"$:/state/popup/image-picker\">> class=\"tc-btn-invisible\">\n<$transclude tiddler={{!!icon}}>\n{{$:/language/Manager/Item/Icon/None}}\n</$transclude>\n</$button>\n<div class=\"tc-block-dropdown-wrapper\" style=\"position: static;\">\n<$reveal state=<<qualify \"$:/state/popup/image-picker\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-popup\">\n<div class=\"tc-block-dropdown tc-popup-keep\" style=\"width: 80%; left: 10%; right: 10%; padding: 0.5em;\">\n<$macrocall $name=\"image-picker-include-tagged-images\" actions=\"\"\"\n<$action-setfield $field=\"icon\" $value=<<imageTitle>>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/image-picker\">>/>\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n</div>\n</p>\n"
        },
        "$:/Manager/ItemSidebar/Tags": {
            "title": "$:/Manager/ItemSidebar/Tags",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Tags}}",
            "text": "\\whitespace trim\n\\define tag-checkbox-actions()\n<$action-listops\n\t$tiddler=\"$:/config/Manager/RecentTags\"\n\t$subfilter=\"[<tag>] [list[$:/config/Manager/RecentTags]] +[limit[12]]\"\n/>\n\\end\n\n\\define tag-picker-actions()\n<<tag-checkbox-actions>>\n\\end\n\n<p>\n<$list filter=\"[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] \" variable=\"tag\" storyview=\"pop\">\n<div>\n<$checkbox tiddler=<<currentTiddler>> tag=<<tag>> actions=<<tag-checkbox-actions>>>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$checkbox>\n</div>\n</$list>\n</p>\n<p>\n<$fieldmangler>\n<$macrocall $name=\"tag-picker\" actions=<<tag-picker-actions>>/>\n</$fieldmangler>\n</p>\n"
        },
        "$:/Manager/ItemSidebar/Tools": {
            "title": "$:/Manager/ItemSidebar/Tools",
            "tags": "$:/tags/Manager/ItemSidebar",
            "caption": "{{$:/language/Manager/Item/Tools}}",
            "text": "<p>\n<$button to=<<currentTiddler>>>{{$:/core/images/link}} open</$button>\n</p>\n<p>\n<$button message=\"tm-edit-tiddler\" param=<<currentTiddler>>>{{$:/core/images/edit-button}} edit</$button>\n</p>\n"
        },
        "$:/Manager": {
            "title": "$:/Manager",
            "icon": "$:/core/images/list",
            "color": "#bbb",
            "text": "\\define lingo-base() $:/language/Manager/\n\n\\define list-item-content-item()\n<div class=\"tc-manager-list-item-content-item\">\n\t<$vars state-title=\"\"\"$:/state/popup/manager/item/$(listItem)$\"\"\">\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"hide\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/down-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"nomatch\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"show\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/right-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\" class=\"tc-manager-list-item-content-item-body\">\n\t\t\t<$transclude tiddler=<<listItem>>/>\n\t\t</$reveal>\n\t</$vars>\n</div>\n\\end\n\n<div class=\"tc-manager-wrapper\">\n\t<div class=\"tc-manager-controls\">\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Show/Prompt>> <$select tiddler=\"$:/config/Manager/Show\" default=\"tiddlers\">\n\t\t\t\t<option value=\"tiddlers\"><<lingo Controls/Show/Option/Tiddlers>></option>\n\t\t\t\t<option value=\"tags\"><<lingo Controls/Show/Option/Tags>></option>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Search/Prompt>> <$edit-text tiddler=\"$:/config/Manager/Filter\" tag=\"input\" default=\"\" placeholder={{$:/language/Manager/Controls/Search/Placeholder}}/>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/FilterByTag/Prompt>> <$select tiddler=\"$:/config/Manager/Tag\" default=\"\">\n\t\t\t\t<option value=\"\"><<lingo Controls/FilterByTag/None>></option>\n\t\t\t\t<$list filter=\"[!is{$:/config/Manager/System}tags[]!is[system]sort[title]]\" variable=\"tag\">\n\t\t\t\t\t<option value=<<tag>>><$text text=<<tag>>/></option>\n\t\t\t\t</$list>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Sort/Prompt>> <$select tiddler=\"$:/config/Manager/Sort\" default=\"title\">\n\t\t\t\t<optgroup label=\"Common\">\n\t\t\t\t\t<$list filter=\"title modified modifier created creator created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t\t<optgroup label=\"All\">\n\t\t\t\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}fields[]sort[title]] -title -modified -modifier -created -creator -created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t</$select>\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/Order\" field=\"text\" checked=\"reverse\" unchecked=\"forward\" default=\"forward\">\n\t\t\t\t<<lingo Controls/Order/Prompt>>\n\t\t\t</$checkbox>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/System\" field=\"text\" checked=\"\" unchecked=\"system\" default=\"system\">\n\t\t\t\t{{$:/language/SystemTiddlers/Include/Prompt}}\n\t\t\t</$checkbox>\n\t\t</div>\n\t</div>\n\t<div class=\"tc-manager-list\">\n\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}search{$:/config/Manager/Filter}tag:strict{$:/config/Manager/Tag}sort{$:/config/Manager/Sort}order{$:/config/Manager/Order}]\">\n\t\t\t<$vars transclusion=<<currentTiddler>>>\n\t\t\t\t<div style=\"tc-manager-list-item\">\n\t\t\t\t\t<$button popup=<<qualify \"$:/state/manager/popup\">> class=\"tc-btn-invisible tc-manager-list-item-heading\" selectedClass=\"tc-manager-list-item-heading-selected\">\n\t\t\t\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t\t\t</$button>\n\t\t\t\t\t<$reveal state=<<qualify \"$:/state/manager/popup\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-manager-list-item-content tc-popup-handle\">\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-tiddler\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemMain]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-sidebar\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemSidebar]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</$reveal>\n\t\t\t\t</div>\n\t\t\t</$vars>\n\t\t</$list>\n\t</div>\n</div>\n"
        },
        "$:/core/ui/MissingTemplate": {
            "title": "$:/core/ui/MissingTemplate",
            "text": "<div class=\"tc-tiddler-missing\">\n<$button popup=<<qualify \"$:/state/popup/missing\">> class=\"tc-btn-invisible tc-missing-tiddler-label\">\n<$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/missing\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]backlinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</div>\n"
        },
        "$:/core/ui/MoreSideBar/All": {
            "title": "$:/core/ui/MoreSideBar/All",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/All/Caption}}",
            "text": "<$list filter={{$:/core/Filters/AllTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Drafts": {
            "title": "$:/core/ui/MoreSideBar/Drafts",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Drafts/Caption}}",
            "text": "<$list filter={{$:/core/Filters/Drafts!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Explorer": {
            "title": "$:/core/ui/MoreSideBar/Explorer",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Explorer/Caption}}",
            "text": "<<tree \"$:/\">>\n"
        },
        "$:/core/ui/MoreSideBar/Missing": {
            "title": "$:/core/ui/MoreSideBar/Missing",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Missing/Caption}}",
            "text": "<$list filter={{$:/core/Filters/Missing!!filter}} template=\"$:/core/ui/MissingTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Orphans": {
            "title": "$:/core/ui/MoreSideBar/Orphans",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Orphans/Caption}}",
            "text": "<$list filter={{$:/core/Filters/Orphans!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Plugins": {
            "title": "$:/core/ui/MoreSideBar/Plugins",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
            "text": "\n{{$:/language/ControlPanel/Plugins/Installed/Hint}}\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]\" default=\"$:/core/ui/MoreSideBar/Plugins/Plugins\" explicitState=\"$:/state/tab-1163638994\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Recent": {
            "title": "$:/core/ui/MoreSideBar/Recent",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Recent/Caption}}",
            "text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
        },
        "$:/core/ui/MoreSideBar/Shadows": {
            "title": "$:/core/ui/MoreSideBar/Shadows",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Shadows/Caption}}",
            "text": "<$list filter={{$:/core/Filters/ShadowTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/System": {
            "title": "$:/core/ui/MoreSideBar/System",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/System/Caption}}",
            "text": "<$list filter={{$:/core/Filters/SystemTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/MoreSideBar/Tags": {
            "title": "$:/core/ui/MoreSideBar/Tags",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Tags/Caption}}",
            "text": "<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n{{$:/core/ui/Buttons/tag-manager}}\n\n</$set>\n\n</$set>\n\n</$set>\n\n<$list filter={{$:/core/Filters/AllTags!!filter}}>\n\n<$transclude tiddler=\"$:/core/ui/TagTemplate\"/>\n\n</$list>\n\n<hr class=\"tc-untagged-separator\">\n\n{{$:/core/ui/UntaggedTemplate}}\n"
        },
        "$:/core/ui/MoreSideBar/Types": {
            "title": "$:/core/ui/MoreSideBar/Types",
            "tags": "$:/tags/MoreSideBar",
            "caption": "{{$:/language/SideBar/Types/Caption}}",
            "text": "<$list filter={{$:/core/Filters/TypedTiddlers!!filter}}>\n<div class=\"tc-menu-list-item\">\n<$view field=\"type\"/>\n<$list filter=\"[type{!!type}!is[system]sort[title]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><$view field=\"title\"/></$link>\n</div>\n</$list>\n</div>\n</$list>\n"
        },
        "$:/core/ui/MoreSideBar/Plugins/Languages": {
            "title": "$:/core/ui/MoreSideBar/Plugins/Languages",
            "tags": "$:/tags/MoreSideBar/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}}",
            "text": "<$list filter=\"[!has[draft.of]plugin-type[language]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
        },
        "$:/core/ui/MoreSideBar/Plugins/Plugins": {
            "title": "$:/core/ui/MoreSideBar/Plugins/Plugins",
            "tags": "$:/tags/MoreSideBar/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}}",
            "text": "<$list filter=\"[!has[draft.of]plugin-type[plugin]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}>>/>\n"
        },
        "$:/core/ui/MoreSideBar/Plugins/Theme": {
            "title": "$:/core/ui/MoreSideBar/Plugins/Theme",
            "tags": "$:/tags/MoreSideBar/Plugins",
            "caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}}",
            "text": "<$list filter=\"[!has[draft.of]plugin-type[theme]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
        },
        "$:/core/ui/Buttons/advanced-search": {
            "title": "$:/core/ui/Buttons/advanced-search",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}",
            "description": "{{$:/language/Buttons/AdvancedSearch/Hint}}",
            "text": "\\whitespace trim\n\\define advanced-search-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/advanced-search-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\" emptyMessage=<<advanced-search-button>>>\n<<advanced-search-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/core/ui/Buttons/close-all": {
            "title": "$:/core/ui/Buttons/close-all",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}",
            "description": "{{$:/language/Buttons/CloseAll/Hint}}",
            "text": "<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/control-panel": {
            "title": "$:/core/ui/Buttons/control-panel",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}",
            "description": "{{$:/language/Buttons/ControlPanel/Hint}}",
            "text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/options-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/ControlPanel]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/core/ui/Buttons/encryption": {
            "title": "$:/core/ui/Buttons/encryption",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}",
            "description": "{{$:/language/Buttons/Encryption/Hint}}",
            "text": "\\whitespace trim\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-clear-password\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/locked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-set-password\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/unlocked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/export-page": {
            "title": "$:/core/ui/Buttons/export-page",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}",
            "description": "{{$:/language/Buttons/ExportPage/Hint}}",
            "text": "<$macrocall $name=\"exportButton\" exportFilter=\"[!is[system]sort[title]]\" lingoBase=\"$:/language/Buttons/ExportPage/\"/>"
        },
        "$:/core/ui/Buttons/fold-all": {
            "title": "$:/core/ui/Buttons/fold-all",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/fold-all-button}} {{$:/language/Buttons/FoldAll/Caption}}",
            "description": "{{$:/language/Buttons/FoldAll/Hint}}",
            "text": "<$button tooltip={{$:/language/Buttons/FoldAll/Hint}} aria-label={{$:/language/Buttons/FoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FoldAll/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/full-screen": {
            "title": "$:/core/ui/Buttons/full-screen",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}",
            "description": "{{$:/language/Buttons/FullScreen/Hint}}",
            "text": "<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/full-screen-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/home": {
            "title": "$:/core/ui/Buttons/home",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}",
            "description": "{{$:/language/Buttons/Home/Hint}}",
            "text": "<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/home-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Home/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/import": {
            "title": "$:/core/ui/Buttons/import",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}",
            "description": "{{$:/language/Buttons/Import/Hint}}",
            "text": "<div class=\"tc-file-input-wrapper\">\n<$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/import-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Import/Caption}}/></span>\n</$list>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>"
        },
        "$:/core/ui/Buttons/language": {
            "title": "$:/core/ui/Buttons/language",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}",
            "description": "{{$:/language/Buttons/Language/Hint}}",
            "text": "\\whitespace trim\n\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/language\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value={{$:/language}}>\n<$image source=<<flag-title>>/>\n</$set>\n</span>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/language\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/languageswitcher}}\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/manager": {
            "title": "$:/core/ui/Buttons/manager",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/list}} {{$:/language/Buttons/Manager/Caption}}",
            "description": "{{$:/language/Buttons/Manager/Hint}}",
            "text": "\\whitespace trim\n\\define manager-button(class)\n<$button to=\"$:/Manager\" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/list}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Manager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/Manager]]\" emptyMessage=<<manager-button>>>\n<<manager-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/core/ui/Buttons/more-page-actions": {
            "title": "$:/core/ui/Buttons/more-page-actions",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
            "description": "{{$:/language/Buttons/More/Hint}}",
            "text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button><$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
        },
        "$:/core/ui/Buttons/new-image": {
            "title": "$:/core/ui/Buttons/new-image",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/new-image-button}} {{$:/language/Buttons/NewImage/Caption}}",
            "description": "{{$:/language/Buttons/NewImage/Hint}}",
            "text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/NewImage/Hint}} aria-label={{$:/language/Buttons/NewImage/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-image}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-image-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewImage/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/core/ui/Buttons/new-journal": {
            "title": "$:/core/ui/Buttons/new-journal",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}",
            "description": "{{$:/language/Buttons/NewJournal/Hint}}",
            "text": "\\whitespace trim\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<journalButton>>\n"
        },
        "$:/core/ui/Buttons/new-tiddler": {
            "title": "$:/core/ui/Buttons/new-tiddler",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}",
            "description": "{{$:/language/Buttons/NewTiddler/Hint}}",
            "text": "\\whitespace trim\n<$button actions={{$:/core/ui/Actions/new-tiddler}} tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span>\n</$list>\n</$button>\n"
        },
        "$:/core/ui/Buttons/palette": {
            "title": "$:/core/ui/Buttons/palette",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/palette}} {{$:/language/Buttons/Palette/Caption}}",
            "description": "{{$:/language/Buttons/Palette/Hint}}",
            "text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/palette\">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/palette}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Palette/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/palette\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\" style=\"font-size:0.7em;\">\n{{$:/snippets/paletteswitcher}}\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/print": {
            "title": "$:/core/ui/Buttons/print",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/print-button}} {{$:/language/Buttons/Print/Caption}}",
            "description": "{{$:/language/Buttons/Print/Hint}}",
            "text": "<$button message=\"tm-print\" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/print-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Print/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/refresh": {
            "title": "$:/core/ui/Buttons/refresh",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}",
            "description": "{{$:/language/Buttons/Refresh/Hint}}",
            "text": "<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/refresh-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/save-wiki": {
            "title": "$:/core/ui/Buttons/save-wiki",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/save-button}} {{$:/language/Buttons/SaveWiki/Caption}}",
            "description": "{{$:/language/Buttons/SaveWiki/Hint}}",
            "text": "<$button tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span>\n</$list>\n</span>\n</$button>"
        },
        "$:/core/ui/Buttons/storyview": {
            "title": "$:/core/ui/Buttons/storyview",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}",
            "description": "{{$:/language/Buttons/StoryView/Hint}}",
            "text": "\\whitespace trim\n\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/storyview\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=<<icon>>/>\n</$set>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/storyview\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/viewswitcher}}\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/tag-manager": {
            "title": "$:/core/ui/Buttons/tag-manager",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}",
            "description": "{{$:/language/Buttons/TagManager/Hint}}",
            "text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/tag-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/TagManager]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
        },
        "$:/core/ui/Buttons/theme": {
            "title": "$:/core/ui/Buttons/theme",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}",
            "description": "{{$:/language/Buttons/Theme/Hint}}",
            "text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/theme\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/theme-button}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/theme\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/theme\">\n{{$:/snippets/themeswitcher}}\n</$linkcatcher>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/timestamp": {
            "title": "$:/core/ui/Buttons/timestamp",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/timestamp-on}} {{$:/language/Buttons/Timestamp/Caption}}",
            "description": "{{$:/language/Buttons/Timestamp/Hint}}",
            "text": "\\whitespace trim\n<$reveal type=\"nomatch\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/On/Hint}} aria-label={{$:/language/Buttons/Timestamp/On/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"yes\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-on}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/On/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/Off/Hint}} aria-label={{$:/language/Buttons/Timestamp/Off/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"no\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-off}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/unfold-all": {
            "title": "$:/core/ui/Buttons/unfold-all",
            "tags": "$:/tags/PageControls",
            "caption": "{{$:/core/images/unfold-all-button}} {{$:/language/Buttons/UnfoldAll/Caption}}",
            "description": "{{$:/language/Buttons/UnfoldAll/Hint}}",
            "text": "<$button tooltip={{$:/language/Buttons/UnfoldAll/Hint}} aria-label={{$:/language/Buttons/UnfoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-unfold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/UnfoldAll/Caption}}/></span>\n</$list>\n</$button>"
        },
        "$:/core/ui/PageTemplate/pagecontrols": {
            "title": "$:/core/ui/PageTemplate/pagecontrols",
            "text": "\\whitespace trim\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-page-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"hidden\" value=<<config-title>>>\n<$list filter=\"[<hidden>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$set>\n</$list>\n</$set>\n</$list>\n</div>\n"
        },
        "$:/core/ui/PageStylesheet": {
            "title": "$:/core/ui/PageStylesheet",
            "text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/PageTemplate/alerts": {
            "title": "$:/core/ui/PageTemplate/alerts",
            "tags": "$:/tags/PageTemplate",
            "text": "<div class=\"tc-alerts\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n</div>\n"
        },
        "$:/core/ui/PageTemplate/drafts": {
            "title": "$:/core/ui/PageTemplate/drafts",
            "tags": "$:/tags/PageTemplate",
            "text": "\\whitespace trim\n<$reveal state=\"$:/status/IsReadOnly\" type=\"nomatch\" text=\"yes\" tag=\"div\" class=\"tc-drafts-list\">\n<$list filter=\"[has[draft.of]!sort[modified]] -[list[$:/StoryList]]\">\n<$link>\n{{$:/core/images/edit-button}} <$text text=<<currentTiddler>>/>\n</$link>\n</$list>\n</$reveal>\n"
        },
        "$:/core/ui/PageTemplate/pluginreloadwarning": {
            "title": "$:/core/ui/PageTemplate/pluginreloadwarning",
            "tags": "$:/tags/PageTemplate",
            "text": "\\define lingo-base() $:/language/\n\n<$list filter=\"[{$:/status/RequireReloadDueToPluginChange}match[yes]]\">\n\n<$reveal type=\"nomatch\" state=\"$:/temp/HidePluginWarning\" text=\"yes\">\n\n<div class=\"tc-plugin-reload-warning\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<<lingo PluginReloadWarning>> <$button set=\"$:/temp/HidePluginWarning\" setTo=\"yes\" class=\"tc-btn-invisible\">{{$:/core/images/close-button}}</$button>\n\n</$set>\n\n</div>\n\n</$reveal>\n\n</$list>\n"
        },
        "$:/core/ui/PageTemplate/sidebar": {
            "title": "$:/core/ui/PageTemplate/sidebar",
            "tags": "$:/tags/PageTemplate",
            "text": "\\whitespace trim\n\\define config-title()\n$:/config/SideBarSegments/Visibility/$(listItem)$\n\\end\n\n<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBarSegment]!has[draft.of]]\" variable=\"listItem\">\n\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"  tag=\"div\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\n</$reveal>\n\n</$list>\n\n</$reveal>\n\n</div>\n\n</$scrollable>\n"
        },
        "$:/core/ui/PageTemplate/story": {
            "title": "$:/core/ui/PageTemplate/story",
            "tags": "$:/tags/PageTemplate",
            "text": "\\whitespace trim\n<section class=\"tc-story-river\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template={{$:/config/ui/ViewTemplate}} editTemplate={{$:/config/ui/EditTemplate}} storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n"
        },
        "$:/core/ui/PageTemplate/topleftbar": {
            "title": "$:/core/ui/PageTemplate/topleftbar",
            "tags": "$:/tags/PageTemplate",
            "text": "<span class=\"tc-topbar tc-topbar-left\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
        },
        "$:/core/ui/PageTemplate/toprightbar": {
            "title": "$:/core/ui/PageTemplate/toprightbar",
            "tags": "$:/tags/PageTemplate",
            "text": "<span class=\"tc-topbar tc-topbar-right\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
        },
        "$:/core/ui/PageTemplate": {
            "title": "$:/core/ui/PageTemplate",
            "name": "{{$:/language/PageTemplate/Name}}",
            "description": "{{$:/language/PageTemplate/Description}}",
            "text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-enable-drag-and-drop={{$:/config/DragAndDrop/Enable}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n\n<$dropzone enable=<<tv-enable-drag-and-drop>>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n\n</$dropzone>\n\n</$navigator>\n\n</div>\n\n</$vars>\n"
        },
        "$:/PaletteManager": {
            "title": "$:/PaletteManager",
            "text": "\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\n\\define describePaletteColour(colour)\n<$transclude tiddler=\"$:/language/Docs/PaletteColours/$colour$\"><$text text=\"$colour$\"/></$transclude>\n\\end\n\\define edit-colour-placeholder()\n edit $(colourName)$\n\\end\n\\define colour-tooltip(showhide) $showhide$ editor for $(newColourName)$ \n\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define delete-colour-index-actions() <$action-setfield $index=<<colourName>>/>\n\\define palette-manager-colour-row-segment()\n\\whitespace trim\n<$edit-text index=<<colourName>> tag=\"input\" placeholder=<<edit-colour-placeholder>> default=\"\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\" class=\"tc-palette-manager-colour-input\"/>\n<$list filter=\"[<currentTiddler>getindex<colourName>removeprefix[<<]removesuffix[>>]] [<currentTiddler>getindex<colourName>removeprefix[<$]removesuffix[/>]]\" variable=\"ignore\">\n<$set name=\"state\" value={{{ [[$:/state/palettemanager/]addsuffix<currentTiddler>addsuffix[/]addsuffix<colourName>] }}}>\n<$wikify name=\"newColourName\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall={{{ [<currentTiddler>getindex<colourName>] }}}/>\"\"\">\n<$reveal state=<<state>> type=\"nomatch\" text=\"show\">\n<$button tooltip=<<colour-tooltip show>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" set=<<state>> setTo=\"show\">{{$:/core/images/down-arrow}}<$text text=<<newColourName>> class=\"tc-small-gap-left\"/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$button tooltip=<<colour-tooltip hide>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" actions=\"\"\"<$action-deletetiddler $tiddler=<<state>>/>\"\"\">{{$:/core/images/up-arrow}}<$text text=<<newColourName>> class=\"tc-small-gap-left\"/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$set name=\"colourName\" value=<<newColourName>>>\n<br>\n<<palette-manager-colour-row-segment>>\n<br><br>\n</$set>\n</$reveal>\n</$wikify>\n</$set>\n</$list>\n\\end\n\\define palette-manager-colour-row()\n\\whitespace trim\n<tr>\n<td>\n<span style=\"float:right;\">\n<$button tooltip={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} aria-label=<<lingo Delete/Hint>> class=\"tc-btn-invisible\" actions=<<delete-colour-index-actions>>>\n{{$:/core/images/delete-button}}</$button>\n</span>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<<palette-manager-colour-row-segment>>\n</td>\n</tr>\n\\end\n\\define palette-manager-table()\n\\whitespace trim\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]indexes[]]\" variable=\"colourName\">\n<$list filter=\"[<currentTiddler>indexes[]removeprefix<colourName>suffix[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[{$:/state/palettemanager/showexternal}removeprefix[yes]suffix[]]\" variable=\"ignore\">\n<<palette-manager-colour-row>>\n</$list>\n\"\"\">\n<<palette-manager-colour-row>>\n</$list>\n</$list>\n</tbody>\n</table>\n\\end\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n\n<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name=\"currentTiddler\" $output=\"text/plain\"/></$link>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\" variable=\"listItem\">\n<<lingo Prompt/Modified>>\n<$button message=\"tm-delete-tiddler\" param={{$:/palette}}><<lingo Reset/Caption>></$button>\n</$list>\n\n<$list filter=\"[all[current]is[shadow]!is[tiddler]]\" variable=\"listItem\">\n<<lingo Clone/Prompt>>\n</$list>\n\n<$button message=\"tm-new-tiddler\" param={{$:/palette}}><<lingo Clone/Caption>></$button>\n\n<$checkbox tiddler=\"$:/state/palettemanager/showexternal\" field=\"text\" checked=\"yes\" unchecked=\"no\"><span class=\"tc-small-gap-left\"><<lingo Names/External/Show>></span></$checkbox>\n\n<<palette-manager-table>>\n"
        },
        "$:/core/ui/PluginInfo": {
            "title": "$:/core/ui/PluginInfo",
            "text": "\\define localised-info-tiddler-title()\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\n\\end\n\\define info-tiddler-title()\n$(currentTiddler)$/$(currentTab)$\n\\end\n\\define default-tiddler-title()\n$:/core/ui/PluginInfo/Default/$(currentTab)$\n\\end\n<$transclude tiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<default-tiddler-title>> mode=\"block\">\n{{$:/language/ControlPanel/Plugin/NoInfoFound/Hint}}\n</$transclude>\n</$transclude>\n</$transclude>\n</$transclude>\n"
        },
        "$:/core/ui/PluginInfo/Default/contents": {
            "title": "$:/core/ui/PluginInfo/Default/contents",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link />\n</li>\n</$list>\n</ul>\n"
        },
        "$:/core/ui/PluginListItemTemplate": {
            "title": "$:/core/ui/PluginListItemTemplate",
            "text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}><$view field=\"description\"><$view field=\"title\"/></$view></$link>\n</div>"
        },
        "$:/core/ui/RootTemplate": {
            "title": "$:/core/ui/RootTemplate",
            "text": "<$transclude tiddler={{{ [{$:/layout}has[text]] ~[[$:/core/ui/PageTemplate]] }}} mode=\"inline\"/>\n\n"
        },
        "$:/core/ui/SearchResults": {
            "title": "$:/core/ui/SearchResults",
            "text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab/search-results/sidebar\"/>\n\n</$list>\n\n</div>\n"
        },
        "$:/core/ui/SideBar/More": {
            "title": "$:/core/ui/SideBar/More",
            "tags": "$:/tags/SideBar",
            "caption": "{{$:/language/SideBar/More/Caption}}",
            "text": "<div class=\"tc-more-sidebar\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" default={{$:/config/DefaultMoreSidebarTab}} state=\"$:/state/tab/moresidebar\" class=\"tc-vertical tc-sidebar-tabs-more\" explicitState=\"$:/state/tab/moresidebar-1850697562\"/>\n</div>\n"
        },
        "$:/core/ui/SideBar/Open": {
            "title": "$:/core/ui/SideBar/Open",
            "tags": "$:/tags/SideBar",
            "caption": "{{$:/language/SideBar/Open/Caption}}",
            "text": "\\whitespace trim\n\\define lingo-base() $:/language/CloseAll/\n\n\\define drop-actions()\n<$action-listops $tiddler=<<tv-story-list>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define placeholder()\n<div class=\"tc-droppable-placeholder\"/>\n\\end\n\n\\define droppable-item(button)\n\\whitespace trim\n<$droppable actions=<<drop-actions>> enable=<<tv-allow-drag-and-drop>>>\n<<placeholder>>\n<div>\n$button$\n</div>\n</$droppable>\n\\end\n\n<div class=\"tc-sidebar-tab-open\">\n<$list filter=\"[list<tv-story-list>]\" history=<<tv-history-list>> storyview=\"pop\">\n<div class=\"tc-sidebar-tab-open-item\">\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini tc-small-gap-right\">{{$:/core/images/close-button}}</$button><$link to={{!!title}}><$view field=\"title\"/></$link>\"\"\"/>\n</div>\n</$list>\n<$tiddler tiddler=\"\">\n<div>\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\"\"\"/>\n</div>\n</$tiddler>\n</div>\n"
        },
        "$:/core/ui/SideBar/Recent": {
            "title": "$:/core/ui/SideBar/Recent",
            "tags": "$:/tags/SideBar",
            "caption": "{{$:/language/SideBar/Recent/Caption}}",
            "text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
        },
        "$:/core/ui/SideBar/Tools": {
            "title": "$:/core/ui/SideBar/Tools",
            "tags": "$:/tags/SideBar",
            "caption": "{{$:/language/SideBar/Tools/Caption}}",
            "text": "\\define lingo-base() $:/language/ControlPanel/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n<<lingo Basics/Version/Prompt>> <<version>>\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<div style=\"position:relative;\" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</div>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/SideBarLists": {
            "title": "$:/core/ui/SideBarLists",
            "text": "<$transclude tiddler=\"$:/core/ui/SideBarSegments/search\"/>\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\"/>\n\n"
        },
        "$:/core/ui/SideBarSegments/page-controls": {
            "title": "$:/core/ui/SideBarSegments/page-controls",
            "tags": "$:/tags/SideBarSegment",
            "text": "{{||$:/core/ui/PageTemplate/pagecontrols}}\n"
        },
        "$:/core/ui/SideBarSegments/search": {
            "title": "$:/core/ui/SideBarSegments/search",
            "tags": "$:/tags/SideBarSegment",
            "text": "\\whitespace trim\n\n\\define count-popup-button()\n\\whitespace trim\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[{$(searchTiddler)$}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} replaceRegexp=\"limit\\[\\d+\\]\">\n<$vars primaryListFilter={{{ [<configTiddler>get[first-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}} secondaryListFilter={{{ [<configTiddler>get[second-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[subfilter<primaryListFilter>] [subfilter<secondaryListFilter>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$vars>\n</$vars>\n</$list>\n</$button>\n\\end\n\n\\define search-results-list()\n\\whitespace trim\n<$vars userInput={{$(searchTiddler)$}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}>\n<$list filter=\"[<userInput>minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$tiddler tiddler=<<configTiddler>>>\n\n{{$:/core/ui/SearchResults}}\n\n</$tiddler>\n\n</$list>\n</$vars>\n\\end\n\n\\define cancel-search-actions() <$list filter=\"[<searchTiddler>get[text]!match{$:/temp/search}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/search]] [<searchTiddler>] [<searchListState>]\"/>\"\"\"><$action-setfield $tiddler=\"$:/temp/search\" text={{{ [<searchTiddler>get[text]] }}}/><$action-setfield $tiddler=\"$:/temp/search/refresh\" text=\"yes\"/></$list>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{  [<__tiddler__>get[text]] }}}/></$list></$list>\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define advanced-search-actions() <$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search/input}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to=\"$:/AdvancedSearch\"/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/><$action-deletetiddler $filter=\"$:/temp/search $:/temp/search/input $:/temp/search/refresh [<searchListState>]\"/>\n\n<div class=\"tc-sidebar-lists tc-sidebar-search\">\n\n<$vars editTiddler=\"$:/temp/search\" searchTiddler=\"$:/temp/search/input\" searchListState=<<qualify \"$:/state/search-list/selected-item\">>>\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$keyboard key=\"((advanced-search-sidebar))\" actions=<<advanced-search-actions>>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<editTiddler>> storeTitle=<<searchTiddler>> \n\t\tselectionStateTitle=<<searchListState>> refreshTitle=\"$:/temp/search/refresh\" type=\"search\" \n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> \n\t\tclass=\"tc-popup-handle\" filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups=\"yes\" \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\"/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n<$reveal state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<<advanced-search-actions>>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>><$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n{{$:/core/images/close-button}}\n</$button>\n<<count-popup-button>>\n</$reveal>\n<$reveal state=<<searchTiddler>> type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown tc-search-drop-down tc-popup-handle\" state=<<qualify \"$:/state/popup/search-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n\n<<search-results-list>>\n\n</$reveal>\n\n</$reveal>\n\n</$vars>\n\n</div>\n"
        },
        "$:/core/ui/SideBarSegments/site-subtitle": {
            "title": "$:/core/ui/SideBarSegments/site-subtitle",
            "tags": "$:/tags/SideBarSegment",
            "text": "<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n"
        },
        "$:/core/ui/SideBarSegments/site-title": {
            "title": "$:/core/ui/SideBarSegments/site-title",
            "tags": "$:/tags/SideBarSegment",
            "text": "<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n"
        },
        "$:/core/ui/SideBarSegments/tabs": {
            "title": "$:/core/ui/SideBarSegments/tabs",
            "tags": "$:/tags/SideBarSegment",
            "text": "<div class=\"tc-sidebar-lists tc-sidebar-tabs\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" default={{$:/config/DefaultSidebarTab}} state=\"$:/state/tab/sidebar\" class=\"tc-sidebar-tabs-main\" explicitState=\"$:/state/tab/sidebar--595412856\"/>\n\n</div>\n"
        },
        "$:/core/ui/SwitcherModal": {
            "title": "$:/core/ui/SwitcherModal",
            "subtitle": "<$text text={{{[<switch>lookup[$:/language/Switcher/Subtitle/]]}}}/>",
            "class": "tc-modal-centered",
            "text": "<$tiddler tiddler={{{[<switch>lookup[$:/config/SwitcherTargets/]]}}}>\n\n\n<$transclude/>\n\n\n</$tiddler>"
        },
        "$:/TagManager": {
            "title": "$:/TagManager",
            "icon": "$:/core/images/tag-button",
            "color": "#bbb",
            "text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n\\whitespace trim\n<$link to=\"\"><<lingo Icons/None>></$link>\n<$list filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n\\end\n\\define iconEditor(title)\n\\whitespace trim\n<div class=\"tc-drop-down-wrapper\">\n<$button popupTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal stateTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=<<__title__>> icon=<<navigateTo>>/>\"\"\">\n<<iconEditorTab type:\"!\">>\n<hr/>\n<<iconEditorTab type:\"\">>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\\define toggleButton(state)\n\\whitespace trim\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"closed\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"open\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n\\end\n\\whitespace trim\n<table class=\"tc-tag-manager-table\">\n<tbody>\n<tr>\n<th><<lingo Colour/Heading>></th>\n<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n<th><<lingo Count/Heading>></th>\n<th><<lingo Icon/Heading>></th>\n<th><<lingo Info/Heading>></th>\n</tr>\n<$list filter=\"[tags[]!is[system]sort[title]]\">\n<tr>\n<td><$edit-text field=\"color\" tag=\"input\" type=\"color\"/></td>\n<td>{{||$:/core/ui/TagTemplate}}</td>\n<td><$count filter=\"[all[current]tagging[]]\"/></td>\n<td>\n<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n</td>\n<td>\n<$macrocall $name=\"toggleButton\" state={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} /> \n</td>\n</tr>\n<tr>\n<td></td>\n<td colspan=\"4\">\n<$reveal stateTitle={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} type=\"match\" text=\"open\" default=\"\">\n<table>\n<tbody>\n<tr><td><<lingo Colour/Heading>></td><td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td></tr>\n<tr><td><<lingo Icon/Heading>></td><td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td></tr>\n</tbody>\n</table>\n</$reveal>\n</td>\n</tr>\n</$list>\n<tr>\n<td></td>\n<td style=\"position:relative;\">\n{{$:/core/ui/UntaggedTemplate}}\n</td>\n<td>\n<small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n</td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/TagPickerTagTemplate": {
            "title": "$:/core/ui/TagPickerTagTemplate",
            "text": "\\whitespace trim\n<$button class=<<button-classes>> tag=\"a\" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>\n<$list filter=\"[<saveTiddler>minlength[1]]\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter=\"[<tag>]\"/>\n</$list>\n<$set name=\"currentTiddlerCSSEscaped\" value={{{ [<saveTiddler>escapecss[]] }}}>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-tagpicker-focus-selector>> preventScroll=\"true\"/>\n</$set>\n<<delete-tag-state-tiddlers>>\n<$list filter=\"[<refreshTitle>minlength[1]]\">\n<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n<<actions>>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<$wikify name=\"foregroundColor\" text=\"\"\"<$macrocall $name=\"contrastcolour\" target={{!!color}} fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>>/>\"\"\">\n<span class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n<$transclude tiddler={{!!icon}}/><$view field=\"title\" format=\"text\"/>\n</span>\n</$wikify>\n</$set>\n</$button>\n"
        },
        "$:/core/ui/TagTemplate": {
            "title": "$:/core/ui/TagTemplate",
            "text": "\\whitespace trim\n<span class=\"tc-tag-list-item\">\n<$set name=\"transclusion\" value=<<currentTiddler>>>\n<$macrocall $name=\"tag-pill-body\" tag=<<currentTiddler>> icon={{!!icon}} colour={{!!color}} palette={{$:/palette}} element-tag=\"\"\"$button\"\"\" element-attributes=\"\"\"popup=<<qualify \"$:/state/popup/tag\">> dragFilter='[all[current]tagging[]]' tag='span'\"\"\"/>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\" class=\"tc-drop-down\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</$set>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]\" variable=\"listItem\"> \n<$transclude tiddler=<<listItem>>/> \n</$list>\n<hr>\n<$macrocall $name=\"list-tagged-draggable\" tag=<<currentTiddler>>/>\n</$reveal>\n</$set>\n</span>\n"
        },
        "$:/core/ui/TiddlerFieldTemplate": {
            "title": "$:/core/ui/TiddlerFieldTemplate",
            "text": "<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>"
        },
        "$:/core/ui/TiddlerFields": {
            "title": "$:/core/ui/TiddlerFields",
            "text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
        },
        "$:/core/ui/TiddlerInfo/Advanced/PluginInfo": {
            "title": "$:/core/ui/TiddlerInfo/Advanced/PluginInfo",
            "tags": "$:/tags/TiddlerInfo/Advanced",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n"
        },
        "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo": {
            "title": "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo",
            "tags": "$:/tags/TiddlerInfo/Advanced",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n"
        },
        "$:/core/ui/TiddlerInfo/Advanced": {
            "title": "$:/core/ui/TiddlerInfo/Advanced",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Advanced/Caption}}",
            "text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n</$list>\n"
        },
        "$:/core/ui/TiddlerInfo/Fields": {
            "title": "$:/core/ui/TiddlerInfo/Fields",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Fields/Caption}}",
            "text": "<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n"
        },
        "$:/core/ui/TiddlerInfo/List": {
            "title": "$:/core/ui/TiddlerInfo/List",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/List/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/TiddlerInfo/Listed": {
            "title": "$:/core/ui/TiddlerInfo/Listed",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Listed/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/TiddlerInfo/References": {
            "title": "$:/core/ui/TiddlerInfo/References",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/References/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>"
        },
        "$:/core/ui/TiddlerInfo/Tagging": {
            "title": "$:/core/ui/TiddlerInfo/Tagging",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Tagging/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]tagging[]]\" emptyMessage=<<lingo Tagging/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
        },
        "$:/core/ui/TiddlerInfo/Tools": {
            "title": "$:/core/ui/TiddlerInfo/Tools",
            "tags": "$:/tags/TiddlerInfo",
            "caption": "{{$:/language/TiddlerInfo/Tools/Caption}}",
            "text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
        },
        "$:/core/ui/TiddlerInfo": {
            "title": "$:/core/ui/TiddlerInfo",
            "text": "<div style=\"position:relative;\">\n<div class=\"tc-tiddler-controls\" style=\"position:absolute;right:0;\">\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n</div>\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>\n"
        },
        "$:/core/ui/TopBar/menu": {
            "title": "$:/core/ui/TopBar/menu",
            "tags": "$:/tags/TopRightBar",
            "text": "<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible tc-hide-sidebar-btn\">{{$:/core/images/chevron-right}}</$button>\n</$list>\n<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible tc-show-sidebar-btn\">{{$:/core/images/chevron-left}}</$button>\n</$list>\n"
        },
        "$:/core/ui/UntaggedTemplate": {
            "title": "$:/core/ui/UntaggedTemplate",
            "text": "\\define lingo-base() $:/language/SideBar/\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate/body": {
            "title": "$:/core/ui/ViewTemplate/body",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal tag=\"div\" class=\"tc-tiddler-body\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]!has[plugin-type]!field:hide-body[yes]]\">\n\n<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n\n</$list>\n\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate/classic": {
            "title": "$:/core/ui/ViewTemplate/classic",
            "tags": "$:/tags/ViewTemplate $:/tags/EditTemplate",
            "text": "\\define lingo-base() $:/language/ClassicWarning/\n<$list filter=\"[all[current]type[text/x-tiddlywiki]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Hint>>\n\n<$button set=\"!!type\" setTo=\"text/vnd.tiddlywiki\"><<lingo Upgrade/Caption>></$button>\n\n</div>\n</$list>\n"
        },
        "$:/core/ui/ViewTemplate/import": {
            "title": "$:/core/ui/ViewTemplate/import",
            "tags": "$:/tags/ViewTemplate",
            "text": "\\define lingo-base() $:/language/Import/\n\n\\define buttons()\n<$button message=\"tm-delete-tiddler\" param=<<currentTiddler>>><<lingo Listing/Cancel/Caption>></$button>\n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n<<lingo Listing/Preview>> <$select tiddler=\"$:/state/importpreviewtype\" default=\"$:/core/ui/ImportPreviews/Text\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ImportPreview]!has[draft.of]]\">\n<option value=<<currentTiddler>>>{{!!caption}}</option>\n</$list>\n</$select>\n\\end\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n<<buttons>>\n\n{{||$:/core/ui/ImportListing}}\n\n<<buttons>>\n\n</div>\n\n</$list>\n"
        },
        "$:/core/ui/ViewTemplate/plugin": {
            "title": "$:/core/ui/ViewTemplate/plugin",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal tag=\"div\" class=\"tc-tiddler-plugin-info\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]\">\n<$set name=\"plugin-type\" value={{!!plugin-type}}>\n<$set name=\"default-popup-state\" value=\"yes\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n{{||$:/core/ui/Components/plugin-info}}\n</$set>\n</$set>\n</$set>\n</$list>\n</$reveal>"
        },
        "$:/core/ui/ViewTemplate/subtitle": {
            "title": "$:/core/ui/ViewTemplate/subtitle",
            "tags": "$:/tags/ViewTemplate",
            "text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}} />\n<$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate/tags": {
            "title": "$:/core/ui/ViewTemplate/tags",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-tags-wrapper\"><$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/></div>\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate/title": {
            "title": "$:/core/ui/ViewTemplate/title",
            "tags": "$:/tags/ViewTemplate",
            "text": "\\whitespace trim\n\\define title-styles()\nfill:$(foregroundColor)$;\n\\end\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<span class=\"tc-tiddler-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>\n</span>\n<$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n<$link>\n<$set name=\"foregroundColor\" value={{!!color}}>\n<$list filter=\"[all[current]has[icon]]~[[$:/config/DefaultTiddlerIcon]has[text]]\">\n<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}>\n<$transclude tiddler={{$:/config/DefaultTiddlerIcon}}/>\n</$transclude>\n</span>\n</$list>\n</$set>\n<$list filter=\"[all[current]removeprefix[$:/]]\">\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n</h2>\n</$list>\n<$list filter=\"[all[current]!prefix[$:/]]\">\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n</$list>\n</$link>\n</$set>\n</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>> mode=\"block\"/></$list>\n\n</$reveal>\n</div>"
        },
        "$:/core/ui/ViewTemplate/unfold": {
            "title": "$:/core/ui/ViewTemplate/unfold",
            "tags": "$:/tags/ViewTemplate",
            "text": "<$reveal tag=\"div\" type=\"nomatch\" state=\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar\" text=\"hide\">\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=\"tc-fold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-up}}\n</$button>\n</$reveal>\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"show\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=\"tc-unfold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</$reveal>\n"
        },
        "$:/core/ui/ViewTemplate": {
            "title": "$:/core/ui/ViewTemplate",
            "text": "\\define folded-state()\n$:/state/folded/$(currentTiddler)$\n\\end\n\\define cancel-delete-tiddler-actions(message) <$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify \"$:/state/popup/tiddler-info\">>><div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-view-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[shadow]is[tiddler]then[tc-tiddler-overridden-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\n</$vars>\n"
        },
        "$:/core/ui/Buttons/clone": {
            "title": "$:/core/ui/Buttons/clone",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}",
            "description": "{{$:/language/Buttons/Clone/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-new-tiddler\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/clone-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Clone/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/close-others": {
            "title": "$:/core/ui/Buttons/close-others",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}",
            "description": "{{$:/language/Buttons/CloseOthers/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-close-other-tiddlers\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/CloseOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/close": {
            "title": "$:/core/ui/Buttons/close",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}",
            "description": "{{$:/language/Buttons/Close/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Close/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/edit": {
            "title": "$:/core/ui/Buttons/edit",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}",
            "description": "{{$:/language/Buttons/Edit/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-edit-tiddler\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/edit-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Edit/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/export-tiddler": {
            "title": "$:/core/ui/Buttons/export-tiddler",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}",
            "description": "{{$:/language/Buttons/ExportTiddler/Hint}}",
            "text": "\\define makeExportFilter()\n[[$(currentTiddler)$]]\n\\end\n<$macrocall $name=\"exportButton\" exportFilter=<<makeExportFilter>> lingoBase=\"$:/language/Buttons/ExportTiddler/\" baseFilename=<<currentTiddler>>/>"
        },
        "$:/core/ui/Buttons/fold-bar": {
            "title": "$:/core/ui/Buttons/fold-bar",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/chevron-up}} {{$:/language/Buttons/Fold/FoldBar/Caption}}",
            "description": "{{$:/language/Buttons/Fold/FoldBar/Hint}}",
            "text": "<!-- This dummy toolbar button is here to allow visibility of the fold-bar to be controlled as if it were a toolbar button -->"
        },
        "$:/core/ui/Buttons/fold-others": {
            "title": "$:/core/ui/Buttons/fold-others",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/fold-others-button}} {{$:/language/Buttons/FoldOthers/Caption}}",
            "description": "{{$:/language/Buttons/FoldOthers/Hint}}",
            "text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/FoldOthers/Hint}} aria-label={{$:/language/Buttons/FoldOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-other-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/FoldOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/fold": {
            "title": "$:/core/ui/Buttons/fold",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/fold-button}} {{$:/language/Buttons/Fold/Caption}}",
            "description": "{{$:/language/Buttons/Fold/Hint}}",
            "text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Fold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Unfold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n"
        },
        "$:/core/ui/Buttons/info": {
            "title": "$:/core/ui/Buttons/info",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}",
            "description": "{{$:/language/Buttons/Info/Hint}}",
            "text": "\\whitespace trim\n\\define button-content()\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Info/Caption}}/>\n</span>\n</$list>\n\\end\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"popup\">\n<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$reveal state=<<tiddlerInfoState>> type=\"match\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"yes\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=<<tiddlerInfoState>> type=\"nomatch\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n</$reveal>"
        },
        "$:/core/ui/Buttons/more-tiddler-actions": {
            "title": "$:/core/ui/Buttons/more-tiddler-actions",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
            "description": "{{$:/language/Buttons/More/Hint}}",
            "text": "\\whitespace trim\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/More/Caption}}/>\n</span>\n</$list>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
        },
        "$:/core/ui/Buttons/new-here": {
            "title": "$:/core/ui/Buttons/new-here",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}",
            "description": "{{$:/language/Buttons/NewHere/Hint}}",
            "text": "\\whitespace trim\n\\define newHereActions()\n<$set name=\"tags\" filter=\"[<currentTiddler>] [{$:/config/NewTiddler/Tags}]\">\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<tags>>/>\n</$set>\n\\end\n\\define newHereButton()\n<$button actions=<<newHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-here-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewHere/Caption}}/>\n</span>\n</$list>\n</$button>\n\\end\n<<newHereButton>>\n"
        },
        "$:/core/ui/Buttons/new-journal-here": {
            "title": "$:/core/ui/Buttons/new-journal-here",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}",
            "description": "{{$:/language/Buttons/NewJournalHere/Hint}}",
            "text": "\\whitespace trim\n\\define journalButtonTags()\n[[$(currentTiddlerTag)$]] $(journalTags)$\n\\end\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>\n</span>\n</$list>\n</$wikify>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<$set name=\"currentTiddlerTag\" value=<<currentTiddler>>>\n<<journalButton>>\n</$set>\n</$set>\n</$set>\n"
        },
        "$:/core/ui/Buttons/open-window": {
            "title": "$:/core/ui/Buttons/open-window",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/open-window}} {{$:/language/Buttons/OpenWindow/Caption}}",
            "description": "{{$:/language/Buttons/OpenWindow/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-open-window\" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/open-window}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/OpenWindow/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/permalink": {
            "title": "$:/core/ui/Buttons/permalink",
            "tags": "$:/tags/ViewToolbar",
            "caption": "{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}",
            "description": "{{$:/language/Buttons/Permalink/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-permalink\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permalink-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permalink/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/core/ui/Buttons/permaview": {
            "title": "$:/core/ui/Buttons/permaview",
            "tags": "$:/tags/ViewToolbar $:/tags/PageControls",
            "caption": "{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}",
            "description": "{{$:/language/Buttons/Permaview/Hint}}",
            "text": "\\whitespace trim\n<$button message=\"tm-permaview\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permaview-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permaview/Caption}}/>\n</span>\n</$list>\n</$button>"
        },
        "$:/DefaultTiddlers": {
            "title": "$:/DefaultTiddlers",
            "text": "GettingStarted\n"
        },
        "$:/temp/advancedsearch": {
            "title": "$:/temp/advancedsearch",
            "text": ""
        },
        "$:/snippets/allfields": {
            "title": "$:/snippets/allfields",
            "text": "\\define renderfield(title)\n<tr class=\"tc-view-field\"><td class=\"tc-view-field-name\">''$title$'':</td><td class=\"tc-view-field-value\">//{{$:/language/Docs/Fields/$title$}}//</td></tr>\n\\end\n<table class=\"tc-view-field-table\"><tbody><$list filter=\"[fields[]sort[title]]\" variable=\"listItem\"><$macrocall $name=\"renderfield\" title=<<listItem>>/></$list>\n</tbody></table>\n"
        },
        "$:/config/AnimationDuration": {
            "title": "$:/config/AnimationDuration",
            "text": "400"
        },
        "$:/config/AutoFocus": {
            "title": "$:/config/AutoFocus",
            "text": "title"
        },
        "$:/config/AutoSave": {
            "title": "$:/config/AutoSave",
            "text": "yes"
        },
        "$:/config/BitmapEditor/Colour": {
            "title": "$:/config/BitmapEditor/Colour",
            "text": "#444"
        },
        "$:/config/BitmapEditor/ImageSizes": {
            "title": "$:/config/BitmapEditor/ImageSizes",
            "text": "[[62px 100px]] [[100px 62px]] [[124px 200px]] [[200px 124px]] [[248px 400px]] [[371px 600px]] [[400px 248px]] [[556px 900px]] [[600px 371px]] [[742px 1200px]] [[900px 556px]] [[1200px 742px]]"
        },
        "$:/config/BitmapEditor/LineWidth": {
            "title": "$:/config/BitmapEditor/LineWidth",
            "text": "3px"
        },
        "$:/config/BitmapEditor/LineWidths": {
            "title": "$:/config/BitmapEditor/LineWidths",
            "text": "0.25px 0.5px 1px 2px 3px 4px 6px 8px 10px 16px 20px 28px 40px 56px 80px"
        },
        "$:/config/BitmapEditor/Opacities": {
            "title": "$:/config/BitmapEditor/Opacities",
            "text": "0.01 0.025 0.05 0.075 0.1 0.15 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0"
        },
        "$:/config/BitmapEditor/Opacity": {
            "title": "$:/config/BitmapEditor/Opacity",
            "text": "1.0"
        },
        "$:/config/DefaultMoreSidebarTab": {
            "title": "$:/config/DefaultMoreSidebarTab",
            "text": "$:/core/ui/MoreSideBar/Tags"
        },
        "$:/config/DefaultSidebarTab": {
            "title": "$:/config/DefaultSidebarTab",
            "text": "$:/core/ui/SideBar/Open"
        },
        "$:/config/DownloadSaver/AutoSave": {
            "title": "$:/config/DownloadSaver/AutoSave",
            "text": "no"
        },
        "$:/config/Drafts/TypingTimeout": {
            "title": "$:/config/Drafts/TypingTimeout",
            "text": "400"
        },
        "$:/config/EditMode/fieldname-filter": {
            "title": "$:/config/EditMode/fieldname-filter",
            "first-search-filter": "[!is[shadow]!is[system]fields[]search:title<userInput>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type",
            "second-search-filter": "[fields[]search:title<userInput>sort[]] -[!is[shadow]!is[system]fields[]]"
        },
        "$:/config/EditTabIndex": {
            "title": "$:/config/EditTabIndex",
            "text": "1\n"
        },
        "$:/config/EditTemplateFields/Visibility/title": {
            "title": "$:/config/EditTemplateFields/Visibility/title",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/tags": {
            "title": "$:/config/EditTemplateFields/Visibility/tags",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/text": {
            "title": "$:/config/EditTemplateFields/Visibility/text",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/creator": {
            "title": "$:/config/EditTemplateFields/Visibility/creator",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/created": {
            "title": "$:/config/EditTemplateFields/Visibility/created",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/modified": {
            "title": "$:/config/EditTemplateFields/Visibility/modified",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/modifier": {
            "title": "$:/config/EditTemplateFields/Visibility/modifier",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/type": {
            "title": "$:/config/EditTemplateFields/Visibility/type",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/draft.title": {
            "title": "$:/config/EditTemplateFields/Visibility/draft.title",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/draft.of": {
            "title": "$:/config/EditTemplateFields/Visibility/draft.of",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/revision": {
            "title": "$:/config/EditTemplateFields/Visibility/revision",
            "text": "hide"
        },
        "$:/config/EditTemplateFields/Visibility/bag": {
            "title": "$:/config/EditTemplateFields/Visibility/bag",
            "text": "hide"
        },
        "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4": {
            "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4",
            "text": "hide"
        },
        "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5": {
            "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5",
            "text": "hide"
        },
        "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6": {
            "title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6",
            "text": "hide"
        },
        "$:/config/EditorTypeMappings/image/gif": {
            "title": "$:/config/EditorTypeMappings/image/gif",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/webp": {
            "title": "$:/config/EditorTypeMappings/image/webp",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/heic": {
            "title": "$:/config/EditorTypeMappings/image/heic",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/heif": {
            "title": "$:/config/EditorTypeMappings/image/heif",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/jpeg": {
            "title": "$:/config/EditorTypeMappings/image/jpeg",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/jpg": {
            "title": "$:/config/EditorTypeMappings/image/jpg",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/png": {
            "title": "$:/config/EditorTypeMappings/image/png",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/image/x-icon": {
            "title": "$:/config/EditorTypeMappings/image/x-icon",
            "text": "bitmap"
        },
        "$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
            "title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
            "text": "text"
        },
        "$:/config/Manager/Show": {
            "title": "$:/config/Manager/Show",
            "text": "tiddlers"
        },
        "$:/config/Manager/Filter": {
            "title": "$:/config/Manager/Filter",
            "text": ""
        },
        "$:/config/Manager/Order": {
            "title": "$:/config/Manager/Order",
            "text": "forward"
        },
        "$:/config/Manager/Sort": {
            "title": "$:/config/Manager/Sort",
            "text": "title"
        },
        "$:/config/Manager/System": {
            "title": "$:/config/Manager/System",
            "text": "system"
        },
        "$:/config/Manager/Tag": {
            "title": "$:/config/Manager/Tag",
            "text": ""
        },
        "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText": {
            "title": "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText",
            "text": "hide"
        },
        "$:/config/MissingLinks": {
            "title": "$:/config/MissingLinks",
            "text": "yes"
        },
        "$:/config/Navigation/UpdateAddressBar": {
            "title": "$:/config/Navigation/UpdateAddressBar",
            "text": "no"
        },
        "$:/config/Navigation/UpdateHistory": {
            "title": "$:/config/Navigation/UpdateHistory",
            "text": "no"
        },
        "$:/config/NewImageType": {
            "title": "$:/config/NewImageType",
            "text": "jpeg"
        },
        "$:/config/OfficialPluginLibrary": {
            "title": "$:/config/OfficialPluginLibrary",
            "tags": "$:/tags/PluginLibrary",
            "url": "https://tiddlywiki.com/library/v5.1.23/index.html",
            "caption": "{{$:/language/OfficialPluginLibrary}}",
            "text": "{{$:/language/OfficialPluginLibrary/Hint}}\n"
        },
        "$:/config/Navigation/openLinkFromInsideRiver": {
            "title": "$:/config/Navigation/openLinkFromInsideRiver",
            "text": "below"
        },
        "$:/config/Navigation/openLinkFromOutsideRiver": {
            "title": "$:/config/Navigation/openLinkFromOutsideRiver",
            "text": "top"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme",
            "text": "hide"
        },
        "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all": {
            "title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all",
            "text": "hide"
        },
        "$:/config/Performance/Instrumentation": {
            "title": "$:/config/Performance/Instrumentation",
            "text": "no"
        },
        "$:/config/RegisterPluginType/plugin": {
            "title": "$:/config/RegisterPluginType/plugin",
            "text": "yes"
        },
        "$:/config/RegisterPluginType/theme": {
            "title": "$:/config/RegisterPluginType/theme",
            "text": "no"
        },
        "$:/config/RegisterPluginType/language": {
            "title": "$:/config/RegisterPluginType/language",
            "text": "no"
        },
        "$:/config/RegisterPluginType/info": {
            "title": "$:/config/RegisterPluginType/info",
            "text": "yes"
        },
        "$:/config/RegisterPluginType/import": {
            "title": "$:/config/RegisterPluginType/import",
            "text": "no"
        },
        "$:/config/SaveWikiButton/Template": {
            "title": "$:/config/SaveWikiButton/Template",
            "text": "$:/core/save/all"
        },
        "$:/config/SaverFilter": {
            "title": "$:/config/SaverFilter",
            "text": "[all[]] -[prefix[$:/HistoryList]] -[prefix[$:/StoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n"
        },
        "$:/config/Search/AutoFocus": {
            "title": "$:/config/Search/AutoFocus",
            "text": "true"
        },
        "$:/config/Search/MinLength": {
            "title": "$:/config/Search/MinLength",
            "text": "3"
        },
        "$:/config/SearchResults/Default": {
            "title": "$:/config/SearchResults/Default",
            "text": "$:/core/ui/DefaultSearchResultList"
        },
        "$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]": {
            "title": "$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]",
            "text": "yes"
        },
        "$:/config/ShortcutInfo/add-field": {
            "title": "$:/config/ShortcutInfo/add-field",
            "text": "{{$:/language/EditTemplate/Fields/Add/Button/Hint}}"
        },
        "$:/config/ShortcutInfo/advanced-search": {
            "title": "$:/config/ShortcutInfo/advanced-search",
            "text": "{{$:/language/Buttons/AdvancedSearch/Hint}}"
        },
        "$:/config/ShortcutInfo/advanced-search-sidebar": {
            "title": "$:/config/ShortcutInfo/advanced-search-sidebar",
            "text": "{{$:/language/Shortcuts/Input/AdvancedSearch/Hint}}"
        },
        "$:/config/ShortcutInfo/bold": {
            "title": "$:/config/ShortcutInfo/bold",
            "text": "{{$:/language/Buttons/Bold/Hint}}"
        },
        "$:/config/ShortcutInfo/cancel-edit-tiddler": {
            "title": "$:/config/ShortcutInfo/cancel-edit-tiddler",
            "text": "{{$:/language/Buttons/Cancel/Hint}}"
        },
        "$:/config/ShortcutInfo/change-sidebar-layout": {
            "title": "$:/config/ShortcutInfo/change-sidebar-layout",
            "text": "{{$:/language/Shortcuts/SidebarLayout/Hint}}"
        },
        "$:/config/ShortcutInfo/delete-field": {
            "title": "$:/config/ShortcutInfo/delete-field",
            "text": "{{$:/language/EditTemplate/Field/Remove/Hint}}"
        },
        "$:/config/ShortcutInfo/excise": {
            "title": "$:/config/ShortcutInfo/excise",
            "text": "{{$:/language/Buttons/Excise/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-1": {
            "title": "$:/config/ShortcutInfo/heading-1",
            "text": "{{$:/language/Buttons/Heading1/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-2": {
            "title": "$:/config/ShortcutInfo/heading-2",
            "text": "{{$:/language/Buttons/Heading2/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-3": {
            "title": "$:/config/ShortcutInfo/heading-3",
            "text": "{{$:/language/Buttons/Heading3/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-4": {
            "title": "$:/config/ShortcutInfo/heading-4",
            "text": "{{$:/language/Buttons/Heading4/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-5": {
            "title": "$:/config/ShortcutInfo/heading-5",
            "text": "{{$:/language/Buttons/Heading5/Hint}}"
        },
        "$:/config/ShortcutInfo/heading-6": {
            "title": "$:/config/ShortcutInfo/heading-6",
            "text": "{{$:/language/Buttons/Heading6/Hint}}"
        },
        "$:/config/ShortcutInfo/input-accept": {
            "title": "$:/config/ShortcutInfo/input-accept",
            "text": "{{$:/language/Shortcuts/Input/Accept/Hint}}"
        },
        "$:/config/ShortcutInfo/input-accept-variant": {
            "title": "$:/config/ShortcutInfo/input-accept-variant",
            "text": "{{$:/language/Shortcuts/Input/AcceptVariant/Hint}}"
        },
        "$:/config/ShortcutInfo/input-cancel": {
            "title": "$:/config/ShortcutInfo/input-cancel",
            "text": "{{$:/language/Shortcuts/Input/Cancel/Hint}}"
        },
        "$:/config/ShortcutInfo/input-down": {
            "title": "$:/config/ShortcutInfo/input-down",
            "text": "{{$:/language/Shortcuts/Input/Down/Hint}}"
        },
        "$:/config/ShortcutInfo/input-tab-left": {
            "title": "$:/config/ShortcutInfo/input-tab-left",
            "text": "{{$:/language/Shortcuts/Input/Tab-Left/Hint}}"
        },
        "$:/config/ShortcutInfo/input-tab-right": {
            "title": "$:/config/ShortcutInfo/input-tab-right",
            "text": "{{$:/language/Shortcuts/Input/Tab-Right/Hint}}"
        },
        "$:/config/ShortcutInfo/input-up": {
            "title": "$:/config/ShortcutInfo/input-up",
            "text": "{{$:/language/Shortcuts/Input/Up/Hint}}"
        },
        "$:/config/ShortcutInfo/italic": {
            "title": "$:/config/ShortcutInfo/italic",
            "text": "{{$:/language/Buttons/Italic/Hint}}"
        },
        "$:/config/ShortcutInfo/layout-switcher": {
            "title": "$:/config/ShortcutInfo/layout-switcher",
            "text": "{{$:/language/LayoutSwitcher/Description}}"
        },
        "$:/config/ShortcutInfo/link": {
            "title": "$:/config/ShortcutInfo/link",
            "text": "{{$:/language/Buttons/Link/Hint}}"
        },
        "$:/config/ShortcutInfo/linkify": {
            "title": "$:/config/ShortcutInfo/linkify",
            "text": "{{$:/language/Buttons/Linkify/Hint}}"
        },
        "$:/config/ShortcutInfo/list-bullet": {
            "title": "$:/config/ShortcutInfo/list-bullet",
            "text": "{{$:/language/Buttons/ListBullet/Hint}}"
        },
        "$:/config/ShortcutInfo/list-number": {
            "title": "$:/config/ShortcutInfo/list-number",
            "text": "{{$:/language/Buttons/ListNumber/Hint}}"
        },
        "$:/config/ShortcutInfo/mono-block": {
            "title": "$:/config/ShortcutInfo/mono-block",
            "text": "{{$:/language/Buttons/MonoBlock/Hint}}"
        },
        "$:/config/ShortcutInfo/mono-line": {
            "title": "$:/config/ShortcutInfo/mono-line",
            "text": "{{$:/language/Buttons/MonoLine/Hint}}"
        },
        "$:/config/ShortcutInfo/new-image": {
            "title": "$:/config/ShortcutInfo/new-image",
            "text": "{{$:/language/Buttons/NewImage/Hint}}"
        },
        "$:/config/ShortcutInfo/new-journal": {
            "title": "$:/config/ShortcutInfo/new-journal",
            "text": "{{$:/language/Buttons/NewJournal/Hint}}"
        },
        "$:/config/ShortcutInfo/new-tiddler": {
            "title": "$:/config/ShortcutInfo/new-tiddler",
            "text": "{{$:/language/Buttons/NewTiddler/Hint}}"
        },
        "$:/config/ShortcutInfo/picture": {
            "title": "$:/config/ShortcutInfo/picture",
            "text": "{{$:/language/Buttons/Picture/Hint}}"
        },
        "$:/config/ShortcutInfo/preview": {
            "title": "$:/config/ShortcutInfo/preview",
            "text": "{{$:/language/Buttons/Preview/Hint}}"
        },
        "$:/config/ShortcutInfo/quote": {
            "title": "$:/config/ShortcutInfo/quote",
            "text": "{{$:/language/Buttons/Quote/Hint}}"
        },
        "$:/config/ShortcutInfo/save-tiddler": {
            "title": "$:/config/ShortcutInfo/save-tiddler",
            "text": "{{$:/language/Buttons/Save/Hint}}"
        },
        "$:/config/ShortcutInfo/save-wiki": {
            "title": "$:/config/ShortcutInfo/save-wiki",
            "text": "{{$:/language/Buttons/SaveWiki/Hint}}"
        },
        "$:/config/ShortcutInfo/sidebar-search": {
            "title": "$:/config/ShortcutInfo/sidebar-search",
            "text": "{{$:/language/Buttons/SidebarSearch/Hint}}"
        },
        "$:/config/ShortcutInfo/stamp": {
            "title": "$:/config/ShortcutInfo/stamp",
            "text": "{{$:/language/Buttons/Stamp/Hint}}"
        },
        "$:/config/ShortcutInfo/strikethrough": {
            "title": "$:/config/ShortcutInfo/strikethrough",
            "text": "{{$:/language/Buttons/Strikethrough/Hint}}"
        },
        "$:/config/ShortcutInfo/subscript": {
            "title": "$:/config/ShortcutInfo/subscript",
            "text": "{{$:/language/Buttons/Subscript/Hint}}"
        },
        "$:/config/ShortcutInfo/superscript": {
            "title": "$:/config/ShortcutInfo/superscript",
            "text": "{{$:/language/Buttons/Superscript/Hint}}"
        },
        "$:/config/ShortcutInfo/toggle-sidebar": {
            "title": "$:/config/ShortcutInfo/toggle-sidebar",
            "text": "{{$:/language/Buttons/ToggleSidebar/Hint}}"
        },
        "$:/config/ShortcutInfo/transcludify": {
            "title": "$:/config/ShortcutInfo/transcludify",
            "text": "{{$:/language/Buttons/Transcludify/Hint}}"
        },
        "$:/config/ShortcutInfo/underline": {
            "title": "$:/config/ShortcutInfo/underline",
            "text": "{{$:/language/Buttons/Underline/Hint}}"
        },
        "$:/config/SwitcherTargets/layout": {
            "title": "$:/config/SwitcherTargets/layout",
            "text": "$:/snippets/LayoutSwitcher"
        },
        "$:/config/SwitcherTargets/language": {
            "title": "$:/config/SwitcherTargets/language",
            "text": "$:/snippets/languageswitcher"
        },
        "$:/config/SwitcherTargets/palette": {
            "title": "$:/config/SwitcherTargets/palette",
            "text": "$:/core/ui/ControlPanel/Palette"
        },
        "$:/config/SwitcherTargets/theme": {
            "title": "$:/config/SwitcherTargets/theme",
            "text": "$:/core/ui/ControlPanel/Theme"
        },
        "$:/config/SyncFilter": {
            "title": "$:/config/SyncFilter",
            "text": "[is[tiddler]] -[[$:/core]] -[[$:/library/sjcl.js]] -[prefix[$:/boot/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n"
        },
        "$:/config/SyncSystemTiddlersFromServer": {
            "title": "$:/config/SyncSystemTiddlersFromServer",
            "text": "no"
        },
        "$:/config/Tags/MinLength": {
            "title": "$:/config/Tags/MinLength",
            "text": "0"
        },
        "$:/config/TextEditor/EditorHeight/Height": {
            "title": "$:/config/TextEditor/EditorHeight/Height",
            "text": "400px"
        },
        "$:/config/TextEditor/EditorHeight/Mode": {
            "title": "$:/config/TextEditor/EditorHeight/Mode",
            "text": "auto"
        },
        "$:/config/TiddlerInfo/Default": {
            "title": "$:/config/TiddlerInfo/Default",
            "text": "$:/core/ui/TiddlerInfo/Fields"
        },
        "$:/config/TiddlerInfo/Mode": {
            "title": "$:/config/TiddlerInfo/Mode",
            "text": "popup"
        },
        "$:/config/Tiddlers/TitleLinks": {
            "title": "$:/config/Tiddlers/TitleLinks",
            "text": "no"
        },
        "$:/config/Toolbar/ButtonClass": {
            "title": "$:/config/Toolbar/ButtonClass",
            "text": "tc-btn-invisible"
        },
        "$:/config/Toolbar/Icons": {
            "title": "$:/config/Toolbar/Icons",
            "text": "yes"
        },
        "$:/config/Toolbar/Text": {
            "title": "$:/config/Toolbar/Text",
            "text": "no"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions",
            "text": "show"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar",
            "text": "hide"
        },
        "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others": {
            "title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others",
            "text": "hide"
        },
        "$:/config/shortcuts-mac/bold": {
            "title": "$:/config/shortcuts-mac/bold",
            "text": "meta-B"
        },
        "$:/config/shortcuts-mac/input-tab-left": {
            "title": "$:/config/shortcuts-mac/input-tab-left",
            "text": "ctrl-Left"
        },
        "$:/config/shortcuts-mac/input-tab-right": {
            "title": "$:/config/shortcuts-mac/input-tab-right",
            "text": "ctrl-Right"
        },
        "$:/config/shortcuts-mac/italic": {
            "title": "$:/config/shortcuts-mac/italic",
            "text": "meta-I"
        },
        "$:/config/shortcuts-mac/underline": {
            "title": "$:/config/shortcuts-mac/underline",
            "text": "meta-U"
        },
        "$:/config/shortcuts-mac/new-image": {
            "title": "$:/config/shortcuts-mac/new-image",
            "text": "ctrl-I"
        },
        "$:/config/shortcuts-mac/new-journal": {
            "title": "$:/config/shortcuts-mac/new-journal",
            "text": "ctrl-J"
        },
        "$:/config/shortcuts-mac/new-tiddler": {
            "title": "$:/config/shortcuts-mac/new-tiddler",
            "text": "ctrl-N"
        },
        "$:/config/shortcuts-mac/save-wiki": {
            "title": "$:/config/shortcuts-mac/save-wiki",
            "text": "meta-S"
        },
        "$:/config/shortcuts-not-mac/bold": {
            "title": "$:/config/shortcuts-not-mac/bold",
            "text": "ctrl-B"
        },
        "$:/config/shortcuts-not-mac/italic": {
            "title": "$:/config/shortcuts-not-mac/italic",
            "text": "ctrl-I"
        },
        "$:/config/shortcuts-not-mac/underline": {
            "title": "$:/config/shortcuts-not-mac/underline",
            "text": "ctrl-U"
        },
        "$:/config/shortcuts-not-mac/new-image": {
            "title": "$:/config/shortcuts-not-mac/new-image",
            "text": "alt-I"
        },
        "$:/config/shortcuts-not-mac/new-journal": {
            "title": "$:/config/shortcuts-not-mac/new-journal",
            "text": "alt-J"
        },
        "$:/config/shortcuts-not-mac/new-tiddler": {
            "title": "$:/config/shortcuts-not-mac/new-tiddler",
            "text": "alt-N"
        },
        "$:/config/shortcuts/add-field": {
            "title": "$:/config/shortcuts/add-field",
            "text": "enter"
        },
        "$:/config/shortcuts/advanced-search": {
            "title": "$:/config/shortcuts/advanced-search",
            "text": "ctrl-shift-A"
        },
        "$:/config/shortcuts/advanced-search-sidebar": {
            "title": "$:/config/shortcuts/advanced-search-sidebar",
            "text": "alt-Enter"
        },
        "$:/config/shortcuts/cancel-edit-tiddler": {
            "title": "$:/config/shortcuts/cancel-edit-tiddler",
            "text": "escape"
        },
        "$:/config/shortcuts/change-sidebar-layout": {
            "title": "$:/config/shortcuts/change-sidebar-layout",
            "text": "shift-alt-Down"
        },
        "$:/config/shortcuts/delete-field": {
            "title": "$:/config/shortcuts/delete-field",
            "text": "shift-alt-D"
        },
        "$:/config/shortcuts/excise": {
            "title": "$:/config/shortcuts/excise",
            "text": "ctrl-E"
        },
        "$:/config/shortcuts/sidebar-search": {
            "title": "$:/config/shortcuts/sidebar-search",
            "text": "ctrl-shift-F"
        },
        "$:/config/shortcuts/heading-1": {
            "title": "$:/config/shortcuts/heading-1",
            "text": "ctrl-1"
        },
        "$:/config/shortcuts/heading-2": {
            "title": "$:/config/shortcuts/heading-2",
            "text": "ctrl-2"
        },
        "$:/config/shortcuts/heading-3": {
            "title": "$:/config/shortcuts/heading-3",
            "text": "ctrl-3"
        },
        "$:/config/shortcuts/heading-4": {
            "title": "$:/config/shortcuts/heading-4",
            "text": "ctrl-4"
        },
        "$:/config/shortcuts/heading-5": {
            "title": "$:/config/shortcuts/heading-5",
            "text": "ctrl-5"
        },
        "$:/config/shortcuts/heading-6": {
            "title": "$:/config/shortcuts/heading-6",
            "text": "ctrl-6"
        },
        "$:/config/shortcuts/input-accept": {
            "title": "$:/config/shortcuts/input-accept",
            "text": "Enter"
        },
        "$:/config/shortcuts/input-accept-variant": {
            "title": "$:/config/shortcuts/input-accept-variant",
            "text": "ctrl-Enter"
        },
        "$:/config/shortcuts/input-cancel": {
            "title": "$:/config/shortcuts/input-cancel",
            "text": "Escape"
        },
        "$:/config/shortcuts/input-down": {
            "title": "$:/config/shortcuts/input-down",
            "text": "Down"
        },
        "$:/config/shortcuts/input-tab-left": {
            "title": "$:/config/shortcuts/input-tab-left",
            "text": "alt-Left"
        },
        "$:/config/shortcuts/input-tab-right": {
            "title": "$:/config/shortcuts/input-tab-right",
            "text": "alt-Right"
        },
        "$:/config/shortcuts/input-up": {
            "title": "$:/config/shortcuts/input-up",
            "text": "Up"
        },
        "$:/config/shortcuts/layout-switcher": {
            "title": "$:/config/shortcuts/layout-switcher",
            "text": "ctrl-shift-L"
        },
        "$:/config/shortcuts/link": {
            "title": "$:/config/shortcuts/link",
            "text": "ctrl-L"
        },
        "$:/config/shortcuts/linkify": {
            "title": "$:/config/shortcuts/linkify",
            "text": "alt-shift-L"
        },
        "$:/config/shortcuts/list-bullet": {
            "title": "$:/config/shortcuts/list-bullet",
            "text": "ctrl-shift-L"
        },
        "$:/config/shortcuts/list-number": {
            "title": "$:/config/shortcuts/list-number",
            "text": "ctrl-shift-N"
        },
        "$:/config/shortcuts/mono-block": {
            "title": "$:/config/shortcuts/mono-block",
            "text": "ctrl-shift-M"
        },
        "$:/config/shortcuts/mono-line": {
            "title": "$:/config/shortcuts/mono-line",
            "text": "ctrl-M"
        },
        "$:/config/shortcuts/picture": {
            "title": "$:/config/shortcuts/picture",
            "text": "ctrl-shift-I"
        },
        "$:/config/shortcuts/preview": {
            "title": "$:/config/shortcuts/preview",
            "text": "alt-P"
        },
        "$:/config/shortcuts/quote": {
            "title": "$:/config/shortcuts/quote",
            "text": "ctrl-Q"
        },
        "$:/config/shortcuts/save-tiddler": {
            "title": "$:/config/shortcuts/save-tiddler",
            "text": "ctrl+enter"
        },
        "$:/config/shortcuts/save-wiki": {
            "title": "$:/config/shortcuts/save-wiki",
            "text": "ctrl-S"
        },
        "$:/config/shortcuts/stamp": {
            "title": "$:/config/shortcuts/stamp",
            "text": "ctrl-S"
        },
        "$:/config/shortcuts/strikethrough": {
            "title": "$:/config/shortcuts/strikethrough",
            "text": "ctrl-T"
        },
        "$:/config/shortcuts/subscript": {
            "title": "$:/config/shortcuts/subscript",
            "text": "ctrl-shift-B"
        },
        "$:/config/shortcuts/superscript": {
            "title": "$:/config/shortcuts/superscript",
            "text": "ctrl-shift-P"
        },
        "$:/config/shortcuts/toggle-sidebar": {
            "title": "$:/config/shortcuts/toggle-sidebar",
            "text": "alt-shift-S"
        },
        "$:/config/shortcuts/transcludify": {
            "title": "$:/config/shortcuts/transcludify",
            "text": "alt-shift-T"
        },
        "$:/config/ui/EditTemplate": {
            "title": "$:/config/ui/EditTemplate",
            "text": "$:/core/ui/EditTemplate"
        },
        "$:/config/ui/ViewTemplate": {
            "title": "$:/config/ui/ViewTemplate",
            "text": "$:/core/ui/ViewTemplate"
        },
        "$:/config/WikiParserRules/Inline/wikilink": {
            "title": "$:/config/WikiParserRules/Inline/wikilink",
            "text": "enable"
        },
        "$:/snippets/currpalettepreview": {
            "title": "$:/snippets/currpalettepreview",
            "text": "\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch-inner()\n<$set name=\"swatchColour\" value={{##$(colourResolved)$}}>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall=<<swatchColour>>/>\"\"\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n\\end\n\\define swatch()\n<$set name=\"swatchColour\" value={{##$(colour)$}}>\n<$set name=\"swatchTitle\" value=<<colour>>>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall=<<swatchColour>>/>\"\"\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n</$set>\n\\end\n<div class=\"tc-swatches-horiz\"><$list filter=\"\nforeground\nbackground\nmuted-foreground\nprimary\npage-background\ntab-background\ntiddler-info-background\n\" variable=\"colour\"><<swatch>></$list></div>\n"
        },
        "$:/snippets/download-wiki-button": {
            "title": "$:/snippets/download-wiki-button",
            "text": "\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" filename=\"index.html\"/>\n<<lingo Full/Caption>> {{$:/core/images/save-button}}\n</$button>"
        },
        "$:/language": {
            "title": "$:/language",
            "text": "$:/languages/en-GB"
        },
        "$:/snippets/languageswitcher": {
            "title": "$:/snippets/languageswitcher",
            "text": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n\n<$linkcatcher to=\"$:/language\">\n<div class=\"tc-chooser tc-language-chooser\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/language}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link>\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value=<<currentTiddler>>>\n<$transclude subtiddler=<<flag-title>>>\n<$list filter=\"[all[current]field:title[$:/languages/en-GB]]\">\n<$transclude tiddler=\"$:/languages/en-GB/icon\"/>\n</$list>\n</$transclude>\n</$set>\n</span>\n<$view field=\"description\">\n<$view field=\"name\">\n<$view field=\"title\"/>\n</$view>\n</$view>\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
        },
        "$:/core/macros/CSS": {
            "title": "$:/core/macros/CSS",
            "tags": "$:/tags/Macro",
            "text": "\\define colour(name)\n<$transclude tiddler={{$:/palette}} index=\"$name$\"><$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\"><$transclude tiddler=\"$:/config/DefaultColourMappings/$name$\"/></$transclude></$transclude>\n\\end\n\n\\define color(name)\n<<colour $name$>>\n\\end\n\n\\define box-shadow(shadow)\n``\n  -webkit-box-shadow: $shadow$;\n     -moz-box-shadow: $shadow$;\n          box-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n  -webkit-filter: $filter$;\n     -moz-filter: $filter$;\n          filter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n  -webkit-transition: $transition$;\n     -moz-transition: $transition$;\n          transition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n  -webkit-transform-origin: $origin$;\n     -moz-transform-origin: $origin$;\n          transform-origin: $origin$;\n``\n\\end\n\n\\define background-linear-gradient(gradient)\n``\nbackground-image: linear-gradient($gradient$);\nbackground-image: -o-linear-gradient($gradient$);\nbackground-image: -moz-linear-gradient($gradient$);\nbackground-image: -webkit-linear-gradient($gradient$);\nbackground-image: -ms-linear-gradient($gradient$);\n``\n\\end\n\n\\define column-count(columns)\n``\n-moz-column-count: $columns$;\n-webkit-column-count: $columns$;\ncolumn-count: $columns$;\n``\n\\end\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}} _canonical_uri={{$title$!!_canonical_uri}}/>\n\\end\n\n\\define if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-background-attachment(text)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" type=\"nomatch\" text=\"\">$text$</$reveal>\n\\end\n"
        },
        "$:/core/macros/colour-picker": {
            "title": "$:/core/macros/colour-picker",
            "tags": "$:/tags/Macro",
            "text": "\\define colour-picker-update-recent()\n<$action-listops\n\t$tiddler=\"$:/config/ColourPicker/Recent\"\n\t$subfilter=\"$(colour-picker-value)$ [list[$:/config/ColourPicker/Recent]remove[$(colour-picker-value)$]] +[limit[8]]\"\n/>\n\\end\n\n\\define colour-picker-inner(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(colour-picker-value)$\"\"\">\n\n$(colour-picker-update-recent)$\n\n$actions$\n\n<span style=\"display:inline-block; background-color: $(colour-picker-value)$; width: 100%; height: 100%; border-radius: 50%;\"/>\n\n</$button>\n\\end\n\n\\define colour-picker-recent-inner(actions)\n<$set name=\"colour-picker-value\" value=\"$(recentColour)$\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\\end\n\n\\define colour-picker-recent(actions)\n{{$:/language/ColourPicker/Recent}} <$list filter=\"[list[$:/config/ColourPicker/Recent]]\" variable=\"recentColour\">\n<$macrocall $name=\"colour-picker-recent-inner\" actions=\"\"\"$actions$\"\"\"/></$list>\n\\end\n\n\\define colour-picker(actions)\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker-recent\" actions=\"\"\"$actions$\"\"\"/>\n\n---\n\n<$list filter=\"LightPink Pink Crimson LavenderBlush PaleVioletRed HotPink DeepPink MediumVioletRed Orchid Thistle Plum Violet Magenta Fuchsia DarkMagenta Purple MediumOrchid DarkViolet DarkOrchid Indigo BlueViolet MediumPurple MediumSlateBlue SlateBlue DarkSlateBlue Lavender GhostWhite Blue MediumBlue MidnightBlue DarkBlue Navy RoyalBlue CornflowerBlue LightSteelBlue LightSlateGrey SlateGrey DodgerBlue AliceBlue SteelBlue LightSkyBlue SkyBlue DeepSkyBlue LightBlue PowderBlue CadetBlue Azure LightCyan PaleTurquoise Cyan Aqua DarkTurquoise DarkSlateGrey DarkCyan Teal MediumTurquoise LightSeaGreen Turquoise Aquamarine MediumAquamarine MediumSpringGreen MintCream SpringGreen MediumSeaGreen SeaGreen Honeydew LightGreen PaleGreen DarkSeaGreen LimeGreen Lime ForestGreen Green DarkGreen Chartreuse LawnGreen GreenYellow DarkOliveGreen YellowGreen OliveDrab Beige LightGoldenrodYellow Ivory LightYellow Yellow Olive DarkKhaki LemonChiffon PaleGoldenrod Khaki Gold Cornsilk Goldenrod DarkGoldenrod FloralWhite OldLace Wheat Moccasin Orange PapayaWhip BlanchedAlmond NavajoWhite AntiqueWhite Tan BurlyWood Bisque DarkOrange Linen Peru PeachPuff SandyBrown Chocolate SaddleBrown Seashell Sienna LightSalmon Coral OrangeRed DarkSalmon Tomato MistyRose Salmon Snow LightCoral RosyBrown IndianRed Red Brown FireBrick DarkRed Maroon White WhiteSmoke Gainsboro LightGrey Silver DarkGrey Grey DimGrey Black\" variable=\"colour-picker-value\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\n---\n\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" tag=\"input\" default=\"\" placeholder=\"\"/>\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" type=\"color\" tag=\"input\"/>\n<$set name=\"colour-picker-value\" value={{$:/config/ColourPicker/New}}>\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\n</div>\n\n\\end\n"
        },
        "$:/core/macros/copy-to-clipboard": {
            "title": "$:/core/macros/copy-to-clipboard",
            "tags": "$:/tags/Macro",
            "text": "\\define copy-to-clipboard(src,class:\"tc-btn-invisible\",style)\n<$button class=<<__class__>> style=<<__style__>> message=\"tm-copy-to-clipboard\" param=<<__src__>> tooltip={{$:/language/Buttons/CopyToClipboard/Hint}}>\n{{$:/core/images/copy-clipboard}} <$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>\n</$button>\n\\end\n\n\\define copy-to-clipboard-above-right(src,class:\"tc-btn-invisible\",style)\n<div style=\"position: relative;\">\n<div style=\"position: absolute; bottom: 0; right: 0;\">\n<$macrocall $name=\"copy-to-clipboard\" src=<<__src__>> class=<<__class__>> style=<<__style__>>/>\n</div>\n</div>\n\\end\n\n"
        },
        "$:/core/macros/diff": {
            "title": "$:/core/macros/diff",
            "tags": "$:/tags/Macro",
            "text": "\\define compareTiddlerText(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle)\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>>>\n<$diff-text source=<<source>> dest=<<dest>>/>\n</$set>\n</$set>\n\\end\n\n\\define compareTiddlers(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle,exclude)\n<table class=\"tc-diff-tiddlers\">\n<tbody>\n<$set name=\"sourceFields\" filter=\"[<__sourceTiddlerTitle__>fields[]sort[]]\">\n<$set name=\"destFields\" filter=\"[<__destSubTiddlerTitle__>subtiddlerfields<__destTiddlerTitle__>sort[]]\">\n<$list filter=\"[enlist<sourceFields>] [enlist<destFields>] -[enlist<__exclude__>] +[sort[]]\" variable=\"fieldName\">\n<tr>\n<th>\n<$text text=<<fieldName>>/> \n</th>\n<td>\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>> field=<<fieldName>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>> field=<<fieldName>>>\n<$diff-text source=<<source>> dest=<<dest>>>\n</$diff-text>\n</$set>\n</$set>\n</td>\n</tr>\n</$list>\n</$set>\n</$set>\n</tbody>\n</table>\n\\end\n"
        },
        "$:/core/macros/dumpvariables": {
            "title": "$:/core/macros/dumpvariables",
            "tags": "$:/tags/Macro",
            "text": "\\define dumpvariables()\n<ul>\n<$list filter=\"[variables[]]\" variable=\"varname\">\n<li>\n<strong><code><$text text=<<varname>>/></code></strong>:<br/>\n<$codeblock code={{{ [<varname>getvariable[]] }}}/>\n</li>\n</$list>\n</ul>\n\\end\n"
        },
        "$:/core/macros/export": {
            "title": "$:/core/macros/export",
            "tags": "$:/tags/Macro",
            "text": "\\define exportButtonFilename(baseFilename)\n$baseFilename$$(extension)$\n\\end\n\n\\define exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n<span class=\"tc-popup-keep\"><$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$lingoBase$Caption}}/></span>\n</$list>\n</$button></span><$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$set name=\"count\" value={{{ [subfilter<__exportFilter__>count[]] }}}>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$list filter=\"[<currentTiddler>has[condition]subfilter{!!condition}limit[1]] ~[<currentTiddler>!has[condition]then[true]]\" variable=\"ignore\">\n<$set name=\"extension\" value={{!!extension}}>\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=<<__exportFilter__>> filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$list>\n</$list>\n</$set>\n</div>\n</$reveal>\n\\end\n"
        },
        "$:/core/macros/image-picker": {
            "title": "$:/core/macros/image-picker",
            "created": "20170715180840889",
            "modified": "20170715180914005",
            "tags": "$:/tags/Macro",
            "type": "text/vnd.tiddlywiki",
            "text": "\\define image-picker-thumbnail(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(imageTitle)$\"\"\">\n$actions$\n<$transclude tiddler=<<imageTitle>>/>\n</$button>\n\\end\n\n\\define image-picker-list(filter,actions)\n<$list filter=\"\"\"$filter$\"\"\" variable=\"imageTitle\">\n<$macrocall $name=\"image-picker-thumbnail\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\\end\n\n\\define image-picker(actions,filter:\"[all[shadows+tiddlers]is[image]] -[type[application/pdf]] +[!has[draft.of]$subfilter$sort[title]]\",subfilter:\"\")\n<div class=\"tc-image-chooser\">\n<$vars state-system=<<qualify \"$:/state/image-picker/system\">>>\n<$checkbox tiddler=<<state-system>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"hide\">\n{{$:/language/SystemTiddlers/Include/Prompt}}\n</$checkbox>\n<$reveal state=<<state-system>> type=\"match\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$ +[!is[system]]\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n<$reveal state=<<state-system>> type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n</$vars>\n</div>\n\\end\n\n\\define image-picker-include-tagged-images(actions)\n<$macrocall $name=\"image-picker\" filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[!has[draft.of]sort[title]]\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n"
        },
        "$:/core/macros/keyboard-driven-input": {
            "title": "$:/core/macros/keyboard-driven-input",
            "tags": "$:/tags/Macro",
            "text": "\\define change-input-tab(stateTitle,tag,beforeafter,defaultState,actions)\n<$set name=\"tabsList\" filter=\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]]\">\n<$vars currentState={{{ [<__stateTitle__>!is[missing]get[text]] ~[<__defaultState__>] }}} firstTab={{{ [enlist<tabsList>nth[1]] }}} lastTab={{{ [enlist<tabsList>last[]] }}}>\n<$set name=\"nextTab\" value={{{ [all[shadows+tiddlers]tag<__tag__>!has[draft.of]$beforeafter$<currentState>] ~[[$beforeafter$]removeprefix[after]suffix[]addprefix<firstTab>] ~[[$beforeafter$]removeprefix[before]suffix[]addprefix<lastTab>] }}}>\n<$action-setfield $tiddler=<<__stateTitle__>> text=<<nextTab>>/>\n$actions$\n</$set>\n</$vars>\n</$set>\n\\end\n\n\\define keyboard-input-actions()\n<$list filter=\"[<__index__>match[]]\">\n<$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>get<__field__>] }}}/>\n</$list>\n<$list filter=\"[<__index__>!match[]]\">\n<$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>getindex<__index__>] }}}/>\n</$list>\n\\end\n\n\\define input-next-actions-inner()\n<$list filter=\"[<nextItem>minlength[1]]\" variable=\"ignore\">\n<$action-setfield $tiddler=<<__selectionStateTitle__>> text=<<nextItem>>/>\n<$list filter=\"[<__index__>match[]]\">\n<$action-setfield $tiddler=<<__tiddler__>> $field=<<__field__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/>\n</$list>\n<$list filter=\"[<__index__>!match[]]\">\n<$action-setfield $tiddler=<<__tiddler__>> $index=<<__index__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/>\n</$list>\n<$action-setfield $tiddler=<<__refreshTitle__>> text=\"yes\"/>\n</$list>\n\\end\n\n\\define input-next-actions(afterOrBefore:\"after\",reverse:\"\")\n<$list filter=\"[<__storeTitle__>get[text]minlength<__filterMinLength__>] [<__filterMinLength__>match[0]] +[limit[1]]\" variable=\"ignore\">\n<$vars userInput={{{ [<__storeTitle__>get[text]] }}} selectedItem={{{ [<__selectionStateTitle__>get[text]] }}}>\n<$set name=\"configTiddler\" value={{{ [subfilter<__configTiddlerFilter__>] }}}>\n<$vars primaryListFilter={{{ [<configTiddler>get<__firstSearchFilterField__>] }}} secondaryListFilter={{{ [<configTiddler>get<__secondSearchFilterField__>] }}}>\n<$set name=\"filteredList\" filter=\"[subfilter<primaryListFilter>addsuffix[-primaryList]] =[subfilter<secondaryListFilter>addsuffix[-secondaryList]]\">\n<$vars nextItem={{{ [enlist<filteredList>$afterOrBefore$<selectedItem>] ~[enlist<filteredList>$reverse$nth[1]] }}} firstItem={{{ [enlist<filteredList>nth[1]] }}} lastItem={{{ [enlist<filteredList>last[]] }}}>\n<$list filter=\"[<selectedItem>match<firstItem>!match<lastItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [[$afterOrBefore$]match[before]then<userInput>addsuffix[-userInput]] ~[<nextItem>] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>match<lastItem>!match<firstItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [[$afterOrBefore$]match[after]then<userInput>addsuffix[-userInput]] ~[<nextItem>] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>match<firstItem>match<lastItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [<userInput>addsuffix[-userInput]] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>!match<firstItem>!match<lastItem>]\" variable=\"ignore\">\n<<input-next-actions-inner>>\n</$list>\n</$vars>\n</$set>\n</$vars>\n</$set>\n</$vars>\n</$list>\n\\end\n\n\\define keyboard-driven-input(tiddler,storeTitle,field:\"text\",index:\"\",tag:\"input\",type,focus:\"\",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:\"\",default:\"\",class,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:\"0\",refreshTitle,selectionStateTitle,cancelPopups:\"\",configTiddlerFilter,firstSearchFilterField:\"first-search-filter\",secondSearchFilterField:\"second-search-filter\")\n\\whitespace trim\n<$keyboard key=\"((input-accept))\" actions=<<__inputAcceptActions__>>>\n<$keyboard key=\"((input-accept-variant))\" actions=<<__inputAcceptVariantActions__>>>\n<$keyboard key=\"((input-up))\" actions=<<input-next-actions \"before\" \"reverse[]\">>>\n<$keyboard key=\"((input-down))\" actions=<<input-next-actions>>>\n<$keyboard key=\"((input-cancel))\" actions=<<__inputCancelActions__>>>\n<$edit-text tiddler=<<__tiddler__>> field=<<__field__>> index=<<__index__>> \n\t\tinputActions=<<keyboard-input-actions>> tag=<<__tag__>> class=<<__class__>> \n\t\tplaceholder=<<__placeholder__>> default=<<__default__>> focusPopup=<<__focusPopup__>> \n\t\tfocus=<<__focus__>> type=<<__type__>> rows=<<__rows__>> minHeight=<<__minHeight__>> \n\t\ttabindex=<<__tabindex__>> size=<<__size__>> autoHeight=<<__autoHeight__>> \n\t\trefreshTitle=<<__refreshTitle__>> cancelPopups=<<__cancelPopups__>>/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n\\end\n"
        },
        "$:/core/macros/lingo": {
            "title": "$:/core/macros/lingo",
            "tags": "$:/tags/Macro",
            "text": "\\define lingo-base()\n$:/language/\n\\end\n\n\\define lingo(title)\n{{$(lingo-base)$$title$}}\n\\end\n"
        },
        "$:/core/macros/list": {
            "title": "$:/core/macros/list",
            "tags": "$:/tags/Macro",
            "text": "\\define list-links(filter,type:\"ul\",subtype:\"li\",class:\"\",emptyMessage)\n\\whitespace trim\n<$type$ class=\"$class$\">\n<$list filter=\"$filter$\" emptyMessage=<<__emptyMessage__>>>\n<$subtype$>\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$subtype$>\n</$list>\n</$type$>\n\\end\n\n\\define list-links-draggable-drop-actions()\n<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define list-links-draggable(tiddler,field:\"list\",type:\"ul\",subtype:\"li\",class:\"\",itemTemplate)\n\\whitespace trim\n<span class=\"tc-links-draggable-list\">\n<$vars targetTiddler=\"\"\"$tiddler$\"\"\" targetField=\"\"\"$field$\"\"\">\n<$type$ class=\"$class$\">\n<$list filter=\"[list[$tiddler$!!$field$]]\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"\"\"$subtype$\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\"/>\n<div>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$transclude>\n</div>\n</$droppable>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"div\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\">\n{{$:/core/images/blank}}\n</div>\n<div style=\"height:0.5em;\"/>\n</$droppable>\n</$tiddler>\n</$type$>\n</$vars>\n</span>\n\\end\n\n\\define list-tagged-draggable-drop-actions(tag)\n<!-- Save the current ordering of the tiddlers with this tag -->\n<$set name=\"order\" filter=\"[<__tag__>tagging[]]\">\n<!-- Remove any list-after or list-before fields from the tiddlers with this tag -->\n<$list filter=\"[<__tag__>tagging[]]\">\n<$action-deletefield $field=\"list-before\"/>\n<$action-deletefield $field=\"list-after\"/>\n</$list>\n<!-- Save the new order to the Tag Tiddler -->\n<$action-listops $tiddler=<<__tag__>> $field=\"list\" $filter=\"+[enlist<order>] +[insertbefore:currentTiddler<actionTiddler>]\"/>\n<!-- Make sure the newly added item has the right tag -->\n<!-- Removing this line makes dragging tags within the dropdown work as intended -->\n<!--<$action-listops $tiddler=<<actionTiddler>> $tags=<<__tag__>>/>-->\n<!-- Using the following 5 lines as replacement makes dragging titles from outside into the dropdown apply the tag -->\n<$list filter=\"[<actionTiddler>!contains:tags<__tag__>]\">\n<$fieldmangler tiddler=<<actionTiddler>>>\n<$action-sendmessage $message=\"tm-add-tag\" $param=<<__tag__>>/>\n</$fieldmangler>\n</$list>\n</$set>\n\\end\n\n\\define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:\"div\",storyview:\"\")\n\\whitespace trim\n<span class=\"tc-tagged-draggable-list\">\n<$set name=\"tag\" value=<<__tag__>>>\n<$list filter=\"[<__tag__>tagging[]$subFilter$]\" emptyMessage=<<__emptyMessage__>> storyview=<<__storyview__>>>\n<$elementTag$ class=\"tc-menu-list-item\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</$transclude>\n</$elementTag$>\n</$droppable>\n</$elementTag$>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$ style=\"height:0.5em;\">\n</$elementTag$>\n</$droppable>\n</$tiddler>\n</$set>\n</span>\n\\end\n"
        },
        "$:/core/macros/tabs": {
            "title": "$:/core/macros/tabs",
            "tags": "$:/tags/Macro",
            "text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template,buttonTemplate,retain,actions,explicitState)\n<$set name=\"qualifiedState\" value=<<qualify \"$state$\">>>\n<$vars tabsState={{{ [<__explicitState__>minlength[1]] ~[<qualifiedState>] }}}>\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\" storyview=\"pop\"><$set name=\"save-currentTiddler\" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<tabsState>> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\" tooltip={{!!tooltip}}>\n<$tiddler tiddler=<<save-currentTiddler>>>\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude tiddler=\"$buttonTemplate$\" mode=\"inline\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$transclude>\n</$set></$tiddler>$actions$</$button></$tiddler></$set></$list>\n</div>\n<div class=\"tc-tab-divider $class$\"/>\n<div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<tabsState>> text=<<currentTab>> default=\"$default$\" retain=\"\"\"$retain$\"\"\">\n\n<$transclude tiddler=\"$template$\" mode=\"block\">\n\n<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\n</$transclude>\n\n</$reveal>\n\n</$list>\n</div>\n</div>\n</$vars>\n</$set>\n\\end\n"
        },
        "$:/core/macros/tag-picker": {
            "title": "$:/core/macros/tag-picker",
            "tags": "$:/tags/Macro",
            "first-search-filter": "[tags[]!is[system]search:title<userInput>sort[]]",
            "second-search-filter": "[tags[]is[system]search:title<userInput>sort[]]",
            "text": "\\define get-tagpicker-focus-selector() [data-tiddler-title=\"$(currentTiddlerCSSEscaped)$\"] .tc-add-tag-name input\n\n\\define delete-tag-state-tiddlers() <$action-deletetiddler $filter=\"[<newTagNameTiddler>] [<storeTitle>] [<tagSelectionState>]\"/>\n\n\\define add-tag-actions(actions,tagField:\"tags\")\n<$set name=\"tag\" value={{{ [<__tiddler__>get[text]] }}}>\n<$list filter=\"[<saveTiddler>!contains:$tagField$<tag>!match[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"-[<tag>]\"/>\n\"\"\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"[<tag>]\"/>\n$actions$\n</$list>\n</$set>\n<<delete-tag-state-tiddlers>>\n<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n\\end\n\n\\define clear-tags-actions-inner()\n<$list filter=\"[<storeTitle>has[text]] [<newTagNameTiddler>has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\">\n<<delete-tag-state-tiddlers>>\n</$list>\n\\end\n\n\\define clear-tags-actions()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<newTagNameTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<<clear-tags-actions-inner>>\"\"\">\n<$action-setfield $tiddler=<<newTagNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define tag-picker-inner(actions,tagField:\"tags\")\n\\whitespace trim\n<$vars newTagNameInputTiddlerQualified=<<qualify \"$:/temp/NewTagName/input\">> newTagNameSelectionTiddlerQualified=<<qualify \"$:/temp/NewTagName/selected-item\">> fallbackTarget={{$(palette)$##tag-background}} colourA={{$(palette)$##foreground}} colourB={{$(palette)$##background}}>\n<$vars storeTitle={{{ [<newTagNameInputTiddler>!match[]] ~[<newTagNameInputTiddlerQualified>] }}} tagSelectionState={{{ [<newTagNameSelectionTiddler>!match[]] ~[<newTagNameSelectionTiddlerQualified>] }}}>\n<$vars refreshTitle=<<qualify \"$:/temp/NewTagName/refresh\">> nonSystemTagsFilter=\"[tags[]!is[system]search:title<userInput>sort[]]\" systemTagsFilter=\"[tags[]is[system]search:title<userInput>sort[]]\">\n<div class=\"tc-edit-add-tag\">\n<div>\n<span class=\"tc-add-tag-name tc-small-gap-right\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<newTagNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>\n\t\tselectionStateTitle=<<tagSelectionState>> inputAcceptActions=\"\"\"<$macrocall $name=\"add-tag-actions\" actions=<<__actions__>> tagField=<<__tagField__>>/>\"\"\"\n\t\tinputCancelActions=<<clear-tags-actions>> tag=\"input\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}}\n\t\tfocusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex=<<tabIndex>> \n\t\tfocus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} filterMinLength={{$:/config/Tags/MinLength}} \n\t\tcancelPopups=<<cancelPopups>> configTiddlerFilter=\"[[$:/core/macros/tag-picker]]\"/>\n</span><$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$reveal state=<<storeTitle>> type=\"nomatch\" text=\"\"><$button class=\"tc-btn-invisible tc-small-gap tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/ClearInput/Hint}} aria-label={{$:/language/EditTemplate/Tags/ClearInput/Caption}}>{{$:/core/images/close-button}}<<delete-tag-state-tiddlers>></$button></$reveal><span class=\"tc-add-tag-button tc-small-gap-left\">\n<$set name=\"tag\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$button set=<<newTagNameTiddler>> setTo=\"\" class=\"\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"[<tag>]\"/>\n$actions$\n<$set name=\"currentTiddlerCSSEscaped\" value={{{ [<saveTiddler>escapecss[]] }}}>\n<<delete-tag-state-tiddlers>><$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-tagpicker-focus-selector>>/>\n</$set>\n{{$:/language/EditTemplate/Tags/Add/Button}}\n</$button>\n</$set>\n</span>\n</div>\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-block-tags-dropdown\">\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=<<nonSystemTagsFilter>> variable=\"tag\">\n<$list filter=\"[<tag>addsuffix[-primaryList]] -[<tagSelectionState>get[text]]\" emptyMessage=\"\"\"<$vars button-classes=\"tc-btn-invisible tc-tag-button-selected\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\"\"\">\n<$vars button-classes=\"tc-btn-invisible\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\n</$list>\n</$list></$list>\n<hr>\n<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=<<systemTagsFilter>> variable=\"tag\">\n<$list filter=\"[<tag>addsuffix[-secondaryList]] -[<tagSelectionState>get[text]]\" emptyMessage=\"\"\"<$vars button-classes=\"tc-btn-invisible tc-tag-button-selected\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\"\"\">\n<$vars button-classes=\"tc-btn-invisible\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\n</$list>\n</$list></$list>\n</$set>\n</div>\n</$reveal>\n</div>\n</div>\n</$vars>\n</$vars>\n</$vars>\n\\end\n\\define tag-picker(actions,tagField:\"tags\")\n\\whitespace trim\n<$vars saveTiddler=<<currentTiddler>> palette={{$:/palette}}>\n<$list filter=\"[<newTagNameTiddler>match[]]\" emptyMessage=\"\"\"<$macrocall $name=\"tag-picker-inner\" actions=<<__actions__>> tagField=<<__tagField__>>/>\"\"\">\n<$set name=\"newTagNameTiddler\" value=<<qualify \"$:/temp/NewTagName\">>>\n<$macrocall $name=\"tag-picker-inner\" actions=<<__actions__>> tagField=<<__tagField__>>/>\n</$set>\n</$list>\n</$vars>\n\\end\n"
        },
        "$:/core/macros/tag": {
            "title": "$:/core/macros/tag",
            "tags": "$:/tags/Macro",
            "text": "\\define tag-pill-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<$element-tag$ $element-attributes$ class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n$actions$<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view tiddler=<<__tag__>> field=\"title\" format=\"text\" />\n</$element-tag$>\n</$vars>\n\\end\n\n\\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)\n<$macrocall $name=\"tag-pill-inner\" tag=<<__tag__>> icon=\"\"\"$icon$\"\"\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n\n\\define tag-pill(tag,element-tag:\"span\",element-attributes:\"\",actions:\"\")\n<span class=\"tc-tag-list-item\">\n<$macrocall $name=\"tag-pill-body\" tag=<<__tag__>> icon={{{ [<__tag__>get[icon]] }}} colour={{{ [<__tag__>get[color]] }}} palette={{$:/palette}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</span>\n\\end\n\n\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n"
        },
        "$:/core/macros/thumbnails": {
            "title": "$:/core/macros/thumbnails",
            "tags": "$:/tags/Macro",
            "text": "\\define thumbnail(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<$link to=\"\"\"$link$\"\"\"><div class=\"tc-thumbnail-wrapper\">\n<div class=\"tc-thumbnail-image\" style=\"width:$width$px;height:$height$px;\"><$reveal type=\"nomatch\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" style=\"width:$width$px;height:$height$px;\">\n[img[$image$]]\n</$reveal><$reveal type=\"match\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" class=\"tc-thumbnail-background\" style=\"width:$width$px;height:$height$px;background-color:$background-color$;\"></$reveal></div><div class=\"tc-thumbnail-icon\" style=\"fill:$color$;color:$color$;\">\n$icon$\n</div><div class=\"tc-thumbnail-caption\">\n$caption$\n</div>\n</div></$link>\n\\end\n\n\\define thumbnail-right(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<div class=\"tc-thumbnail-right-wrapper\"><<thumbnail \"\"\"$link$\"\"\" \"\"\"$icon$\"\"\" \"\"\"$color$\"\"\" \"\"\"$background-color$\"\"\" \"\"\"$image$\"\"\" \"\"\"$caption$\"\"\" \"\"\"$width$\"\"\" \"\"\"$height$\"\"\">></div>\n\\end\n\n\\define list-thumbnails(filter,width:\"280\",height:\"157\")\n<$list filter=\"\"\"$filter$\"\"\"><$macrocall $name=\"thumbnail\" link={{!!link}} icon={{!!icon}} color={{!!color}} background-color={{!!background-color}} image={{!!image}} caption={{!!caption}} width=\"\"\"$width$\"\"\" height=\"\"\"$height$\"\"\"/></$list>\n\\end\n"
        },
        "$:/core/macros/timeline": {
            "title": "$:/core/macros/timeline",
            "created": "20141212105914482",
            "modified": "20141212110330815",
            "tags": "$:/tags/Macro",
            "text": "\\define timeline-title()\n\\whitespace trim\n<!-- Override this macro with a global macro \n     of the same name if you need to change \n     how titles are displayed on the timeline \n     -->\n<$view field=\"title\"/>\n\\end\n\\define timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n<div class=\"tc-timeline\">\n<$list filter=\"[!is[system]$subfilter$has[$dateField$]!sort[$dateField$]limit[$limit$]eachday[$dateField$]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"$dateField$\" format=\"date\" template=\"$format$\"/>\n<$list filter=\"[sameday:$dateField${!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><<timeline-title>></$link>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n\\end\n"
        },
        "$:/core/macros/toc": {
            "title": "$:/core/macros/toc",
            "tags": "$:/tags/Macro",
            "text": "\\define toc-caption()\n<$set name=\"tv-wikilinks\" value=\"no\">\n  <$transclude field=\"caption\">\n    <$view field=\"title\"/>\n  </$transclude>\n</$set>\n\\end\n\n\\define toc-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<ol class=\"tc-toc\">\n  <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n    <$vars item=<<currentTiddler>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n      <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n        <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n          <li class=<<toc-item-class>>>\n            <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}><$view field='caption'><$view field='title'/></$view></$link>\">\n              <<toc-caption>>\n            </$list>\n            <$macrocall $name=\"toc-body\" tag=<<item>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n          </li>\n        </$set>\n      </$set>\n    </$vars>\n  </$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter:\"\")\n<$macrocall $name=\"toc-body\"  tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> />\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n    <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n      <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/right-arrow}}\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/down-arrow}}\n        </$button>\n      </$reveal>\n      <<toc-caption>>\n    </$link>\n    <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n      <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n    </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n      <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/right-arrow}}\n          <<toc-caption>>\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n          {{$:/core/images/down-arrow}}\n          <<toc-caption>>\n        </$button>\n      </$reveal>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-expandable-empty-message()\n<$macrocall $name=\"toc-linked-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter:\"\",exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n  <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n    <ol class=\"tc-toc toc-expandable\">\n      <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n        <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=<<toc-expandable-empty-message>> >\n          <$macrocall $name=\"toc-unlinked-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"\"\"itemClassFilter\"\"\" exclude=<<excluded>> path=<<path>> />\n        </$list>\n      </$list>\n    </ol>\n  </$set>\n</$vars>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\" >\n    <li class=<<toc-item-class>>>\n      <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n          <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n          <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n            <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n              {{$:/core/images/right-arrow}}\n            </$button>\n          </$reveal>\n          <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n            <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n              {{$:/core/images/down-arrow}}\n            </$button>\n          </$reveal>\n        </$list>\n        <<toc-caption>>\n      </$link>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n  <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n    <li class=<<toc-item-class>>>\n      <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>\">\n        <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n          <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n            {{$:/core/images/right-arrow}}\n            <<toc-caption>>\n          </$button>\n        </$reveal>\n        <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n          <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n            {{$:/core/images/down-arrow}}\n            <<toc-caption>>\n          </$button>\n        </$reveal>\n      </$list>\n      <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n        <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n      </$reveal>\n    </li>\n  </$set>\n</$qualify>\n\\end\n\n\\define toc-selective-expandable-empty-message()\n<$macrocall $name=\"toc-linked-selective-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter,exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n  <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n    <ol class=\"tc-toc toc-selective-expandable\">\n      <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n        <$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=<<toc-selective-expandable-empty-message>> >\n          <$macrocall $name=\"toc-unlinked-selective-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n        </$list>\n      </$list>\n    </ol>\n  </$set>\n</$vars>\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$tiddler tiddler={{{ [<__selectedTiddler__>get[text]] }}}>\n  <div class=\"tc-tabbed-table-of-contents\">\n    <$linkcatcher to=<<__selectedTiddler__>>>\n      <div class=\"tc-table-of-contents\">\n        <$macrocall $name=\"toc-selective-expandable\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"[all[current]] -[<__selectedTiddler__>get[text]]\"/>\n      </div>\n    </$linkcatcher>\n    <div class=\"tc-tabbed-table-of-contents-content\">\n      <$reveal stateTitle=<<__selectedTiddler__>> type=\"nomatch\" text=\"\">\n        <$transclude mode=\"block\" tiddler=<<__template__>>>\n          <h1><<toc-caption>></h1>\n          <$transclude mode=\"block\">$missingText$</$transclude>\n        </$transclude>\n      </$reveal>\n      <$reveal stateTitle=<<__selectedTiddler__>> type=\"match\" text=\"\">\n        $unselectedText$\n      </$reveal>\n    </div>\n  </div>\n</$tiddler>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$linkcatcher to=<<__selectedTiddler__>>>\n  <$macrocall $name=\"toc-tabbed-external-nav\" tag=<<__tag__>> sort=<<__sort__>> selectedTiddler=<<__selectedTiddler__>> unselectedText=<<__unselectedText__>> missingText=<<__missingText__>> template=<<__template__>>/>\n</$linkcatcher>\n\\end\n\n"
        },
        "$:/core/macros/translink": {
            "title": "$:/core/macros/translink",
            "tags": "$:/tags/Macro",
            "text": "\\define translink(title,mode:\"block\")\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: black; foreground; white;\">\n<$link to=\"\"\"$title$\"\"\">\n<$text text=\"\"\"$title$\"\"\"/>\n</$link>\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: white; foreground; black;\">\n<$transclude tiddler=\"\"\"$title$\"\"\" mode=\"$mode$\">\n\"<$text text=\"\"\"$title$\"\"\"/>\" is missing\n</$transclude>\n</div>\n</div>\n\\end\n"
        },
        "$:/core/macros/tree": {
            "title": "$:/core/macros/tree",
            "tags": "$:/tags/Macro",
            "text": "\\define leaf-link(full-title,chunk,separator: \"/\")\n<$link to=<<__full-title__>>><$text text=<<__chunk__>>/></$link>\n\\end\n\n\\define leaf-node(prefix,chunk)\n<li>\n<$list filter=\"[<__prefix__>addsuffix<__chunk__>is[shadow]] [<__prefix__>addsuffix<__chunk__>is[tiddler]]\" variable=\"full-title\">\n<$list filter=\"[<full-title>removeprefix<__prefix__>]\" variable=\"chunk\">\n<span>{{$:/core/images/file}}</span> <$macrocall $name=\"leaf-link\" full-title=<<full-title>> chunk=<<chunk>>/>\n</$list>\n</$list>\n</li>\n\\end\n\n\\define branch-node(prefix,chunk,separator: \"/\")\n<li>\n<$set name=\"reveal-state\" value={{{ [[$:/state/tree/]addsuffix<__prefix__>addsuffix<__chunk__>] }}}>\n<$reveal type=\"nomatch\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"show\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"hide\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<span>(<$count filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>removeprefix<__chunk__>] -[<__prefix__>addsuffix<__chunk__>]\"/>)</span>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$macrocall $name=\"tree-node\" prefix={{{ [<__prefix__>addsuffix<__chunk__>] }}} separator=<<__separator__>>/>\n</$reveal>\n</$set>\n</li>\n\\end\n\n\\define tree-node(prefix,separator: \"/\")\n<ol>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]!suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"leaf-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"branch-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n</ol>\n\\end\n\n\\define tree(prefix: \"$:/\",separator: \"/\")\n<div class=\"tc-tree\">\n<span><$text text=<<__prefix__>>/></span>\n<div>\n<$macrocall $name=\"tree-node\" prefix=<<__prefix__>> separator=<<__separator__>>/>\n</div>\n</div>\n\\end\n"
        },
        "$:/core/macros/utils": {
            "title": "$:/core/macros/utils",
            "text": "\\define colour(colour)\n$colour$\n\\end\n"
        },
        "$:/snippets/minifocusswitcher": {
            "title": "$:/snippets/minifocusswitcher",
            "text": "<$select tiddler=\"$:/config/AutoFocus\">\n<$list filter=\"title tags text type fields\">\n<option value=<<currentTiddler>>><<currentTiddler>></option>\n</$list>\n</$select>\n"
        },
        "$:/snippets/minilanguageswitcher": {
            "title": "$:/snippets/minilanguageswitcher",
            "text": "<$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"
        },
        "$:/snippets/minithemeswitcher": {
            "title": "$:/snippets/minithemeswitcher",
            "text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$select tiddler=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"name\"><$view field=\"title\"/></$view></option>\n</$list>\n</$select>"
        },
        "$:/snippets/modules": {
            "title": "$:/snippets/modules",
            "text": "\\define describeModuleType(type)\n{{$:/language/Docs/ModuleTypes/$type$}}\n\\end\n<$list filter=\"[moduletypes[]]\">\n\n!! <$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n\n<$macrocall $name=\"describeModuleType\" type=<<currentTiddler>>/>\n\n<ul><$list filter=\"[all[current]modules[]]\"><li><$link><<currentTiddler>></$link>\n</li>\n</$list>\n</ul>\n</$list>\n"
        },
        "$:/palette": {
            "title": "$:/palette",
            "text": "$:/palettes/Vanilla"
        },
        "$:/snippets/paletteeditor": {
            "title": "$:/snippets/paletteeditor",
            "text": "<$transclude tiddler=\"$:/PaletteManager\"/>\n"
        },
        "$:/snippets/palettepreview": {
            "title": "$:/snippets/palettepreview",
            "text": "<$set name=\"currentTiddler\" value={{$:/palette}}>\n{{||$:/snippets/currpalettepreview}}\n</$set>\n"
        },
        "$:/snippets/paletteswitcher": {
            "title": "$:/snippets/paletteswitcher",
            "text": "<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]\"><$set name=\"cls\" filter=\"[all[current]prefix{$:/palette}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' - <$view field=\"description\" format=\"text\"/>{{||$:/snippets/currpalettepreview}}</$link>\n</div></$set>\n</$list>\n</div>\n</$linkcatcher>\n"
        },
        "$:/snippets/peek-stylesheets": {
            "title": "$:/snippets/peek-stylesheets",
            "text": "\\define expandable-stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$vars state=<<qualify \"$:/state/peek-stylesheets/open/\">>>\n<$set name=\"state\" value={{{ [<state>addsuffix<currentTiddler>] }}}>\n<li>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"no\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"yes\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"div\">\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</$reveal>\n</li>\n</$set>\n</$vars>\n</$list>\n</ol>\n\\end\n\n\\define stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<li>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</li>\n</$list>\n</ol>\n\\end\n\n<$vars modeState=<<qualify \"$:/state/peek-stylesheets/mode/\">>>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"expanded\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Stylesheets/Expand/Caption}}</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"restored\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}} {{$:/language/ControlPanel/Stylesheets/Restore/Caption}}</$button>\n</$reveal>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<expandable-stylesheets-list>>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<stylesheets-list>>\n</$reveal>\n\n</$vars>\n"
        },
        "$:/temp/search": {
            "title": "$:/temp/search",
            "text": ""
        },
        "$:/tags/AdvancedSearch": {
            "title": "$:/tags/AdvancedSearch",
            "list": "[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]"
        },
        "$:/tags/AdvancedSearch/FilterButton": {
            "title": "$:/tags/AdvancedSearch/FilterButton",
            "list": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown $:/core/ui/AdvancedSearch/Filter/FilterButtons/clear $:/core/ui/AdvancedSearch/Filter/FilterButtons/export $:/core/ui/AdvancedSearch/Filter/FilterButtons/delete"
        },
        "$:/tags/ControlPanel": {
            "title": "$:/tags/ControlPanel",
            "list": "$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals"
        },
        "$:/tags/ControlPanel/Info": {
            "title": "$:/tags/ControlPanel/Info",
            "list": "$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced"
        },
        "$:/tags/ControlPanel/Plugins": {
            "title": "$:/tags/ControlPanel/Plugins",
            "list": "[[$:/core/ui/ControlPanel/Plugins/Installed]] [[$:/core/ui/ControlPanel/Plugins/Add]]"
        },
        "$:/tags/EditTemplate": {
            "title": "$:/tags/EditTemplate",
            "list": "[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]"
        },
        "$:/tags/EditToolbar": {
            "title": "$:/tags/EditToolbar",
            "list": "[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]"
        },
        "$:/tags/EditorToolbar": {
            "title": "$:/tags/EditorToolbar",
            "list": "$:/core/ui/EditorToolbar/paint $:/core/ui/EditorToolbar/opacity $:/core/ui/EditorToolbar/line-width $:/core/ui/EditorToolbar/rotate-left $:/core/ui/EditorToolbar/clear $:/core/ui/EditorToolbar/bold $:/core/ui/EditorToolbar/italic $:/core/ui/EditorToolbar/strikethrough $:/core/ui/EditorToolbar/underline $:/core/ui/EditorToolbar/superscript $:/core/ui/EditorToolbar/subscript $:/core/ui/EditorToolbar/mono-line $:/core/ui/EditorToolbar/mono-block $:/core/ui/EditorToolbar/quote $:/core/ui/EditorToolbar/list-bullet $:/core/ui/EditorToolbar/list-number $:/core/ui/EditorToolbar/heading-1 $:/core/ui/EditorToolbar/heading-2 $:/core/ui/EditorToolbar/heading-3 $:/core/ui/EditorToolbar/heading-4 $:/core/ui/EditorToolbar/heading-5 $:/core/ui/EditorToolbar/heading-6 $:/core/ui/EditorToolbar/link $:/core/ui/EditorToolbar/excise $:/core/ui/EditorToolbar/picture $:/core/ui/EditorToolbar/stamp $:/core/ui/EditorToolbar/size $:/core/ui/EditorToolbar/editor-height $:/core/ui/EditorToolbar/more $:/core/ui/EditorToolbar/preview $:/core/ui/EditorToolbar/preview-type"
        },
        "$:/tags/Manager/ItemMain": {
            "title": "$:/tags/Manager/ItemMain",
            "list": "$:/Manager/ItemMain/WikifiedText $:/Manager/ItemMain/RawText $:/Manager/ItemMain/Fields"
        },
        "$:/tags/Manager/ItemSidebar": {
            "title": "$:/tags/Manager/ItemSidebar",
            "list": "$:/Manager/ItemSidebar/Tags $:/Manager/ItemSidebar/Colour $:/Manager/ItemSidebar/Icon $:/Manager/ItemSidebar/Tools"
        },
        "$:/tags/MoreSideBar": {
            "title": "$:/tags/MoreSideBar",
            "list": "[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]] [[$:/core/ui/MoreSideBar/Explorer]] [[$:/core/ui/MoreSideBar/Plugins]]",
            "text": ""
        },
        "$:/tags/PageControls": {
            "title": "$:/tags/PageControls",
            "list": "[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/fold-all]] [[$:/core/ui/Buttons/unfold-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/new-image]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/manager]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/palette]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/timestamp]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/print]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]"
        },
        "$:/tags/PageTemplate": {
            "title": "$:/tags/PageTemplate",
            "list": "[[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]] [[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]]",
            "text": ""
        },
        "$:/tags/PluginLibrary": {
            "title": "$:/tags/PluginLibrary",
            "list": "$:/config/OfficialPluginLibrary"
        },
        "$:/tags/SideBar": {
            "title": "$:/tags/SideBar",
            "list": "[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]",
            "text": ""
        },
        "$:/tags/SideBarSegment": {
            "title": "$:/tags/SideBarSegment",
            "list": "[[$:/core/ui/SideBarSegments/site-title]] [[$:/core/ui/SideBarSegments/site-subtitle]] [[$:/core/ui/SideBarSegments/page-controls]] [[$:/core/ui/SideBarSegments/search]] [[$:/core/ui/SideBarSegments/tabs]]"
        },
        "$:/tags/TiddlerInfo": {
            "title": "$:/tags/TiddlerInfo",
            "list": "[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]",
            "text": ""
        },
        "$:/tags/TiddlerInfo/Advanced": {
            "title": "$:/tags/TiddlerInfo/Advanced",
            "list": "[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]"
        },
        "$:/tags/ViewTemplate": {
            "title": "$:/tags/ViewTemplate",
            "list": "[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/unfold]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]]"
        },
        "$:/tags/ViewToolbar": {
            "title": "$:/tags/ViewToolbar",
            "list": "[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/open-window]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]] [[$:/core/ui/Buttons/fold-others]] [[$:/core/ui/Buttons/fold]]"
        },
        "$:/snippets/themeswitcher": {
            "title": "$:/snippets/themeswitcher",
            "text": "<$linkcatcher to=\"$:/theme\">\n<div class=\"tc-chooser\"><$list filter=\"[plugin-type[theme]sort[title]]\"><$set name=\"cls\" filter=\"[all[current]field:title{$:/theme}] [[$:/theme]!has[text]addsuffix[s/tiddlywiki/vanilla]field:title<currentTiddler>] +[limit[1]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' <$view field=\"description\" format=\"text\"/></$link></div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
        },
        "$:/core/wiki/title": {
            "title": "$:/core/wiki/title",
            "text": "{{$:/SiteTitle}} --- {{$:/SiteSubtitle}}"
        },
        "$:/view": {
            "title": "$:/view",
            "text": "classic"
        },
        "$:/snippets/viewswitcher": {
            "title": "$:/snippets/viewswitcher",
            "text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<$linkcatcher to=\"$:/view\">\n<div class=\"tc-chooser tc-viewswitcher\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$set name=\"cls\" filter=\"[<storyview>prefix{$:/view}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link to=<<storyview>>><$transclude tiddler=<<icon>>/><$text text=<<storyview>>/></$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
        }
    }
}
<$button message="tm-close-tiddler" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>>
<$list filter="[<tv-config-toolbar-icons>prefix[yes]]">
{{$:/core/images/close-button}}
</$list>
<$list filter="[<tv-config-toolbar-text>prefix[yes]]">
<span class="tc-btn-text"><$text text={{$:/language/Buttons/Close/Caption}}/></span>
</$list>
<$action-navigate $to={{{ [list[$:/StoryList!!list]before<currentTiddler>] }}}/>
</$button>
<$button message="tm-delete-tiddler" tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>
<$list filter="[<tv-config-toolbar-icons>prefix[yes]]">
{{$:/core/images/delete-button}}
</$list>
<$list filter="[<tv-config-toolbar-text>prefix[yes]]">
<span class="tc-btn-text"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>
</$list>
<$action-navigate $to={{{ [list[$:/StoryList!!list]before<currentTiddler>] }}}/>
</$button>
\define containerClasses()
tc-page-container tc-page-view-$(themeTitle)$ tc-language-$(languageTitle)$
\end

<$importvariables filter="[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]">

<$set name="tv-config-toolbar-icons" value={{$:/config/Toolbar/Icons}}>

<$set name="tv-config-toolbar-text" value={{$:/config/Toolbar/Text}}>

<$set name="tv-config-toolbar-class" value={{$:/config/Toolbar/ButtonClass}}>

<$set name="themeTitle" value={{$:/view}}>

<$set name="currentTiddler" value={{$:/language}}>

<$set name="languageTitle" value={{!!name}}>

<$set name="currentTiddler" value="">

<div class=<<containerClasses>>>

<$navigator story="$:/StoryList" history="$:/HistoryList" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}}>

<$dropzone>

<$list filter="[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]" variable="listItem">

<$transclude tiddler=<<listItem>>/>

</$list>

</$dropzone>

</$navigator>

</div>

</$set>

</$set>

</$set>

</$set>

</$set>

</$set>

</$set>

</$importvariables>
{{$:/SiteTitle}}
[[科判]]
GuangHaiMingYue
/lamrim/
pshiue/TiddlyWiki5
pshiue@gmail.com
The following tiddlers were imported:

# [[$:_stylesheettaglist]]
# [[$:/.bj/templates/TagControlTemplate]]
# [[$:/bj/typestemplate/EditTemplate/body]]
# [[$:/build]]
# [[$:/config/AnimationDuration]]
# [[$:/config/EditorTypeMappings/application/json]]
# [[$:/config/EditorTypeMappings/application/pdf]]
# [[$:/config/EditorTypeMappings/text/html]]
# [[$:/config/EditorTypeMappings/text/vnd.twbase;flexibility=htmlp]]
# [[$:/config/EditorTypeMappings/text/x-perimental]]
# [[$:/config/EditTemplateTypeMappings/test]]
# [[$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal]]
# [[$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview]]
# [[$:/config/Plugins/Disabled/$:/plugins/bj/small/mdplusdemo]]
# [[$:/config/Plugins/Disabled/$:/plugins/bj/visualeditor]]
# [[$:/config/Tiddlers/TitleLinks]]
# [[$:/config/topStoryView]]
# [[$:/config/ViewTemplateTypeMappings/test]]
# [[$:/config/ViewTemplateTypeMappings/text/x-readonly]]
# [[$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone]]
# [[$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here]]
# [[$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here]]
# [[$:/config/ViewToolbarButtons/Visibility/$:/plugins/TWaddle/SideEditor/Button]]
# [[$:/config/WikiParserRules/Inline/wikilink]]
# [[$:/core/ui/Buttons/close]]
# [[$:/core/ui/Buttons/delete]]
# [[$:/core/ui/PageTemplate]]
# [[$:/core/wiki/title]]
# [[$:/DefaultTiddlers]]
# [[$:/isEncrypted]]
# [[$:/palette]]
# [[$:/palettes/Twilight]]
# [[$:/plugin/bj/visualeditor/includelib]]
# [[$:/plugins/bj/drag-and-drop]]
# [[$:/plugins/bj/flexitype]]
# [[$:/plugins/bj/jsoneditor]]
# [[$:/plugins/bj/markdownlike]]
# [[$:/plugins/bj/plugins/marked]]
# [[$:/plugins/bj/storytabs]]
# [[$:/plugins/bj/tiddlyclip]]
# [[$:/plugins/bj/typestemplate]]
# [[$:/plugins/bj/visualeditor]]
# [[$:/Setup/newts]]
# [[$:/ShowEditPreview]]
# [[$:/SiteStylesheet]]
# [[$:/SiteSubtitle]]
# [[$:/SiteTitle]]
# [[$:/status/IsAnonymous]]
# [[$:/status/IsLoggedIn]]
# [[$:/status/IsReadOnly]]
# [[$:/status/RequireReloadDueToPluginChange]]
# [[$:/status/UserName]]
# [[$:/theme]]
# [[$:/themes/nico/notebook]]
# [[$:/themes/tiddlywiki/vanilla/metrics/storyright]]
# [[$:/themes/tiddlywiki/vanilla/metrics/storywidth]]
# [[$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth]]
# [[$:/UploadName]]
# [[$:/view]]
# [[0001講]]
# [[0002講]]
# [[0003講]]
# [[0004講]]
# [[0005講]]
# [[0006講]]
# [[0007講]]
# [[0008講]]
# [[0009講]]
# [[0010講]]
# [[0011講]]
# [[0012講]]
# [[0013講]]
# [[0014講]]
# [[0015講]]
# [[0016講]]
# [[0017講]]
# [[0018講]]
# [[39A19:17]]
# [[39B07:54]]
# [[40A02:05]]
# [[一 正明其境]]
# [[一 趣入聖教最勝之門淨修歸依]]
# [[一由依何事為歸依因]]
# [[二 一切善樂所有根本發深忍信]]
# [[二由依彼故所歸之境]]
# [[二應歸依此之因相]]
# [[三 由何道理而正歸依]]
# [[四 既歸依已所學次第]]
# [[念死無常 三根本九因相三決斷]]
# [[科判]]
# [[第一講]]
# [[第二習近後世安樂方便]]
# [[廣海明月]]
# [[廣海明月 0019 講 - 全廣第二輪]]
# [[廣海明月 0020 講 - 全廣第二輪]]
# [[廣海明月 0021 講 - 全廣第二輪]]
# [[廣海明月 0022 講 - 全廣第二輪]]
# [[廣海明月 0023 講 - 全廣第二輪]]
# [[廣海明月 0024 講 - 全廣第二輪]]
# [[廣海明月 0025 講 - 全廣第二輪]]
# [[廣海明月 0026 講 - 全廣第二輪]]
# [[廣海明月 0027 講 - 全廣第二輪]]
# [[廣海明月 0028 講 - 全廣第二輪]]
# [[廣海明月 0029 講 - 全廣第二輪]]
# [[廣海明月 0030 講 - 全廣第二輪]]
# [[廣海明月 0031 講 - 全廣第二輪]]
# [[廣海明月 0032 講 - 全廣第二輪]]
# [[廣海明月 0033 講 - 全廣第二輪]]
# [[廣海明月 0034 講 - 全廣第二輪]]
# [[廣海明月 0035 講 - 全廣第二輪]]
# [[廣海明月 0036 講 - 全廣第二輪]]
# [[廣海明月 0037 講 - 全廣第二輪]]
# [[廣海明月 0038 講 - 全廣第二輪]]
# [[廣海明月 0039 講 - 全廣第二輪]]
# [[廣海明月 0040 講 - 全廣第二輪]]
# [[廣海明月 0041 講 - 全廣第二輪]]
# [[廣海明月 0042 講 - 全廣第二輪]]
# [[廣海明月 0043 講 - 全廣第二輪]]
# [[廣海明月 0044 講 - 全廣第二輪]]
# [[廣海明月 0045 講 - 全廣第二輪]]
# [[廣海明月 0046 講 - 全廣第二輪]]
# [[廣海明月 0047 講 - 全廣第二輪]]
# [[廣海明月 0048 講 - 全廣第二輪]]
# [[廣海明月 0049 講 - 全廣第二輪]]
# [[廣海明月 0050 講 - 全廣第二輪]]
# [[廣海明月 0051 講 - 全廣第二輪]]
# [[廣海明月 0052 講 - 全廣第二輪]]
# [[廣海明月 0053 講 - 全廣第二輪]]
# [[廣海明月 0054 講 - 全廣第二輪]]
# [[廣海明月 0055 講 - 全廣第二輪]]
# [[廣海明月 0056 講 - 全廣第二輪]]
# [[廣海明月 0057 講 - 全廣第二輪]]
# [[廣海明月 0058 講 - 全廣第二輪]]
# [[廣海明月 0059 講 - 全廣第二輪]]
# [[廣海明月 0060 講 - 全廣第二輪]]
# [[廣海明月 0061 講 - 全廣第二輪]]
# [[廣海明月 0062 講 - 全廣第二輪]]
# [[廣海明月 0063 講 - 全廣第二輪]]
# [[廣海明月 0064 講 - 全廣第二輪]]
# [[廣海明月 0065 講 - 全廣第二輪]]
# [[廣海明月 0066 講 - 全廣第二輪]]
# [[廣海明月 0067 講 - 全廣第二輪]]
# [[廣海明月 0068 講 - 全廣第二輪]]
# [[廣海明月 0069 講 - 全廣第二輪]]
# [[廣海明月 0070 講 - 全廣第二輪]]
# [[廣海明月 0071 講 - 全廣第二輪]]
# [[廣海明月 0072 講 - 全廣第二輪]]
# [[廣海明月 0073 講 - 全廣第二輪]]
# [[廣海明月 0074 講 - 全廣第二輪]]
# [[廣海明月 0075 講 - 全廣第二輪]]
# [[廣海明月 0076 講 - 全廣第二輪]]
# [[廣海明月 0077 講 - 全廣第二輪]]
# [[廣海明月 0078 講 - 全廣第二輪]]
# [[廣海明月 0079 講 - 全廣第二輪]]
# [[廣海明月 0080 講 - 全廣第二輪]]
# [[廣海明月 0081 講 - 全廣第二輪]]
# [[廣海明月 0082 講 - 全廣第二輪]]
# [[廣海明月 0083 講 - 全廣第二輪]]
# [[廣海明月 0084 講 - 全廣第二輪]]
# [[廣海明月 0085 講 - 全廣第二輪]]
# [[廣海明月 0086 講 - 全廣第二輪]]
# [[廣海明月 0087 講 - 全廣第二輪]]
# [[廣海明月 0088 講 - 全廣第二輪]]
# [[廣海明月 0089 講 - 全廣第二輪]]
# [[廣海明月 0090 講 - 全廣第二輪]]
# [[廣海明月 0091 講 - 全廣第二輪]]
# [[廣海明月 0092 講 - 全廣第二輪]]
# [[廣海明月 0093 講 - 全廣第二輪]]
# [[廣海明月 0094 講 - 全廣第二輪]]
# [[廣海明月 0095 講 - 全廣第二輪]]
# [[廣海明月 0096 講 - 全廣第二輪]]
# [[廣海明月 0097 講 - 全廣第二輪]]
# [[廣海明月 0098 講 - 全廣第二輪]]
# [[廣海明月 0099 講 - 全廣第二輪]]
# [[廣海明月 0100 講 - 全廣第二輪]]
# [[廣海明月 0101 講 - 全廣第二輪]]
# [[廣海明月 0102 講 - 全廣第二輪]]
# [[廣海明月 0103 講 - 全廣第二輪]]
# [[廣海明月 0104 講 - 全廣第二輪]]
# [[廣海明月 0105 講 - 全廣第二輪]]
# [[廣海明月 0106 講 - 全廣第二輪]]
# [[廣海明月 0107 講 - 全廣第二輪]]
# [[廣海明月 0108 講 - 全廣第二輪]]
# [[廣海明月 0109 講 - 全廣第二輪]]
# [[廣海明月 0110 講 - 全廣第二輪]]
# [[廣海明月 0111 講 - 全廣第二輪]]
# [[廣海明月 0112 講 - 全廣第二輪]]
# [[廣海明月 0113 講 - 全廣第二輪]]
# [[廣海明月 0114 講 - 全廣第二輪]]
# [[廣海明月 0115 講 - 全廣第二輪]]
# [[廣海明月 0116 講 - 全廣第二輪]]
# [[廣海明月 0117 講 - 全廣第二輪]]
# [[廣海明月 0118 講 - 全廣第二輪]]
# [[廣海明月 0119 講 - 全廣第二輪]]
# [[廣海明月 0120 講 - 全廣第二輪]]
# [[廣海明月 0121 講 - 全廣第二輪]]
# [[廣海明月 0122 講 - 全廣第二輪]]
# [[廣海明月 0123 講 - 全廣第二輪]]
# [[廣海明月 0124 講 - 全廣第二輪]]
# [[廣海明月 0125 講 - 全廣第二輪]]
# [[廣海明月 0126 講 - 全廣第二輪]]
# [[廣海明月 0127 講 - 全廣第二輪]]
# [[廣海明月 0128 講 - 全廣第二輪]]
# [[廣海明月 0129 講 - 全廣第二輪]]
# [[廣海明月 0130 講 - 全廣第二輪]]
# [[廣海明月 0131 講 - 全廣第二輪]]
# [[廣海明月 0132 講 - 全廣第二輪]]
# [[廣海明月 0133 講 - 全廣第二輪]]
# [[廣海明月 0134 講 - 全廣第二輪]]
# [[廣海明月 0135 講 - 全廣第二輪]]
# [[廣海明月 0136 講 - 全廣第二輪]]
# [[廣海明月 0137 講 - 全廣第二輪]]
# [[廣海明月 0138 講 - 全廣第二輪]]
# [[廣海明月 0139 講 - 全廣第二輪]]
# [[廣海明月 0140 講 - 全廣第二輪]]
# [[廣海明月 0141 講 - 全廣第二輪]]
# [[廣海明月 0142 講 - 全廣第二輪]]
# [[廣海明月 0143 講 - 全廣第二輪]]
# [[廣海明月 0144 講 - 全廣第二輪]]
# [[廣海明月 0145 講 - 全廣第二輪]]
# [[廣海明月 0146 講 - 全廣第二輪]]
# [[廣海明月 0147 講 - 全廣第二輪]]
# [[廣海明月 0148 講 - 全廣第二輪]]
# [[廣海明月 0149 講 - 全廣第二輪]]
# [[廣海明月 0150 講 - 全廣第二輪]]
# [[廣海明月 0151 講 - 全廣第二輪]]
# [[廣海明月 0152 講 - 全廣第二輪]]
# [[廣海明月 0153 講 - 全廣第二輪]]
# [[廣海明月 0154 講 - 全廣第二輪]]
# [[廣海明月 0155 講 - 全廣第二輪]]
# [[廣海明月 0156 講 - 全廣第二輪]]
# [[廣海明月 0157 講 - 全廣第二輪]]
# [[廣海明月 0158 講 - 全廣第二輪]]
# [[廣海明月 0159 講 - 全廣第二輪]]
# [[廣海明月 0160 講 - 全廣第二輪]]
# [[廣海明月 0161 講 - 全廣第二輪]]
# [[廣海明月 0162 講 - 全廣第二輪]]
# [[廣海明月 0163 講 - 全廣第二輪]]
# [[廣海明月 0164 講 - 全廣第二輪]]
# [[廣海明月 0165 講 - 全廣第二輪]]
# [[廣海明月 0166 講 - 全廣第二輪]]
# [[廣海明月 0167 講 - 全廣第二輪]]
# [[廣海明月 0168 講 - 全廣第二輪]]
# [[廣海明月 0169 講 - 全廣第二輪]]
# [[廣海明月 0170 講 - 全廣第二輪]]
# [[廣海明月 0171 講 - 全廣第二輪]]
# [[廣海明月 0172 講 - 全廣第二輪]]
# [[廣海明月 0173 講 - 全廣第二輪]]
# [[廣海明月 0174 講 - 全廣第二輪]]
# [[廣海明月 0175 講 - 全廣第二輪]]
# [[廣海明月 0176 講 - 全廣第二輪]]
# [[廣海明月 0177 講 - 全廣第二輪]]
# [[廣海明月 0178 講 - 全廣第二輪]]
# [[廣海明月 0179 講 - 全廣第二輪]]
# [[廣海明月 0180 講 - 全廣第二輪]]
# [[廣海明月 0181 講 - 全廣第二輪]]
# [[廣海明月 0182 講 - 全廣第二輪]]
# [[廣海明月 0183 講 - 全廣第二輪]]
# [[廣海明月 0184 講 - 全廣第二輪]]
# [[廣海明月 0185 講 - 全廣第二輪]]
# [[廣海明月 0186 講 - 全廣第二輪]]
# [[廣海明月 0187 講 - 全廣第二輪]]
# [[廣海明月 0188 講 - 全廣第二輪]]
# [[廣海明月 0189 講 - 全廣第二輪]]
# [[廣海明月 0190 講 - 全廣第二輪]]
# [[廣海明月 0191 講 - 全廣第二輪]]
# [[廣海明月 0192 講 - 全廣第二輪]]
# [[廣海明月 0193 講 - 全廣第二輪]]
# [[廣海明月 0194 講 - 全廣第二輪]]
# [[廣海明月 0195 講 - 全廣第二輪]]
# [[廣海明月 0196 講 - 全廣第二輪]]
# [[廣海明月 0197 講 - 全廣第二輪]]
# [[廣海明月 0198 講 - 全廣第二輪]]
# [[廣海明月 0199 講 - 全廣第二輪]]
# [[廣海明月 0200 講 - 全廣第二輪]]
# [[廣海明月 0201 講 - 全廣第二輪]]
# [[廣海明月 0202 講 - 全廣第二輪]]
# [[廣海明月 0203 講 - 全廣第二輪]]
# [[廣海明月 0204 講 - 全廣第二輪]]
# [[廣海明月 0205 講 - 全廣第二輪]]
# [[廣海明月 0206 講 - 全廣第二輪]]
# [[廣海明月 0207 講 - 全廣第二輪]]
# [[廣海明月 0208 講 - 全廣第二輪]]
# [[廣海明月 0209 講 - 全廣第二輪]]
# [[廣海明月 0210 講 - 全廣第二輪]]
# [[廣海明月 0211 講 - 全廣第二輪]]
# [[廣海明月 0212 講 - 全廣第二輪]]
# [[廣海明月 0213 講 - 全廣第二輪]]
# [[廣海明月 0214 講 - 全廣第二輪]]
# [[廣海明月 0215 講 - 全廣第二輪]]
# [[廣海明月 0216 講 - 全廣第二輪]]
# [[廣海明月 0217 講 - 全廣第二輪]]
# [[廣海明月 0218 講 - 全廣第二輪]]
# [[廣海明月 0219 講 - 全廣第二輪]]
# [[廣海明月 0220 講 - 全廣第二輪]]
# [[廣海明月 0221 講 - 全廣第二輪]]
# [[廣海明月 0222 講 - 全廣第二輪]]
# [[廣海明月 0223 講 - 全廣第二輪]]
# [[廣海明月 0224 講 - 全廣第二輪]]
# [[廣海明月 0225 講 - 全廣第二輪]]
# [[廣海明月 0226 講 - 全廣第二輪]]
# [[廣海明月 0227 講 - 全廣第二輪]]
# [[廣海明月 0228 講 - 全廣第二輪]]
# [[廣海明月 0229 講 - 全廣第二輪]]
# [[廣海明月 0230 講 - 全廣第二輪]]
# [[廣海明月 0231 講 - 全廣第二輪]]
# [[廣海明月 0232 講 - 全廣第二輪]]
# [[廣海明月 0233 講 - 全廣第二輪]]
# [[廣海明月 0234 講 - 全廣第二輪]]
# [[廣海明月 0235 講 - 全廣第二輪]]
# [[廣海明月 0236 講 - 全廣第二輪]]
# [[廣海明月 0237 講 - 全廣第二輪]]
# [[廣海明月 0238 講 - 全廣第二輪]]
# [[廣海明月 0239 講 - 全廣第二輪]]
# [[廣海明月 0240 講 - 全廣第二輪]]
# [[廣海明月 0241 講 - 全廣第二輪]]
# [[廣海明月 0242 講 - 全廣第二輪]]
# [[廣海明月 0243 講 - 全廣第二輪]]
# [[廣海明月 0244 講 - 全廣第二輪]]
# [[廣海明月 0245 講 - 全廣第二輪]]
# [[廣海明月 0246 講 - 全廣第二輪]]
# [[廣海明月 0247 講 - 全廣第二輪]]
# [[廣海明月 0248 講 - 全廣第二輪]]
# [[廣海明月 0249 講 - 全廣第二輪]]
# [[廣海明月 0250 講 - 全廣第二輪]]
# [[廣海明月 0251 講 - 全廣第二輪]]
# [[廣海明月 0252 講 - 全廣第二輪]]
# [[廣海明月 0253 講 - 全廣第二輪]]
# [[廣海明月 0254 講 - 全廣第二輪]]
# [[廣海明月 0255 講 - 全廣第二輪]]
# [[廣海明月 0256 講 - 全廣第二輪]]
# [[廣海明月 0257 講 - 全廣第二輪]]
# [[廣海明月 0258 講 - 全廣第二輪]]
# [[廣海明月 0259 講 - 全廣第二輪]]
# [[廣海明月 0260 講 - 全廣第二輪]]
# [[廣海明月 0261 講 - 全廣第二輪]]
# [[廣海明月 0262 講 - 全廣第二輪]]
# [[廣海明月 0263 講 - 全廣第二輪]]
# [[廣海明月 0264 講 - 全廣第二輪]]
# [[廣海明月 0265 講 - 全廣第二輪]]
# [[廣海明月 0266 講 - 全廣第二輪]]
# [[廣海明月 0267 講 - 全廣第二輪]]
# [[廣海明月 0268 講 - 全廣第二輪]]
# [[廣海明月 0269 講 - 全廣第二輪]]
# [[廣海明月 0270 講 - 全廣第二輪]]
# [[廣海明月 0271 講 - 全廣第二輪]]
# [[廣海明月 0272 講 - 全廣第二輪]]
# [[廣海明月 0273 講 - 全廣第二輪]]
# [[廣海明月 0274 講 - 全廣第二輪]]
# [[廣海明月 0275 講 - 全廣第二輪]]
# [[廣海明月 0276 講 - 全廣第二輪]]
# [[廣海明月 0277 講 - 全廣第二輪]]
# [[廣海明月 0278 講 - 全廣第二輪]]
# [[廣海明月 0279 講 - 全廣第二輪]]
# [[廣海明月 0280 講 - 全廣第二輪]]
# [[廣海明月 0281 講 - 全廣第二輪]]
# [[廣海明月 0282 講 - 全廣第二輪]]
# [[廣海明月 0283 講 - 全廣第二輪]]
# [[廣海明月 0284 講 - 全廣第二輪]]
# [[廣海明月 0285 講 - 全廣第二輪]]
# [[廣海明月 0286 講 - 全廣第二輪]]
# [[廣海明月 0287 講 - 全廣第二輪]]
# [[廣海明月 0288 講 - 全廣第二輪]]
# [[廣海明月 0289 講 - 全廣第二輪]]
# [[廣海明月 0290 講 - 全廣第二輪]]
# [[廣海明月 0291 講 - 全廣第二輪]]
# [[廣海明月 0292 講 - 全廣第二輪]]
# [[廣海明月 0293 講 - 全廣第二輪]]
# [[廣海明月 0294 講 - 全廣第二輪]]
# [[廣海明月 0295 講 - 全廣第二輪]]
# [[廣海明月 0296 講 - 全廣第二輪]]
# [[廣海明月 0297 講 - 全廣第二輪]]
# [[廣海明月 0298 講 - 全廣第二輪]]
# [[廣海明月 0299 講 - 全廣第二輪]]
# [[廣海明月 0300 講 - 全廣第二輪]]
# [[廣海明月 0301 講 - 全廣第二輪]]
# [[廣海明月 0302 講 - 全廣第二輪]]
# [[廣海明月 0303 講 - 全廣第二輪]]
# [[廣海明月 0304 講 - 全廣第二輪]]
# [[廣海明月 0305 講 - 全廣第二輪]]
# [[廣海明月 0306 講 - 全廣第二輪]]
# [[廣海明月 0307 講 - 全廣第二輪]]
# [[廣海明月 0308 講 - 全廣第二輪]]
# [[廣海明月 0309 講 - 全廣第二輪]]
# [[廣海明月 0310 講 - 全廣第二輪]]
# [[廣海明月 0311 講 - 全廣第二輪]]
# [[廣海明月 0312 講 - 全廣第二輪]]
# [[廣海明月 0313 講 - 全廣第二輪]]
# [[廣海明月 0314 講 - 全廣第二輪]]
# [[廣海明月 0315 講 - 全廣第二輪]]
# [[廣海明月 0316 講 - 全廣第二輪]]
# [[廣海明月 0317 講 - 全廣第二輪]]
# [[廣海明月 0318 講 - 全廣第二輪]]
# [[廣海明月 0319 講 - 全廣第二輪]]
# [[廣海明月 0320 講 - 全廣第二輪]]
# [[廣海明月 0321 講 - 全廣第二輪]]
# [[廣海明月 0322 講 - 全廣第二輪]]
# [[廣海明月 0323 講 - 全球廣論第二輪]]
# [[廣海明月 0324 講 - 全廣第二輪]]
# [[廣海明月 0325 講 - 全廣第二輪]]
# [[廣海明月 0326 講 - 全廣第二輪]]
# [[廣海明月 0327 講 - 全廣第二輪]]
# [[廣海明月 0328 講 - 全廣第二輪]]
# [[This is a test tiddler]]
# [[tocEntry]]
no
$:/themes/nico/notebook/palettes/palette-dark
alert-background: rgb(255, 255, 102)
alert-border: rgb(232, 232, 125)
alert-highlight: rgb(255, 51, 51)
alert-muted-foreground: rgb(224, 82, 82)
background: rgb(38, 38, 38)
blockquote-bar: rgba(240, 196, 117, 0.7)
button-background: rgb(63, 63, 63)
button-border: rgb(127, 127, 127)
button-foreground: rgb(179, 179, 179)
code-background: rgba(0,0,0,0.03)
code-border: rgba(0,0,0,0.08)
code-foreground: rgb(255, 94, 94)
diff-delete-background: #ffc9c9
diff-delete-foreground: <<colour foreground>>
diff-equal-background: 
diff-equal-foreground: <<colour foreground>>
diff-insert-background: #aaefad
diff-insert-foreground: <<colour foreground>>
diff-invisible-background: 
diff-invisible-foreground: <<colour muted-foreground>>
dirty-indicator: rgb(255, 94, 94)
download-background: #19a974
download-foreground: rgb(38, 38, 38)
dragger-background: rgb(179, 179, 179)
dragger-foreground: rgb(38, 38, 38)
dropdown-background: rgb(38, 38, 38)
dropdown-border: rgb(255, 255, 255)
dropdown-tab-background: rgba(0,0,0,.1)
dropdown-tab-background-selected: rgba(255,255,255,1)
dropzone-background: #9eebcf
external-link-background: inherit
external-link-background-hover: inherit
external-link-background-visited: inherit
external-link-foreground: rgb(179, 179, 255)
external-link-foreground-hover: inherit
external-link-foreground-visited: rgb(153, 153, 255)
foreground: rgb(179, 179, 179)
message-background: <<colour tag-foreground>>
message-border: #96ccff
message-foreground: <<colour tag-background>>
modal-backdrop: rgb(179, 179, 179)
modal-background: rgb(38, 38, 38)
modal-border: rgba(0,0,0,.5)
modal-footer-background: #f4f4f4
modal-footer-border: rgba(0,0,0,.1)
modal-header-border: rgba(0,0,0,.2)
muted-foreground: rgb(255, 255, 255)
notification-background: <<colour tag-foreground>>
notification-border: <<colour tag-background>>
page-background: rgb(26, 26, 26)
pre-background: rgb(25, 25, 25)
pre-border: rgba(0,0,0,.2)
primary: rgb(255, 201, 102)
select-tag-background: 
select-tag-foreground: 
sidebar-button-foreground: rgb(179, 179, 179)
sidebar-controls-foreground: rgb(153, 153, 153)
sidebar-controls-foreground-hover: <<colour tiddler-controls-foreground-hover>>
sidebar-foreground: rgb(141, 141, 141)
sidebar-foreground-shadow: transparent
sidebar-muted-foreground: rgba(0, 0, 0, 0.5)
sidebar-muted-foreground-hover: rgb(141, 141, 141)
sidebar-tab-background: rgba(141, 141, 141, 0.2)
sidebar-tab-background-selected: rgb(26, 26, 26)
sidebar-tab-border: rgb(127, 127, 127)
sidebar-tab-border-selected: rgb(127, 127, 127)
sidebar-tab-divider: rgb(127, 127, 127)
sidebar-tab-foreground: rgb(179, 179, 179)
sidebar-tab-foreground-selected: rgb(179, 179, 179)
sidebar-tiddler-link-foreground: rgb(179, 179, 179)
sidebar-tiddler-link-foreground-hover: rgb(115, 115, 115)
site-title-foreground: rgb(255, 201, 102)
static-alert-foreground: rgba(0,0,0,.3)
tab-background: rgba(0,0,0,0.125)
tab-background-selected: rgb(38, 38, 38)
tab-border: rgb(255, 201, 102)
tab-border-selected: rgb(255, 201, 102)
tab-divider: rgb(255, 201, 102)
tab-foreground: rgb(179, 179, 179)
tab-foreground-selected: rgb(179, 179, 179)
table-border: rgba(255,255,255,.3)
table-footer-background: rgba(0,0,0,.4)
table-header-background: rgba(0,0,0,.1)
tag-background: rgb(255, 201, 102)
tag-foreground: rgb(25, 25, 25)
tiddler-background: rgb(38, 38, 38)
tiddler-border: rgba(240, 196, 117, 0.7)
tiddler-controls-foreground: rgb(128, 128, 128)
tiddler-controls-foreground-hover: rgba(255, 255, 255, 0.8)
tiddler-controls-foreground-selected: rgba(255, 255, 255, 0.9)
tiddler-editor-background: rgb(33, 33, 33)
tiddler-editor-border: rgb(63, 63, 63)
tiddler-editor-border-image: rgb(25, 25, 25)
tiddler-editor-fields-even: rgb(33, 33, 33)
tiddler-editor-fields-odd: rgb(28, 28, 28)
tiddler-info-background: rgb(43, 43, 43)
tiddler-info-border: rgb(25, 25, 25)
tiddler-info-tab-background: rgb(43, 43, 43)
tiddler-link-background: rgb(38, 38, 38)
tiddler-link-foreground: rgb(204, 204, 255)
tiddler-subtitle-foreground: rgb(255, 255, 255)
tiddler-title-foreground: rgb(255, 192, 76)
toolbar-cancel-button: 
toolbar-close-button: 
toolbar-delete-button: 
toolbar-done-button: 
toolbar-edit-button: 
toolbar-info-button: 
toolbar-new-button: 
toolbar-options-button: 
toolbar-save-button: 
untagged-background: rgb(255, 255, 255)
very-muted-foreground: rgba(240, 196, 117, 0.7)
<script src='http://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.3.2/ckeditor.js'></script>

{
    "tiddlers": {
        "$:/core/modules/widgets/button-dragover-extend.js": {
            "text": "/*\\\ntitle: $:/core/modules/widgets/button-dragover-extend.js\ntype: application/javascript\nmodule-type: widget\n\nExtend the link widget to allow click when there is a drag over (option)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ButtonWidget = require(\"$:/core/modules/widgets/button.js\")[\"button\"];\nButtonWidget.prototype.bjDragExtend ={};\nButtonWidget.prototype.bjDragExtend.render = ButtonWidget.prototype.render;\n\nButtonWidget.prototype.render = function (parent,nextSibling) {\n\tButtonWidget.prototype.bjDragExtend.render.call(this,parent,nextSibling);\n\tif (this.dragoverclick===\"yes\") { \n\t\t$tw.utils.addEventListeners(this.domNodes[0],[\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"}\n\t\t]);\n\t}\n}\n\n/*\nadd option\n*/\nButtonWidget.prototype.bjDragExtend.execute = ButtonWidget.prototype.execute;\nButtonWidget.prototype.execute = function() {\n\tButtonWidget.prototype.bjDragExtend.execute.call(this);\n\tthis.dragoverclick=this.getAttribute(\"dragoverclick\",\"no\");\n};\n/*\nhandle dragover\n*/\nButtonWidget.prototype.handleDragOverEvent  = function(event) {\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\t// Send the drag as click  as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey\n\t});\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n})();\n",
            "title": "$:/core/modules/widgets/button-dragover-extend.js",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/dropzone-extend.js": {
            "text": "/*\\\ntitle: $:/core/modules/widgets/dropzone-extend.js\ntype: application/javascript\nmodule-type: widget\n\nExtend the dropzone widget to allow other widget to handle drop events \n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n\nvar DropZoneWidget = require(\"$:/core/modules/widgets/dropzone.js\")[\"dropzone\"];\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n/*\nThe edit-text widget calls this method just after inserting its dom nodes\n*/\n/*\noverload the base widget class initialise\n*/\nDropZoneWidget.prototype.bjDropzoneExtend ={};\nDropZoneWidget.prototype.bjDropzoneExtend.initialise = DropZoneWidget.prototype.initialise;\n\nDropZoneWidget.prototype.initialise = function (parseTreeNode,options) {\n\tDropZoneWidget.prototype.bjDropzoneExtend.initialise.call(this,parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-dropHandled\", handler: \"handleDropHandled\"}]);\n};\n/*\nhandle drophandled message\n*/\nDropZoneWidget.prototype.handleDropHandled = function(event) {\n\t// Reset the enter count\n\tthis.dragEnterCount = 0;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\treturn false;\n};\n\n})();\n",
            "title": "$:/core/modules/widgets/dropzone-extend.js",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/plugins/bj/drag-and-drop/license": {
            "title": "$:/plugins/bj/drag-and-drop/license",
            "text": "The MIT License (MIT)\n\nCopyright (c) 2014 Jeffrey Wikinson aka buggyj\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
        },
        "$:/core/modules/widgets/link-dragover-extend.js": {
            "text": "/*\\\ntitle: $:/core/modules/widgets/link-dragover-extend.js\ntype: application/javascript\nmodule-type: widget\n\nExtend the link widget to allow click when there is a drag over (option)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar LinkWidget = require(\"$:/core/modules/widgets/link.js\")[\"link\"];\nLinkWidget.prototype.bjDragExtend ={};\nLinkWidget.prototype.bjDragExtend.renderLink = LinkWidget.prototype.renderLink;\n\nLinkWidget.prototype.renderLink = function (parent,nextSibling) {\n\tLinkWidget.prototype.bjDragExtend.renderLink.call(this,parent,nextSibling);\n\tif (this.dragoverclick===\"yes\") { \n\t\t$tw.utils.addEventListeners(this.domNodes[0],[\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"}\n\t\t]);\n\t}\n}\n\n/*\nadd option\n*/\nLinkWidget.prototype.bjDragExtend.execute = LinkWidget.prototype.execute;\nLinkWidget.prototype.execute = function() {\n\tLinkWidget.prototype.bjDragExtend.execute.call(this);\n\tthis.dragoverclick=this.getAttribute(\"dragoverclic\",\"no\");\n};\n/*\nhandle dragover\n*/\nLinkWidget.prototype.handleDragOverEvent  = function(event) {\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\t// Send the drag as click  as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey\n\t});\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n})();\n",
            "title": "$:/core/modules/widgets/link-dragover-extend.js",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/core/modules/widgets/ondrop.js": {
            "text": "/*\\\ntitle: $:/core/modules/widgets/ondrop.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar OnDrop = function(parseTreeNode,options) {\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nOnDrop.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nOnDrop.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t\t// Add event handlers\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tdomNode.className = \"tc-dropzone\";\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"}\n\t\t]);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nOnDrop.prototype.execute = function() {\n\tthis.listtag = this.getAttribute(\"targeTtag\",this.getVariable(\"currentTiddler\"));\n    this.onAddMessage = this.getAttribute(\"onAddMessage\");\n    this.action = this.getAttribute(\"tagAction\"); \n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nOnDrop.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.tagAction || changedAttributes.onAddMessage) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\nOnDrop.prototype.addTag = function (tidname) {\n\t\tvar tiddler = this.wiki.getTiddler(tidname);\n\t\tvar modification = this.wiki.getModificationFields();\n\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t$tw.utils.pushTop(modification.tags,this.listtag);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t\t\n}\n\nOnDrop.prototype.removeTag = function (tidname) {\n\t\tvar tiddler = this.wiki.getTiddler(tidname);\n\t\tvar p = tiddler.fields.tags.indexOf(this.listtag);\n\t\tif(p !== -1) {\n\t\t\tvar modification = this.wiki.getModificationFields();\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\t\n}\n\nOnDrop.prototype.handleDropEvent  = function(event) {\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer, returned={};\n\t\treturned = self.nameandOnListTag(dataTransfer);\n\t\n\tif (!!returned.name) { //only handle tiddler drops\n\t\t if (!returned.onList) { //this means tiddler does not have the tag\n\t\t\tif (self.action === 'addtag') self.addTag(returned.name);\n\t\t}\n\t\telse {\n\t\t\tif (self.action === 'removetag') self.removeTag(returned.name);\n\t\t}\n\t\t //cancel normal action\n\t\t self.cancelAction(event);\n\n\t\t self.dispatchEvent({type: \"tm-dropHandled\", param: null});\n\t if (self.onAddMessage) self.dispatchEvent({type: self.onAddMessage, param: returned.name});\n\t }\n\t //else let the event fall thru\n};\nOnDrop.prototype.importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, convertToFields: function(data) {\n\t\treturn JSON.parse(data);\n\t}},\n\t{type: \"URL\", IECompatible: true, convertToFields: function(data) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURI(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn JSON.parse(match[1]);\n\t\t} else {\n\t\t\treturn { // As URL string\n\t\t\t\ttext: data\n\t\t\t};\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, convertToFields: function(data) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURI(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn JSON.parse(match[1]);\n\t\t} else {\n\t\t\treturn { // As URL string\n\t\t\t\ttext: data\n\t\t\t};\n\t\t}\n\t}},\n\t{type: \"text/plain\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"Text\", IECompatible: true, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}}\n];\nOnDrop.prototype.cancelAction =function(event) {\n\t// Try each provided data type in turn\n\t\t{\n\tvar dataTransfer = event.dataTransfer;\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n};\n\nOnDrop.prototype.nameandOnListTag = function(dataTransfer) {\n\t// Try each provided data type in turn\n\tfor(var t=0; t<this.importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || this.importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = this.importDataTypes[t];\n\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data);\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tvar tiddlerFields = dataType.convertToFields(data);\n\t\t\t\tif(!tiddlerFields.title) {\n\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (tiddlerFields.tags && $tw.utils.parseStringArray(tiddlerFields.tags).indexOf(this.listtag) !== -1) {\n\t\t\t\t\treturn {name:tiddlerFields.title, onList:true};\n\t\t\t\t}\n\t\t\t\telse {//we have to add the tag to the tiddler\n\t\t\t\t\tif (!!this.wiki.getTiddler(tiddlerFields.title)){//tid is in this tw\n\t\t\t\t\t\treturn {name:tiddlerFields.title, onList:false};\n\t\t\t\t\t}\n\t\t\t\t//return false; \n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\treturn  {name:null, onList:false};\n};\nexports.ondrop = OnDrop;\n})();\n\n",
            "title": "$:/core/modules/widgets/ondrop.js",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/plugins/bj/drag-and-drop/readme": {
            "title": "$:/plugins/bj/drag-and-drop/readme",
            "text": "!!!Drag and Drop Widgets\n\nPlugin contains the following widgets\n\n# taglist - re-orderable list of tiddlers with the same tag. Api parameters:\n#* targettag - name of the lists tag\n#* template - The title of a template tiddler for transcluding each tiddler in the list. When no template is specified, the body of the widget serves as the item template. With no body, a simple link to the tiddler is returned.\n#* variable - The name for a variable in which the title of each listed tiddler is stored. Defaults to currentTiddler\n#* nodrop - drops are ignored\n#* htmltag - enclosing html element for list items\n# ondrop - and or remove tags in response to a drop event. Api parameters:\n#* targeTtag name of tag to act with. \n#* tagAction can be set to addtag or removetag\n\nThis plugin also adds ondragover click events to the link and button widgets. \n"
        },
        "$:/core/modules/widgets/taglist.js": {
            "text": "/*\\\ntitle: $:/core/modules/widgets/taglist.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar TagListWidget = function(parseTreeNode,options) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tTagListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTagListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTagListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTagListWidget.prototype.execute = function() {\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.nodrop = this.getAttribute(\"nodrop\");\n\tthis.htmltag = this.getAttribute(\"htmltag\");\n\tthis.static = this.getAttribute(\"static\"); \n\tthis.listtag=this.getAttribute(\"targeTtag\",this.getVariable(\"currentTiddler\"));\n\tthis.listtag=this.getAttribute(\"targettag\",this.listtag);\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this;\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n};\n\nTagListWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[tag[\"+this.listtag+\"]]\";\n\treturn this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);//BJ FIXME should not allow user defined filters\n};\nTagListWidget.prototype.setTiddlerList = function(what,where) {\n\tvar self = this;\n\tif (this.nodrop || this.static) return;\n\tvar update = function(value) {\n\t\tvar tiddler = self.wiki.getTiddler(self.listtag)||{title:self.listtag},\n\t\t\tupdateFields = {};\n\t\t\n\t\tupdateFields[\"list\"] = value;\n\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,\n\t\tself.wiki.getModificationFields()));\n\t};\n\tvar newlist=[],\n\t\tj=0;\n\t\n\tfor (var i=0;i<this.list.length;i++) {\n\t\tif (this.list[i]===what) continue;\n\t\tif (this.list[i]===where) {\n\t\t\tnewlist[j]=what;\n\t\t\tj++; \n\t\t}\n\t\tnewlist[j]=this.list[i];\n\t\tj++; \n\t}\n\tupdate(newlist);\n};\n\nTagListWidget.prototype.getEmptyMessage = function() {\n\tvar emptyMessage = this.getAttribute(\"emptyMessage\",\"\"),\n\t\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nTagListWidget.prototype.makeItemTemplate = function(title) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\tif (this.nodrop) return {type: \"taglistitem\", itemTitle: title, variableName: this.variableName, children: templateTree, listtag:null};\n\treturn {type: \"taglistitem\", itemTitle: title, variableName: this.variableName, children: templateTree, listtag:this.listtag, htmltag:this.htmltag};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTagListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.targeTtag) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tvar hasChanged = this.handleListChanges(changedTiddlers);\n\t\treturn hasChanged;\n\t}\n};\n\n\n/*\nProcess any changes to the list\n*/\nTagListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();//alert(this.list);\n\tvar redolist = false;\n\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(var t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) \n\t\t{\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\tif (prevList.length!==this.list.length) {\n\t\t\tredolist = true;\n\t\t} else {\n\t\t\tvar t;\n\t\t\tfor(t=0; t<this.list.length; t++) {\n\t\t\t\tif (prevList[t]!==this.list[t]) {//compare tid titles\n\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t}\n\t\t\tif ( t!==this.list.length ){\n\t\t\t\tredolist = true;\n\t\t\t}\n\t\t}\n\t\tvar hasRefreshed = false;\n\t\tif (redolist === true) {\n\t\t\tvar hasRefreshed = true;\n\t\t\tfor(var t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t}\n\t\t} else {\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nTagListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nTagListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nTagListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.taglist = TagListWidget;\n\nvar TagListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.nodrop = this.parseTreeNode.listtag;\n};\n\n/*\nInherit from the base widget class\n*/\nTagListItemWidget.prototype = new Widget();\nTagListItemWidget.prototype.addTag = function (tidname) {\n\t\tvar tiddler = this.wiki.getTiddler(tidname);\n\t\tvar modification = this.wiki.getModificationFields();\n\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t$tw.utils.pushTop(modification.tags,this.parseTreeNode.listtag);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t\t\n}\nTagListItemWidget.prototype.handleDropEvent  = function(event) {\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer,\n\t\treturned = this.nameandOnListTag(dataTransfer);\n\tif (!this.nodrop) {\n\t\tthis.cancelAction(event);\n\t\tself.dispatchEvent({type: \"tm-dropHandled\", param: null});\n\t\treturn;\n\t}\n\tif (!!returned.name) { //only handle tiddler drops\n\t\t if (!returned.onList) { //this means tiddler does not have the tag\n\t\t\t this.addTag(returned.name);\n\t\t }\n\t\t this.parentWidget.setTiddlerList(returned.name, this.parseTreeNode.itemTitle);\n\n\t\t //cancel normal action\n\t\t this.cancelAction(event);\n\t\t self.dispatchEvent({type: \"tm-dropHandled\", param: null});\n\n\t }\n\t //else let the event fall thru\n};\nTagListItemWidget.prototype.importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, convertToFields: function(data) {\n\t\treturn JSON.parse(data);\n\t}},\n\t{type: \"URL\", IECompatible: true, convertToFields: function(data) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn JSON.parse(match[1]);\n\t\t} else {\n\t\t\treturn { // As URL string\n\t\t\t\ttext: data\n\t\t\t};\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, convertToFields: function(data) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn JSON.parse(match[1]);\n\t\t} else {\n\t\t\treturn { // As URL string\n\t\t\t\ttext: data\n\t\t\t};\n\t\t}\n\t}},\n\t{type: \"text/plain\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"Text\", IECompatible: true, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, convertToFields: function(data) {\n\t\treturn {\n\t\t\ttext: data\n\t\t};\n\t}}\n];\nTagListItemWidget.prototype.cancelAction =function(event) {\n\t// Try each provided data type in turn\n\t\t{\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n};\n\n\nTagListItemWidget.prototype.nameandOnListTag = function(dataTransfer) {\n\t// Try each provided data type in turn\n\tvar self = this;\n\tfor(var t=0; t<this.importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || this.importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = this.importDataTypes[t];\n\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tvar tiddlerFields = dataType.convertToFields(data);\n\t\t\t\tif(!tiddlerFields.title) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (tiddlerFields.tags && $tw.utils.parseStringArray(tiddlerFields.tags).indexOf(self.parseTreeNode.listtag) !== -1) {\n\t\t\t\t\treturn {name:tiddlerFields.title, onList:true};\n\t\t\t\t}\n\t\t\t\telse {//we have to add the tag to the tiddler\n\t\t\t\t\tif (!!self.wiki.getTiddler(tiddlerFields.title)){//tid is in this tw\n\t\t\t\t\t\treturn {name:tiddlerFields.title, onList:false};\n\t\t\t\t\t}\n\t\t\t\t//return false; \n\t\t\t\t}\n\t\t\t}\n\t\t}else alert(\"not found\");\n\t};\n\treturn  {name:null, onList:false};\n};\n/*\nRender this widget into the DOM\n*/\nTagListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\t\n\tvar tag = \"div\";\n\tif(this.parseTreeNode.htmltag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\n\t\ttag = this.parseTreeNode.htmltag;\n\t}\nvar domNode = this.document.createElement(tag);\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\t\t\n\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"}\n\t\t]);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n\nTagListItemWidget.prototype.handleDragOverEvent  = function(event) {\n//alert(\"OVER\")\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\tevent.dataTransfer.dropEffect = \"copy\";\n};\n/*\nCompute the internal state of the widget\n*/\nTagListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTagListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.taglistitem = TagListItemWidget;\n\n})();\n",
            "title": "$:/core/modules/widgets/taglist.js",
            "type": "application/javascript",
            "module-type": "widget"
        }
    }
}
{
    "tiddlers": {
        "$:/core/modules/parsers/wikiparser/abstractwikiparser.js": {
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/abstractwikiparser.js\ntype: application/javascript\nmodule-type: global\n\nbase class- individual wikiparser inherit from this class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AbstrWikiParser = function(specifier) {\n\t\n\tthis.type = specifier.type;\n\tthis.source = specifier.source;\n\tthis.options =specifier.options;\n\tthis.wiki = this.options.wiki;\n\tthis.pragmaRuleClasses=specifier.pragmaRuleClasses;\n\tthis.blockRuleClasses=specifier.blockRuleClasses;\n\tthis.inlineRuleClasses=specifier.inlineRuleClasses;\n\tthis.sourceLength = this.source.length;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = [];\n\tvar topBranch = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(this.options.parseAsInline) {\n\t\ttopBranch.push.apply(topBranch,this.parseInlineRun());\n\t} else {\n\t\ttopBranch.push.apply(topBranch,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\nAbstrWikiParser.prototype =Object.create( \n\trequire(\"$:/core/modules/parsers/wikiparser/wikiparser.js\")[\"text/vnd.tiddlywiki\"].prototype);\n\nexports[\"AbstrWikiParser\"] = AbstrWikiParser;\n\n})();\n",
            "title": "$:/core/modules/parsers/wikiparser/abstractwikiparser.js",
            "type": "application/javascript",
            "module-type": "global"
        },
        "$:/core/modules/parsers/wikiparser/basewikiparser.js": {
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/basewikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe base wiki text parser\n\nThis implementation is sub-optional, it 'steals' its defintion from the text/vnd.tiddlywiki,\nit would be better that the text/vnd.tiddlywiki was split into an abstract base and a realisation\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nfunction override(a, b) {\n  var hash = {};\n  return a.concat(b).filter(function (val) {\n    return hash[val] ? 0 : hash[val] = 1;\n  });\n}\nvar createClassesList= function (ruleList,userlist,nativelist) {\n\tvar temp ={};\n\tfor (var i=0;i<ruleList.length;i++) {\n\t\tvar rule = ruleList[i];\n\t\tvar found = false;\n\t\tif (!!userlist) \n\t\t\tif (Object.prototype.hasOwnProperty.call(userlist,rule)) {\n\t\t\t\ttemp[rule] = userlist[rule];\n\t\t\t\tfound = true; \n\t\t\t}\n\t\tif (!found) \n\t\t\tif (Object.prototype.hasOwnProperty.call(nativelist,rule)) {\n\t\t\t\ttemp[rule] = nativelist[rule];\n\t\t\t}\n\t\t\n\t}\n\treturn temp;\n};\nvar ParserPrimer = function(type,text,options) {\n\t//BJ meditation if I pass in the complete type here, then I could use this to cache the \n\t//Parser objects.\n\tif(!this.pragmaRuleClasses) {\n\t\tParserPrimer.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tParserPrimer.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tParserPrimer.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t}\n\tif(!this.userClasses) {\n\t\tParserPrimer.prototype.userClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"user\",$tw.WikiRuleBase);\n\t}\n\n    if (!!options.parserrules) {//if($tw.browser)alert(\"createrules\");\n\t\tif (!!options.parserrules.pragmaRuleList)this.pragmaRuleClasses=createClassesList(options.parserrules.pragmaRuleList, this.userClasses, this.pragmaRuleClasses);\n\t\tif (!!options.parserrules.blockRuleList)this.blockRuleClasses=createClassesList(options.parserrules.blockRuleList, this.userClasses, this.blockRuleClasses);\n\t\tif (!!options.parserrules.inlineRuleList)this.inlineRuleClasses=createClassesList(options.parserrules.inlineRuleList, this.userClasses, this.inlineRuleClasses);\n\t}\n\tfor (var i = 0;i<this.blockRuleClasses.length;i++) alert (this.blockRuleClasses[i].rule.name);\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.twbase\";\n\tthis.source = text || \"\";\n\tthis.options = options;\n};\n//realise the parser from the abstr parser\nvar  BaseWikiParser5= function (type,text,options) { \n\trequire(\"$:/core/modules/parsers/wikiparser/abstractwikiparser.js\")[\"AbstrWikiParser\"].\n\t\t\t\t\t\t\t\t\t\t\t\tcall(this,new ParserPrimer(type,text,options));\n}\nBaseWikiParser5.prototype =Object.create( \n\trequire(\"$:/core/modules/parsers/wikiparser/abstractwikiparser.js\")[\"AbstrWikiParser\"].prototype);\n\nexports[\"text/vnd.twbase\"] = BaseWikiParser5;\n\n})();\n\n",
            "title": "$:/core/modules/parsers/wikiparser/basewikiparser.js",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/core/modules/parsers/htmlparser.js": {
            "text": "/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src,sandbox;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tif (options.parserrules && options.parserrules.sandbox) {\n\t\tsandbox = options.parserrules.sandbox;\n\t}\n\telse {\n\t\tsandbox = \"sandbox\";\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src},\n\t\t\tsandbox: {type: \"string\", value: sandbox}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n",
            "title": "$:/core/modules/parsers/htmlparser.js",
            "type": "application/javascript",
            "module-type": "parser"
        },
        "$:/plugins/bj/flexitype/license": {
            "title": "$:/plugins/bj/flexitype/license",
            "text": "The MIT License (MIT)\n\nCopyright (c) 2014 Jeffrey Wikinson aka buggyj\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
        },
        "$:/plugins/bj/flexitype/readme": {
            "title": "$:/plugins/bj/flexitype/readme",
            "text": "Allows a user defined collection of tiddlywiki type parser rules to be associated with a (flexible) type. The flexible type has the form \n\n```\ntext/vnd.twbase;flexibility=htmlp\n```\nwhere:\n\nvnd.twbase refers to the tiddlywiki5 parser stripped of its rules. \n\nhtmlp is a json tiddler that contains options to define which rules will make up the new type.\n\nIn this example htmlp could contain\n\n```\n{\n  \"parserrules\": {\n    \"pragmaRuleList\": [],\n    \"blockRuleList\": [\n      \"html\"\n    ],\n    \"inlineRuleList\": [\n      \"html\",\n      \"prettylink\",\n      \"transcludeinline\",\n      \"entity\",\n      \"wikilink\"\n    ]\n  }\n}\n```\n\"prettylink\" etc are the tiddlywiki5 supplied 'parser rules'.  Non-tiddlywiki defined rules may also be be used.\n\nSee working examples at the project home: http://bjtools.tiddlyspot.com\n"
        },
        "$:/core/modules/parsers/wikiparser/wikiadapter.js": {
            "text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiadapter.js\ntype: application/javascript\nmodule-type: global\n\noverrides for wiki.js\n\n\\*/\n(function(){\n\t\nvar wiki = require(\"$:/core/modules/wiki.js\");\nwiki.mergesetting = function(items, adjustitems) {\n\tif (!adjustitems) return;//nothing to do\n\t$tw.utils.each(adjustitems,function(adjustitem, listname) {\n\t\tif (!!items[listname]) {\n\t\t\tif (items[listname] instanceof Array) {//merge lists\n\t\t\t\tvar i,baselen=items[listname].length;\n\t\t\t\tfor (var j=0; j<adjustitem.length; j++){\n\t\t\t\t\tfor ( i=0; i<baselen; i++) {\n\t\t\t\t\t\tif (adjustitem[j]===items[listname][i]) break;\n\t\t\t\t\t}\n\t\t\t\t\tif (i===baselen) items[listname].push(adjustitem[j]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\titems[listname]=adjustitem;//override item\n\t\t\t}\n\t\t} else items[listname]=adjustitem;//add new item\n\t\t\n\t})\n}\n/*\nrecursive function, retrives parseroptions from tiddlers/files\nreturns preparser, baseparser type and parserrules\n*/\nwiki.makeparsers=function(type,text,options){\n\tvar returns={};\n\t\t\n\t\tvar typeParts = type.split(\";flexibility=\");\n\t\tif (typeParts.length >1) {\n\t\t\tvar typeDialog =typeParts[1];//alert(typeDialog);\n\t\t\tvar  readdata=$tw.wiki.getTiddlerData(typeDialog);\n\t\t\t//read json tid (typeDialog )containing:\n\t\t\t\t// one string var of preparser eg text/type>html  \n\t\t\t\t// baseparser\n\t\t\t\t// parserdata\n\t\t\t\t// concaternate parserdata with baseparser -recursive\n\t\t\t\t// overload baserparser's preparser with this preparser\n\t\t\tif (!!readdata) {\n\t\t\t\tif (!!readdata.baserules) \n\t\t\t\t\treturns=this.makeparsers(readdata.baserules,text,options);\n\t\t\t\tif (!!readdata.parseAsInline) returns.parseAsInline =readdata.parseAsInline;\n\t\t\t\tif (!returns.parserrules) returns.parserrules = readdata.parserrules;\n\t\t\t\telse this.mergesetting(returns.parserrules,readdata.parserrules);\n\t\t\t\treturns.type = typeParts[0];//overrides basetype of baserules\n\t\t\t\tif (!!readdata.preparser) returns.preparser =readdata.preparser;//override baserule preparser\t\n\t\t\t\t//alert(parserdata);\n\t\t\t}\telse {\n\t\t\t\treturns.type=type;\n\t\t\t\treturns.parserrules=null;\n\t\t\t\treturns.preparser=null;\n\t\t\t}\n\t\t} else {\n\t\t\treturns.type=type;\n\t\t\treturns.parserrules=null;\n\t\t\treturns.preparser=null;\n\t\t}\n\t\treturn returns;\n\n}\nwiki.prepasstext =function(preparser,text, options) {\n\tvar preparserpart = preparser.split(\">\");\n\treturn this.renderText(preparserpart[1],preparserpart[0],text,options);\n}\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n*/\nwiki.parseText = function(type,text,options) {\n\toptions = options || {};\n\tvar parserdata;\n\t// Select a parser\n\tif(type !== undefined) { //get type is undefined when built\n\t\tparserdata=this.makeparsers(type,text,options);\n\t\ttype=parserdata.type;\n\t\tif (!!parserdata.parseAsInline) options.parseAsInline =parserdata.parseAsInline;\n\t\tif (!!parserdata.preparser) text = this.prepasstext.call(this,parserdata.preparser,text,options);\n\t}\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.config.fileExtensionInfo[type]) {\n\t\tParser = $tw.Wiki.parsers[$tw.config.fileExtensionInfo[type].type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri,\n\t\tparserrules:(type !== undefined)?parserdata.parserrules:null \n\t});\n};\n})();\n",
            "title": "$:/core/modules/parsers/wikiparser/wikiadapter.js",
            "type": "application/javascript",
            "module-type": "global"
        }
    }
}
{
    "tiddlers": {
        "$:/config/EditorTypeMappings/application/json": {
            "title": "$:/config/EditorTypeMappings/application/json",
            "text": "json"
        },
        "$:/plugins/bj/jsoneditor/edit-json.js": {
            "text": "/*\\\ntitle: $:/plugins/bj/jsoneditor/edit-json.js\ntype: application/javascript\nmodule-type: widget\n\njsoneditor adaptor\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MIN_TEXT_AREA_HEIGHT = 100; // Minimum height of textareas in pixels\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar newid=0;\nvar EditJsonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\nif($tw.browser) {\n\trequire(\"$:/plugins/bj/jsoneditor/JSONeditor.js\");\n}\n/*\nInherit from the base widget class\n*/\nEditJsonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditJsonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our element\n\tvar editInfo = this.getEditInfo();\n\tvar domNode = this.document.createElement(\"div\");\n\tvar domNode2 = this.document.createElement(\"div\");\n\tif(this.editType) {\n\t\tdomNode.setAttribute(\"type\",this.editType);\n\t}\n\tif(editInfo.value === \"\" && this.editPlaceholder) {\n\t\tdomNode.setAttribute(\"placeholder\",this.editPlaceholder);\n\t}\n\t// Assign classes\n\tif(this.editClass) {\n\t\tdomNode.className = this.editClass;\n\t}\n\tvar domNode2 = this.document.createElement(\"div\");\n\tdomNode.innerHTML = '<div style=\"font-size: 11px; font-family: Verdana,Arial,Helvetica,sans-serif;\" id=\"jsoneditortree'+newid+'\"></div>';\n\tdomNode2.innerHTML \t=\tthis.formHTML;\n\t\n\t// Add an input event handler\n\t//$tw.utils.addEventListeners(domNode2,[\n\t//\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t//\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t//]);\n\n\t// Insert the element into the DOM\n\tparent.insertBefore(domNode2,nextSibling);\n\tparent.insertBefore(domNode,domNode2);\n\tvar updater =function(x){\n\t\tself.saveChanges(x);\n\t}\n\tthis.instance=JSONeditor.start('jsoneditortree'+newid,domNode2.firstChild.firstChild,JSON.parse(editInfo.value),\n\t\t\t\t\t\t\t\t\t'$:/plugins/bj/jsoneditor/',this.format,updater);\n\tvar instance = this.instance;\n\n\tnewid++;\n\tthis.domNodes.push(domNode);\n\tthis.domNodes.push(domNode2);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n\tthis.formsetup(domNode2.firstChild);\n};\n\nEditJsonWidget.prototype.formHTML=\t\n\t'<div style=\"font-size: 11px; font-family: Verdana,Arial,Helvetica,sans-serif;\" \">'+\n\t\"<form name=\\\"jsoninput\\\" >\"\t+\n\t\"\\nLabel:<br>\"+\n\t\"<input name=\\\"jlabel\\\" type=\\\"text\\\" value=\\\"\\\" size=\\\"60\\\" style=\\\"width:400px\\\">\"+\n\t\"<br><br>\\nValue: <br>\"+\n\t\"<textarea name=\\\"jvalue\\\" rows=\\\"10\\\" cols=\\\"50\\\" style=\\\"width:400px\\\"></textarea>\"+\n\t\"<br><br>\\nData type: \"+\n\t\"<select  name=\\\"jtype\\\">\"+\n\t\"\\n<option value=\\\"object\\\">object</option>\\n<option value=\\\"array\\\">array</option>\"+\n\t\"\\n<option value=\\\"string\\\">string</option>\"+\n\t\"\\n<option value=\\\"number\\\">number</option>\\n<option value=\\\"boolean\\\">boolean</option>\"+\n\t\"\\n<option value=\\\"null\\\">null</option>\\n<option value=\\\"undefined\\\">undefined</option>\"+\n\t\"\\n</select>&nbsp;&nbsp;&nbsp;&nbsp;\"+\n\t\"\\n<input name=\\\"orgjlabel\\\" type=\\\"hidden\\\" value=\\\"\\\" size=\\\"50\\\" style=\\\"width:300px\\\">\"+\n\t\"\\n<input name=\\\"jsonUpdate\\\" onfocus=\\\"this.blur()\\\" type=\\\"submit\\\" value=\\\"Set value\\\">&nbsp;\\n<br><br>\"+\n\t\"\\n<input name=\\\"jsonAddChild\\\" onfocus=\\\"this.blur()\\\" type=\\\"button\\\"  value=\\\"Add child\\\">\"+\n\t\"\\n<input name=\\\"jsonAddSibling\\\" onfocus=\\\"this.blur()\\\" type=\\\"button\\\"  value=\\\"Add sibling\\\">\\n<br><br>\"+\n\t\"\\n<input name=\\\"jsonRemove\\\" onfocus=\\\"this.blur()\\\" type=\\\"button\\\"  value=\\\"Delete\\\">&nbsp;\"+\n\t\"\\n<input name=\\\"jsonRename\\\" onfocus=\\\"this.blur()\\\" type=\\\"button\\\"  value=\\\"Rename\\\">&nbsp;\"+\n\t\"\\n<input name=\\\"jsonCut\\\" onfocus=\\\"this.blur()\\\" type=\\\"button\\\" value=\\\"Cut\\\">&nbsp;\"+\n\t\"\\n<input name=\\\"jsonCopy\\\" onfocus=\\\"this.blur()\\\" type=\\\"button\\\"  value=\\\"Copy\\\">&nbsp;\"+\n\t\"\\n<input name=\\\"jsonPaste\\\" onfocus=\\\"this.blur()\\\" type=\\\"button\\\" value=\\\"Paste\\\">&nbsp;\\n<br><br>\"+\n\t\"\\n<input type=\\\"checkbox\\\" name=\\\"jbefore\\\">Add children first/siblings before\\n<br>\"+\n\t\"\\n<input type=\\\"checkbox\\\" name=\\\"jPasteAsChild\\\">Paste as child on objects & arrays\\n<br><br><div id=\\\"jformMessage\\\"></div>\\n</form></div>\";\n\t\t\t\t\nEditJsonWidget.prototype.formsetup = function(f) {\n\tvar instance = this.instance\n\tvar fs=f.style\n\tfs.fontSize=fs.fontSize=\"11px\"\n\tfs.fontFamily=fs.fontFamily=\"Verdana,Arial,Helvetica,sans-serif\"\n\tvar e=f.getElementsByTagName(\"*\");\n\tfor(var i=0;i<e.length;i++){\n\t\tvar s=e[i].style\n\t\tif(!!s){\n\t\t\ts.fontSize=\"11px\"\n\t\t\ts.fontFamily=\"Verdana,Arial,Helvetica,sans-serif\"\n\t\t}\n\t\tvar cb= e[i].name\n\t\tif (!!cb ) switch (cb) {\n\t\t\tcase 'jsoninput': if (this.onkeyupdate!==\"yes\") e[i].addEventListener(\"submit\", function (e) {\n\t\t\t\te.preventDefault();\n\t\t\t\tinstance.jsonChange(e.target);\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tbreak;\n\t\t\tcase 'jlabel': if (this.onkeyupdate===\"yes\") e[i].addEventListener(\"input\", function (e) {\n\t\t\t\t//e.preventDefault();\n\t\t\t\tinstance.jsonChange(e.target.parentNode);\n\t\t\t\treturn false;\n\t\t\t});\n\t\t\tbreak;\n\t\t\tcase 'jvalue': if (this.onkeyupdate===\"yes\") e[i].addEventListener(\"input\", function (e) {\n\t\t\t\t//e.preventDefault();\n\t\t\t\tinstance.jsonChange(e.target.parentNode);\n\t\t\t\treturn false;\n\t\t\t});\n\t\t\tbreak;\n\t\t\tcase 'jsonUpdate': if (this.onkeyupdate===\"yes\") e[i].style.display = 'none';\n\t\t\tbreak;\n\t\t\tcase 'jtype': e[i].addEventListener(\"change\", function (e) {\n\t\t\t\tinstance.changeJsonDataType(e.target.value,e.target.parentNode);\n\t\t\t});\n\t\t\tbreak;\n\t\t\tcase 'jsonAddChild':e[i].addEventListener(\"click\", function (e) {\n\t\t\t\tinstance.jsonAddChild(e.target.parentNode);\n\t\t\t});\n\t\t\tbreak;\n\t\t\tcase 'jsonAddSibling': e[i].addEventListener(\"click\", function (e) {\n\t\t\t\tinstance.jsonAddSibling(e.target.parentNode);\n\t\t\t});\n\t\t\tbreak;\n\t\t\tcase 'jsonRemove': e[i].addEventListener(\"click\", function (e) {\n\t\t\t\tinstance.jsonRemove(e.target.parentNode);\n\t\t\t});\n\t\t\tbreak;\n\t\t\tcase 'jsonRename': e[i].addEventListener(\"click\", function (e) {\n\t\t\t\tinstance.jsonRename(e.target.parentNode);\n\t\t\t});\n\t\t\tbreak;\n\t\t\tcase 'jsonCut': e[i].addEventListener(\"click\", function (e) {\n\t\t\t\tinstance.jsonCut(e.target.parentNode);\n\t\t\t});\n\t\t\tbreak;\n\t\t\tcase 'jsonCopy':e[i].addEventListener(\"click\", function (e) {\n\t\t\t\tinstance.jsonCopy(e.target.parentNode);\n\t\t\t});\n\t\t\tbreak;\n\t\t\tcase 'jsonPaste': e[i].addEventListener(\"click\", function (e) {\n\t\t\t\tinstance.jsonPaste(e.target.parentNode);\n\t\t\t});\n\t\t\tbreak;\n\t\t\tdefault:\n\t\t}\n\t}\n}\n/*\nGet the tiddler being edited and current value\n*/\nEditJsonWidget.prototype.getEditInfo = function() {\n\t// Get the edit value\n\tvar self = this,\n\t\tvalue,\n\t\tupdate;\n\tif(this.editIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\tupdate = function(value) {\n\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t// Get the current tiddler and the field name\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t} else {\n\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\tvalue = '{}';\n\t\t}\n\n\t\tupdate = function(value) {\n\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\tupdateFields = {\n\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t};\n\t\t\tupdateFields[self.editField] = value;\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t};\n\t}\n\treturn {value: value, update: update};\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditJsonWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\tthis.onkeyupdate = this.getAttribute(\"onkeyupdate\",\"yes\"); \n\t// Get the editor element tag and type\n\tvar tag,type;\n\tif(this.editField === \"text\") {\n\t\ttag = \"textarea\";\n\t} else {\n\t\ttag = \"input\";\n\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\ttag = fieldModule.editTag;\n\t\t}\n\t\tif(fieldModule && fieldModule.editType) {\n\t\t\ttype = fieldModule.editType;\n\t\t}\n\t\ttype = type || \"text\";\n\t}\n\t// Get the rest of our parameters\n\tthis.editTag = this.getAttribute(\"tag\",tag);\n\tthis.editType = this.getAttribute(\"type\",type);\n\ttry {\n\t var data=$tw.wiki.getTiddlerData(\"$:/plugins/bj/jsoneditor/options.json\");\n\t this.onkeyupdate=(data['onkeyupdate'])?data['onkeyupdate']:'yes';\n\t this.format=(data['format'])?data['format']:'';\n\t} catch(e){ \n\t\talert(\"invalid style format\");\n\t\tthis.onkeyupdate=\"yes\";\n\t\tthis.format='';\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditJsonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Completely rerender if any of our attributes have changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.editTitle]) {\n\t\t//this.refreshSelf();//BJ FIXME saving cause the widget to get redrawn\n\t\treturn true;\n\t}\n\treturn false;\n};\n\n\n/*\nHandle a dom \"input\" event\n*/\nEditJsonWidget.prototype.handleInputEvent = function(event) {\n\tthis.saveChanges(JSON.stringify(this.json));\n\treturn true;\n};\n\nEditJsonWidget.prototype.handleFocusEvent = function(event) {\n\tif(this.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.editFocusPopup,\n\t\t\twiki: this.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\nEditJsonWidget.prototype.saveChanges = function(text) {\n\tvar editInfo = this.getEditInfo();\n\tif(text !== editInfo.value) {\n\t\teditInfo.update(text);\n\t}\n};\n\nexports[\"edit-json\"] = EditJsonWidget;\n\n})();\n",
            "title": "$:/plugins/bj/jsoneditor/edit-json.js",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/plugins/bj/jsoneditor/docNode.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/docNode.gif",
            "module-type": "library",
            "text": "R0lGODlhEAAWALMAAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yH5BAEAAA8AIf4cVWxlYWQgR0lGIFNtYXJ0U2F2ZXIgVmVyIDIuMAAsAAAAABAAFgBABCDwyUmrvTjrzbv/YChywFd6Z5eST+m217rJGp3ZGB5jEQA7"
        },
        "$:/plugins/bj/jsoneditor/folderNodeLastFirst.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/folderNodeLastFirst.gif",
            "module-type": "library",
            "text": "R0lGODlhEAAWAPcLAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAsALAAAAAAQABYAAAhFABcIHEiwoMGDCBMqXMiwIICHECEeBDCxosB/Ayka1LgAo0COBCn+GzlyAcWTGQd6NGmxY8qNLUNGjNiwps2bOHPq3BkQADs="
        },
        "$:/plugins/bj/jsoneditor/folderNodeLast.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/folderNodeLast.gif",
            "module-type": "library",
            "text": "R0lGODlhEAAWALMAAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yH5BAEAAAEALAAAAAAQABYAAAQvMMhJq5Xg6n0z/xUgjmNnWl4gTCmVrpgpzHOQ3ewE26eaoz0XiQQqGo/IpHKpiQAAOw=="
        },
        "$:/plugins/bj/jsoneditor/doc.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/doc.gif",
            "module-type": "library",
            "text": "R0lGODlhGAAWAPcAAP39/vf//+f3/+fv9+fv7+fn597v/9bv/9bn98zs/87n/8bn/97n78be/87W/73e/7XW/63W/6XW/73O/63O97XG562197W956W13qWt1pyl1oSl3oSczoyUvWb//2bM/2ut50Kl93uUxnuEzkKM1jOZ/3OEvTMzzGtzpWZmmTMAmWNjYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///ywAAAAAGAAWAEAIxgD/CRxIsKDBghsAqDjB8ICKhwoqrDhI0ASChyooUIjAUcKFiRQFJgQAIEBJABtAgAwpkEMBjDAzTljJsqbNmywTqvCQIMUBBA4cWLBA8+CGADExPphZcwSDpBAoTKBQ9OCKq1izXsXJ1eCGr2DBVqWYsITZEgEGhAhBYixChR8+pCggwIABBR9rHh0w4OeBnwoaSNRLwC6CAw0CL6AwmKUIBocRLEgMISrVmiYYKFAwmUJlCh7dDkSBIYOG06hPdxDdtTXXgAA7"
        },
        "$:/plugins/bj/jsoneditor/docNodeLastFirst.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/docNodeLastFirst.gif",
            "module-type": "library",
            "text": "R0lGODlhEAAWALMAAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yH5BAEAAA8ALAAAAAAQABYAQAQY8MlJq7046827/2AojmQJAg+qpmbrvlIEADs="
        },
        "$:/plugins/bj/jsoneditor/folderNodeOpen.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/folderNodeOpen.gif",
            "module-type": "library",
            "text": "R0lGODlhEAAWALMAAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAAP///yH5BAEAAAsALAAAAAAQABYAAAQucMlJq5Xg6n0z/xUgjmNnWl54qugivO+SzVNK2fV66zVJgkBMcCgkBnHGDVISAQA7"
        },
        "$:/plugins/bj/jsoneditor/folderNodeOpenLastFirst.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/folderNodeOpenLastFirst.gif",
            "module-type": "library",
            "text": "R0lGODlhEAAWAPcLAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAsALAAAAAAQABYAAAg8ABcIHEiwoMGDCBMqXMiwIICHECEeBDCxokGKFy06XPCvY8cFFEMOxLgxo8mSKAlGXNmwpcuXMGPKnBkQADs="
        },
        "$:/plugins/bj/jsoneditor/docNodeLast.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/docNodeLast.gif",
            "module-type": "library",
            "text": "R0lGODlhEAAWALMAAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yH5BAEAAA8AIf4cVWxlYWQgR0lGIFNtYXJ0U2F2ZXIgVmVyIDIuMAAsAAAAABAAFgBABBvwyUmrvTjrzbv/YChywFd6Z5eST+m2YyzPXgQAOw=="
        },
        "$:/plugins/bj/jsoneditor/folderNode.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/folderNode.gif",
            "module-type": "library",
            "text": "R0lGODlhEAAWALMAAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwAAAAAAAAAAAAP///yH5BAEAAAsALAAAAAAQABYAAAQycMlJq5Xg6n0z/xUgjmNnWt4iTCmVrpgpzPOS3ewE26eaoz0XiQQqxoxIXtLYWnKakwgAOw=="
        },
        "$:/plugins/bj/jsoneditor/folder.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/folder.gif",
            "module-type": "library",
            "text": "R0lGODlhGAAWAPcAAAAAAP//mf/3kf/0jv/rhf/mgP/gev/UbplmAJpnAZxpA55rBaBtB6NwCqVyDKh1D6t4Eq57FbB9F7OAGrSBG7WCHLeEHriFH7qHIbyJI72KJL+MJsCNJ8KPKcWSLMeULsmWMMuYMsyZM9OgOtypQ+azTe+8VvjFX//MZv///2ZmZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAGAAWAEAIswBTCBxIsKDBgSAIFPDAsCGHDBcoTJhwkKCKixgzYqw4UEQIEB84cuSAwkMAAihToiwRQIEKkTBjyhQpIkWAmwFSaMBgocIECTA9HBCBs+jNEwEYvDyIAcWFAAeiSo06IgCCpTOzat26tebADltDCBhAlmzBCFgPfjDggWOBFA3SEuyAIkQAAXjz4jURYIHcgRpQbAhgoLDhwiQCJPg70KeECBAeOGjAYIGCBFcZc93MWWtAADs="
        },
        "$:/plugins/bj/jsoneditor/vertLine.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/vertLine.gif",
            "module-type": "library",
            "text": "R0lGODlhEAAWALMAAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yH5BAEAAA8AIf4cVWxlYWQgR0lGIFNtYXJ0U2F2ZXIgVmVyIDIuMAAsAAAAABAAFgBABBnwyUmrvTjrzbv/YChywFd6Z5eSZou6KlxFADs="
        },
        "$:/plugins/bj/jsoneditor/JSONeditor.js": {
            "type": "application/javascript",
            "title": "$:/plugins/bj/jsoneditor/JSONeditor.js",
            "module-type": "library",
            "text": "/*\njsonEditor 1.02\ncopyright 2007-2009 Thomas Frank\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n*/\n\nJSONeditor={\n\tstart:function(treeDivName,formDivName,json,imagepath,format,updater){\n\n\t\treturn new this.treeBuilder(treeDivName,formDivName,json,imagepath,format,updater)\n\t}\n}\n\n/*\ntreeBuilder v 1.00 + a lot of json stuff added...\ncopyright 2007 Thomas Frank\n*/\nJSONeditor.treeBuilder=function(treeDivName,f,json,imagepath,format,updater){\n\tvar self = this,$=this.$\n\tvar s=$(treeDivName).style\n\t\n\tjson=json||{}\n\t\n\tthis.form = f\n\tthis.forSaving=function(){\n\t\t//updating can be done externally, so this function may be null\n\t\tif(!!updater) updater(this.JSONstring(this.json,null,this.format));\n\t}\n\tthis.stateMem={}\n\tthis.images={\n\t\tfolderNode:'',\n\t\tfolderNodeOpen:'',\n\t\tfolderNodeLast:'',\n\t\tfolderNodeOpenLast:'',\n\t\tdocNode:'',\n\t\tdocNodeLast:'',\n\t\tfolder:'',\n\t\tfolderOpen:'',\n\t\tdoc:'',\n\t\tvertLine:'',\n\t\tfolderNodeFirst:'',\n\t\tfolderNodeOpenFirst:'',\n\t\tfolderNodeLastFirst:'',\n\t\tfolderNodeOpenLastFirst:'',\n\t\tpath:imagepath,\n\t\tnodeWidth:16\n\t}\n\tthis.format = format;\n\tthis.JSONbuild(treeDivName,json)//sets up the instance \n}\n\n\tJSONeditor.treeBuilder.prototype.$=function(x){return document.getElementById(x)}\n\tJSONeditor.treeBuilder.prototype.preParse=function(x){\n\t\tvar x=x.innerHTML.split(\"\\n\");\n\t\tvar d=[];\n\t\tfor(var i=0;i<x.length;i++){\n\t\t\tif(x[i]){\n\t\t\t\tvar y=x[i].split(\"\\t\");\n\t\t\t\tvar l=0;while(!y[l]){l++};\n\t\t\t\tvar la=y[l]?y[l]:'';l++;\n\t\t\t\tvar t=y[l]?y[l]:'';\n\t\t\t\td.push({level:l,label:la,todo:t});\n\t\t\t}\n\t\t};\n\t\treturn d\n\t}\n\tJSONeditor.treeBuilder.prototype.isArray=function(x){\n\t\treturn x.constructor==Array\n\t}\n\tJSONeditor.treeBuilder.prototype.jSyncTree=function(x){\n\t\tvar d=this.$(this.baseDiv).getElementsByTagName('div')\n\t\tfor(var i=0;i<d.length;i++){\n\t\t\t\n\t\t\tthis.maniClick=\"giveItBack\"\n\t\t\tvar p=d[i].onclick()\n\t\t\tif(p==x){\n\t\t\t\tvar t=d[i]\n\t\t\t\tthis.maniClick=\"selectIt\"\n\t\t\t\tt.onclick()\n\t\t\t\tt=t.parentNode\n\t\t\t\twhile(t.id!=this.baseDiv){if(t.style){this.openAndClose(t.id,\"open\")};t=t.parentNode}\n\t\t\t}\n\t\t}\n\t\tthis.maniClick=false\n\t}\n\tJSONeditor.treeBuilder.prototype.jsonResponder=function(x){\n\t\tthis.jTypeChanged=false\n\t\tthis.jSyncTree(x)\n\t\tvar t=this\n\t\teval(\"var a=this.\"+x)\n\t\teval(\"var ap=this.\"+this.jsonParent(x))\n\t\tvar b=t.JSONstring(a)\n\t\tvar t=(a && this.isArray(a))?\"array\":typeof a\n\t\tvar tp=(ap && this.isArray(ap))?\"array\":typeof ap\n\t\tif(a===null){t=\"null\"}\n\t\tvar f=this.form\n\t\tif(t==\"string\"){eval(\"b=\"+b)}\n\t\tf.jlabel.value=x\n\t\tf.orgjlabel.value=x\n\t\tf.jvalue.value=b\n\t\tf.jtype.value=t\n\t\tf.jlabel.disabled=f.jlabel.value==\"json\"\n\t\tf.jtype.disabled=f.jlabel.disabled\n\t\tf.jsonRemove.disabled=f.jlabel.disabled\n\t\tf.jsonAddSibling.disabled=f.jlabel.disabled\n\t\tf.jsonRename.disabled=f.jlabel.disabled || tp==\"array\"\n\t\tf.jsonAddChild.disabled=t!=\"array\" && t!=\"object\"\n\t\tf.jsonPaste.disabled=!this.jClipboard\n\t\tf.jsonCut.disabled=f.jlabel.disabled\n\t}\n\tJSONeditor.treeBuilder.prototype.jsonParent=function(x){          \n\t\t// inmproved thanks to \\x000\n\t\tif(x==\"json\"){return \"this\"} \n\t\tif (x.charAt(x.length-1)==']') {return x.substring(0,x.lastIndexOf('['))}                  \n\t\treturn x.substring(0,x.lastIndexOf('.'))     \n\t}\t\n\tJSONeditor.treeBuilder.prototype.jsonChild=function(el1){\n\t\tvar p=this.jsonParent(el1)\n\t\tel1=el1.split(p).join(\"\")\n\t\tif(el1.charAt(0)==\".\"){el1=el1.substring(1)}\n\t\tif(el1.charAt(0)==\"[\"){el1=el1.substring(2,el1.length-2)}\n\t\treturn el1\n\t}\n\tJSONeditor.treeBuilder.prototype.jsonRemove=function(f){\n\t\tthis.jsonChange(f,true)\n\t}\n\tJSONeditor.treeBuilder.prototype.jsonAlreadyExists=function(o,l){\n\t\tif(o[l]!==undefined){\n\t\t\tvar co=2\n\t\t\twhile(o[l+\"_\"+co]!==undefined){co++}\n\t\t\tvar n=l+\"_\"+co\n\t\t\tvar p='\"'+l+'\" already exists in this object.\\nDo you want to rename? (otherwise the old \"'+l+'\" will be overwritten.)'\n\t\t\tp=prompt(p,n)\n\t\t\tif(p){l=p}\n\t\t}\n\t\treturn l\n\t}\n\tJSONeditor.treeBuilder.prototype.jsonAddChild=function(f,label){\n\t\tvar first=f.jbefore.checked\n\t\tvar l=f.orgjlabel.value\n\t\teval('var o=this.'+l)\n\t\tvar t=(o && this.isArray(o))?\"array\":typeof o\n\t\tif(t==\"object\"){\n\t\t\tvar nl=label||prompt(\"Label (without path):\",\"\")\n\t\t\tif(!nl){return}\n\t\t\tif(nl/1==nl){nl=\"$\"+nl}\n\t\t\tnl=this.jsonAlreadyExists(o,nl)\n\t\t\tvar n=nl.replace(/\\w/g,'')===\"\"?l+\".\"+nl:l+'[\"'+nl+'\"]'\n\t\t\teval('this.'+n+'={}')\n\t\t\tif(first){\n\t\t\t\teval(\"var t=this.\"+l+\";this.\"+l+\"={};var s=this.\"+l)\n\t\t\t\teval('this.'+n+'={}')\n\t\t\t\tfor(var i in t){s[i]=t[i]}\t\t\t\t\n\t\t\t}\n\t\t}\n\t\tif(t==\"array\"){\n\t\t\to.push({})\n\t\t\tn=l+\"[\"+(o.length-1)+\"]\"\n\t\t\tif(first){\n\t\t\t\tfor(var i=o.length-1;i>0;i--){o[i]=o[i-1]}\n\t\t\t\to[0]={}\n\t\t\t\tn=l+\"[0]\"\n\t\t\t}\n\t\t}\n\t\tthis.JSONbuild(this.baseDiv,this.json)\n\t\tfor(var i in this.stateMem){this.openAndClose(i,true)}\n\t\tthis.jsonResponder(n)\n\t}\n\tJSONeditor.treeBuilder.prototype.jsonAddSibling=function(f,label){\n\t\tvar before=f.jbefore.checked\n\t\tvar l=f.orgjlabel.value\n\t\tvar r=Math.random()\n\t\teval('var temp=this.'+l)\n\t\teval('this.'+l+\"=r\")\n\t\tvar s=this.JSONstring(this.json)\n\t\ts=s.split(r+\",\")\n\t\tif(s.length<2){s=s[0].split(r)}\n\t\tvar lp=this.jsonParent(l)\n\t\teval('var o=this.'+lp)\n\t\tvar t=(o && this.isArray(o))?\"array\":typeof o\n\t\tif(t==\"object\"){\n\t\t\tvar nl=label||prompt(\"Label (without path):\",\"\")\n\t\t\tif(!nl){return}\n\t\t\tif(nl/1==nl){nl=\"$\"+nl}\n\t\t\tnl=this.jsonAlreadyExists(o,nl)\n\t\t\tvar n=nl.replace(/\\w/g,'')===\"\"?\".\"+nl:'[\"'+nl+'\"]'\n\t\t\ts=s.join('null,\"'+nl+'\":{},')\n\t\t\tlp+=n\n\t\t}\n\t\tif(t==\"array\"){\n\t\t\ts=s.join('null,{},')\n\t\t\tvar k=l.split(\"[\")\n\t\t\tk[k.length-1]=(k[k.length-1].split(\"]\").join(\"\")/1+1)+\"]\"\n\t\t\tlp=k.join(\"[\")\n\t\t}\n\t\ts=s.split(\"},}\").join(\"}}\") // replace with something better soon\n\t\teval('this.json='+s)\n\t\teval('this.'+l+'=temp')\n\t\tif(before){lp=this.jsonSwitchPlace(this.jsonParent(l),l,lp)}\n\t\tthis.JSONbuild(this.baseDiv,this.json)\n\t\tfor(var i in this.stateMem){this.openAndClose(i,true)}\n\t\tthis.jsonResponder(lp)\n\t}\n\tJSONeditor.treeBuilder.prototype.jSaveFirst=function(f,a){\n\t\tvar l=f.orgjlabel.value\n\t\teval(\"var orgj=this.\"+l)\n\t\torgj=this.JSONstring(orgj)\n\t\tvar v=f.jvalue.value\n\t\tv=f.jtype.value==\"string\"?this.JSONstring(v):v\n\t\tv=v.split(\"\\r\").join(\"\")\n\t\tif(orgj!=v || f.orgjlabel.value!=f.jlabel.value || this.jTypeChanged){\n\t\t\tvar k=confirm(\"Save before \"+a+\"?\")\n\t\t\tif(k){this.jsonChange(f)}\n\t\t}\n\t}\n\tJSONeditor.treeBuilder.prototype.jsonRename=function(f){\n\t\tthis.jSaveFirst(f,\"renaming\")\n\t\tvar orgl=l=f.orgjlabel.value\n\t\tl=this.jsonChild(l)\n\t\tvar nl=prompt(\"Label (without path):\",l)\n\t\tif(!nl){return}\n\t\tthis.jsonResponder(orgl)\n\t\tvar nl=nl.replace(/\\w/g,'')===\"\"?\".\"+nl:'[\"'+nl+'\"]'\n\t\tf.jlabel.value=this.jsonParent(orgl)+nl\n\t\tthis.jsonChange(f,false,true)\n\t}\n\tJSONeditor.treeBuilder.prototype.jsonSwitchPlace=function(p,el1,el2){\n\t\tvar orgel1=el1, orgel2=el2\n\t\teval(\"var o=this.\"+p)\n\t\tif(this.isArray(o)){\n\t\t\teval(\"var t=this.\"+el1)\n\t\t\teval(\"this.\"+el1+\"=this.\"+el2)\n\t\t\teval(\"this.\"+el2+\"=t\")\n\t\t\treturn orgel1\n\t\t}\n\t\tel1=this.jsonChild(el1)\n\t\tel2=this.jsonChild(el2)\n\t\tvar o2={}\n\t\tfor(var i in o){\n\t\t\tif(i==el1){o2[el2]=o[el2];o2[el1]=o[el1];continue}\n\t\t\tif(i==el2){continue}\n\t\t\to2[i]=o[i]\n\t\t}\n\t\teval(\"this.\"+p+\"=o2\")\n\t\treturn orgel2\n\t}\n\tJSONeditor.treeBuilder.prototype.jsonCut=function(f){\n\t\tthis.jSaveFirst(f,\"cutting\")\n\t\tthis.jsonCopy(f,true)\n\t\tthis.jsonChange(f,true)\n\t\tthis.setJsonMessage('Cut to clipboard!')\n\t}\n\tJSONeditor.treeBuilder.prototype.jsonCopy=function(f,r){\n\t\tif(!r){this.jSaveFirst(f,\"copying\")}\n\t\tvar l=f.orgjlabel.value\n\t\teval(\"var v=this.\"+l)\n\t\tv=this.JSONstring(v)\n\t\tvar l=this.jsonChild(l)\n\t\tthis.jClipboard={label:l,jvalue:v}\n\t\tthis.jsonResponder(f.jlabel.value)\n\t\tif(!r){this.setJsonMessage('Copied to clipboard!')}\n\t}\n\tJSONeditor.treeBuilder.prototype.jsonPaste=function(f,r){\n\t\tvar t=f.jtype.value\n\t\tvar sibling=t!=\"object\" && t!=\"array\"\n\t\tif(!f.jPasteAsChild.checked){sibling=true}\n\t\tif(f.orgjlabel.value==\"json\"){sibling=false}\n\t\tif(sibling){this.jsonAddSibling(f,this.jClipboard.label)}\n\t\telse {this.jsonAddChild(f,this.jClipboard.label)}\n\t\tvar l=f.orgjlabel.value\n\t\teval(\"this.\"+l+\"=\"+this.jClipboard.jvalue)\n\t\tthis.jsonResponder(l)\n\t\tthis.jsonChange(f)\n\t\tif(!r){this.setJsonMessage('Pasted!')}\n\t}\n\tJSONeditor.treeBuilder.prototype.setJsonMessage=function(x){\n\t\tself = this;\n\t\tif (!!this.forSaving)this.forSaving();\n\t\tthis.$('jformMessage').innerHTML=x\n\t\tsetTimeout(\"self.$('jformMessage').innerHTML=''\",1500)\n\t}\n\tJSONeditor.treeBuilder.prototype.changeJsonDataType=function(x,f){\n\t\tthis.jTypeChanged=true\n\t\tvar v=f.jvalue.value\n\t\tvar orgv=v;\n\t\tv=x=='object'?'{\"label\":\"'+v+'\"}':v\n\t\tv=x=='array'?'[\"'+v+'\"]':v\n\t\tif(!orgv){\n\t\t\tv=x=='object'?'{}':v\n\t\t\tv=x=='array'?'[]':v\n\t\t}\n\t\tv=x=='string'?v:v\n\t\tv=x=='number'?v/1:v\n\t\tv=x=='boolean'?!!v:v\n\t\tv=x=='null'?'null':v\n\t\tv=x=='undefined'?'undefined':v\n\t\tf.jvalue.value=v\t\t\n\t}\n\tJSONeditor.treeBuilder.prototype.jsonChange=function(f,remove,rename){\n\t\ttry {\n\t\t\tvar l=f.jlabel.value\n\t\t\tvar orgl=f.orgjlabel.value||\"json.not1r2e3a4l\"\n\t\t\teval(\"var cur=this.\"+l)\n\t\t\tif(l!=orgl && cur!==undefined){\n\t\t\t\tvar c=confirm(l+\"\\n\\nalready contains other data. Overwrite?\")\n\t\t\t\tif(!c){return false}\n\t\t\t}\n\t\t\tvar v=f.jvalue.value.split(\"\\r\").join(\"\")\n\t\t\tif(f.jtype.value==\"string\"){\n\t\t\t\tv=this.JSONstring(v)\n\t\t\t}\n\t\t\tif(l==\"json\"){\n\t\t\t\teval(\"v=\"+v)\n\t\t\t\tthis.JSONbuild(this.baseDiv,v)\n\t\t\t\tfor(var i in this.stateMem){this.openAndClose(i,true)}\n\t\t\t\tthis.setJsonMessage('Saved!')\n\t\t\t\treturn false\n\t\t\t}\n\t\t\teval(\"var json=\"+this.JSONstring(this.json))\n\t\t\tvar randi=Math.random()\n\t\t\teval(orgl+'='+randi)\n\t\t\tvar paname=this.jsonParent(orgl)\n\t\t\tvar samepa=this.jsonParent(orgl)==this.jsonParent(l)\n\t\t\teval(\"var pa=\"+paname)\n\t\t\tif(this.isArray(pa)){\t\n\t\t\t\teval(paname+'=[];var newpa='+paname)\n\t\t\t\tfor(var i=0;i<pa.length;i++){\n\t\t\t\t\tif(pa[i]!=randi){newpa[i]=pa[i]}\n\t\t\t\t}\n\t\t\t\tif(remove){\n\t\t\t\t\tvar pos=l.substring(l.lastIndexOf(\"[\")+1,l.lastIndexOf(\"]\"))/1\n\t\t\t\t\tnewpa=newpa.splice(pos,1)\n\t\t\t\t}\n\t\t\t\tif(!remove){eval(l+\"=\"+v)}\n\t\t\t}\t\t\n\t\t\telse {\n\t\t\t\teval(paname+'={};var newpa='+paname)\n\t\t\t\tfor(var i in pa){\n\t\t\t\t\tif(pa[i]!=randi){newpa[i]=pa[i]}\n\t\t\t\t\telse if(samepa && !remove){eval(l+\"=\"+v)}\n\t\t\t\t}\n\t\t\t\tif(!samepa && !remove){eval(l+\"=\"+v)}\n\t\t\t}\n\t\t\tthis.json=json\n\t\t\tvar selId=this.selectedElement?this.selectedElement.id:null\n\t\t\tthis.JSONbuild(this.baseDiv,this.json)\n\t\t\tfor(var i in this.stateMem){this.openAndClose(i,true)}\n\t\t\tthis.selectedElement=this.$(selId)\n\t\t\tif(this.selectedElement && !remove && orgl!=\"json.not1r2e3a4l\"){\n\t\t\t\tthis.selectedElement.style.fontWeight=\"bold\"\n\t\t\t}\n\t\t\tif(remove){l=\"\"}\n\t\t\tthis.setJsonMessage(remove?'Deleted!':rename?'Renamed!':'Saved!')\n\t\t\tif(!remove){this.jsonResponder(l)}\n  \t\t}\n\t\tcatch(err){\n\t\t\talert(err+\"\\n\\n\"+\"Save error!\")\n\t\t}\n\t\treturn false\n\t}\n\tJSONeditor.treeBuilder.prototype.JSONbuild=function(divName,x,y,z){\n\t\tif(!z){\n\t\t\tthis.partMem=[]\n\t\t\tthis.JSONmem=[]\n\t\t\tthis.json=x\n\t\t\tthis.baseDiv=divName\n\t\t}\n\t\tvar t=(x && this.isArray(x))?\"array\":typeof x\n\t\ty=y===undefined?\"json\":y\n\t\tz=z||0\n\t\tthis.partMem[z]='[\"'+y+'\"]'\n\t\tif(typeof y!=\"number\" && y.replace(/\\w/g,'')===\"\"){this.partMem[z]=\".\"+y}\n\t\tif(typeof y==\"number\"){this.partMem[z]=\"[\"+y+\"]\"}\n\t\tif(z===0){this.partMem[z]=\"json\"}\n\t\tthis.partMem=this.partMem.slice(0,z+1)\n\t\tvar x2=x\n\t\tthis.JSONmem.push({type:t,label:y,todo:this.partMem.join(\"\"),level:z+1})\n\t\tif(t==\"object\"){\n\t\t\tfor(var i in x){\n\t\t\t\tthis.JSONbuild(false,x[i],i,z+1)\n\t\t\t}\n\t\t}\n\t\tif(t==\"array\"){\n\t\t\tfor(var i=0;i<x.length;i++){\n\t\t\t\tthis.JSONbuild(false,x[i],i,z+1)\n\t\t\t}\n\t\t}\n\t\tif(divName){\n\t\t\tthis.build(divName,this.jsonResponder,this.JSONmem)\n\t\t\tif(!this.hasRunJSONbuildOnce){this.jsonResponder('json')}\n\t\t\tthis.hasRunJSONbuildOnce=true\n\t\t}\n\t}\n\tJSONeditor.treeBuilder.prototype.build=function(divName,todoFunc,data){\n\t\t//\n\t\t// divName is the id of the div we'll build the tree inside\n\t\t//\n\t\t// todoFunc - a function to call on label click with todo as parameter\n\t\t//\n\t\t// data should be an array of objects\n\t\t// each object should contain label,todo + level or id and pid (parentId)\n\t\t//\n\t\tvar self = this;\n\t\tvar d=data, n=divName, $=this.$, lastlevel=0, levelmem=[], im=this.images;\n\t\tthis.treeBaseDiv=divName\n\t\tif(!d){\n\t\t\tvar c=$(divName).childNodes;\n\t\t\tfor(var i=0;i<c.length;i++){\n\t\t\t\tif((c[i].tagName+\"\").toLowerCase()=='pre'){d=this.preParse(c[i])}\n\t\t\t};\n\t\t\tif(!d){return}\n\t\t};\n\t\t$(n).style.display=\"none\";\n\t\twhile ($(n).firstChild){$(n).removeChild($(n).firstChild)};\n\t\tfor(var i=0;i<d.length;i++){\n\t\t\tif(d[i].level && !lastlevel){lastlevel=d[i].level};\n\t\t\tif(d[i].level && d[i].level>lastlevel){levelmem.push(n);n=d[i-1].id};\n\t\t\tif(d[i].level && d[i].level>lastlevel+1){return 'Trying to jump levels!'};\n\t\t\tif(d[i].level && d[i].level<lastlevel){\n\t\t\t\tfor(var j=d[i].level;j<lastlevel;j++){n=levelmem.pop()}\n\t\t\t};\n\t\t\tif(!d[i].id){d[i].id=n+\"_\"+i};\n\t\t\tif(!d[i].pid){d[i].pid=n};\n\t\t\tlastlevel=d[i].level;\n\t\t\tvar a=document.createElement('div');\n\t\t\tvar t=document.createElement('span');\n\t\t\tt.style.verticalAlign='middle';\n\t\t\ta.style.whiteSpace='nowrap';\n\t\t\tvar t2=document.createTextNode(d[i].label);\n\t\t\tt.appendChild(t2);\n\t\t\ta.style.paddingLeft=d[i].pid==divName?'0px':im.nodeWidth+'px';\n\t\t\ta.style.cursor='pointer';\n\t\t\ta.style.display=(d[i].pid==divName)?'':'none';\n\t\t\ta.id=d[i].id;\n\t\t\ta.t=t;\n\t\t\t(function(){\n\t\t\t\tvar todo=d[i].todo;\n\t\t\t\t//var func=todoFunc;\n\t\t\t\ta.onclick=function(e){\n\t\t\t\t\tif(self.maniClick==\"giveItBack\"){return todo}\n\t\t\t\t\tif(self.selectedElement){\n\t\t\t\t\t\tself.selectedElement.style.fontWeight=\"\"\n\t\t\t\t\t}\n\t\t\t\t\tthis.style.fontWeight=\"bold\"\n\t\t\t\t\tself.selectedElement=this\n\t\t\t\t\tif(self.maniClick==\"selectIt\"){return}\n\t\t\t\t\tself.jsonResponder.call(self,todo);\n\t\t\t\t\tif (!e){e=window.event};\n\t\t\t\t\te.cancelBubble = true;\n\t\t\t\t\tif(e.stopPropagation){e.stopPropagation()};\n\t\t\t\t};\n\t\t\t\ta.onmouseover=function(e){\n\t\t\t\t\t//this.style.color=\"#999\"\n\t\t\t\t\tif (!e){e=window.event};\n\t\t\t\t\te.cancelBubble = true;\n\t\t\t\t\tif(e.stopPropagation){e.stopPropagation()};\n\t\t\t\t};\n\t\t\t\ta.onmouseout=function(e){\n\t\t\t\t\t//this.style.color=\"\"\n\t\t\t\t\tif (!e){e=window.event};\n\t\t\t\t\te.cancelBubble = true;\n\t\t\t\t\tif(e.stopPropagation){e.stopPropagation()};\n\t\t\t\t};\n\t\t\t}\n\t\t\t)();\n\t\t\t$(d[i].pid).appendChild(a);\n\t\t\tif(d[i].pid==divName && !a.previousSibling){a.first=true};\n\t\t};\n\t\t// calculate necessary element looks before initial display\n\t\tfor(var i=0;i<d.length;i++){var x=$(d[i].id);if(x && x.style.display!=\"none\"){this.setElementLook(x)}};\n\t\t$(divName).style.display=\"\";\n\t}\n\tJSONeditor.treeBuilder.prototype.setElementLook=function(m){\n\t\tvar $=this.$, im=this.images, self = this\n\t\tif(!m.inited){\n\t\t\tvar co=0\n\t\t\tfor(var j in im){\n\t\t\t\tif(!Object.prototype[j]){\n\t\t\t\t\tif(j==\"vertLine\"){break};\n\t\t\t\t\tvar img=document.createElement('img');\n\t\t\t\t\tvar k=(m.first && j.indexOf('Node')>=0)?j+'First':j;\n\t\t\t\t\timg.src=\"data:image/png;base64,\"+ $tw.wiki.getTiddlerText(im.path+(im[k]?im[k]:k+'.gif'));\n\t\t\t\t\timg.style.display=\"none\";\n\t\t\t\t\timg.style.verticalAlign=\"middle\";\n\t\t\t\t\timg.id=m.id+\"_\"+j;\n\t\t\t\t\tif(j.indexOf('folderNode')==0){\n\t\t\t\t\t\timg.onclick=function(e){\n\t\t\t\t\t\t\tself.openAndClose.call(self,this);\n\t\t\t\t\t\t\tif (!e){e=window.event};\n\t\t\t\t\t\t\te.cancelBubble = true;\n\t\t\t\t\t\t\tif(e.stopPropagation){e.stopPropagation()};\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tif(m.firstChild){m.insertBefore(img,m.childNodes[co]); co++}\n\t\t\t\t\telse {m.appendChild(img)};\n\t\t\t\t}\n\t\t\t};\n\t\t\tm.insertBefore(m.t,m.childNodes[co]);\n\t\t\tm.inited=true\n\t\t};\n\t\tvar lastChild=m.childNodes[m.childNodes.length-1];\n\t\tvar isParent=(lastChild.tagName+\"\").toLowerCase()==\"div\";\n\t\tvar isLast=!m.nextSibling;\n\t\tvar isOpen=isParent && lastChild.style.display!='none';\n\t\t$(m.id+\"_folder\").style.display=!isOpen && isParent?'':'none';\n\t\t$(m.id+\"_folderOpen\").style.display=isOpen && isParent?'':'none';\n\t\t$(m.id+\"_doc\").style.display=isParent?'none':'';\n\t\t$(m.id+\"_docNode\").style.display=isParent || isLast?'none':'';\n\t\t$(m.id+\"_docNodeLast\").style.display=isParent || !isLast?'none':'';\n\t\t$(m.id+\"_folderNode\").style.display=isOpen || !isParent || isLast?'none':'';\n\t\t$(m.id+\"_folderNodeLast\").style.display=isOpen || !isParent || !isLast?'none':'';\n\t\t$(m.id+\"_folderNodeOpen\").style.display=!isOpen || !isParent || isLast?'none':'';\n\t\t$(m.id+\"_folderNodeOpenLast\").style.display=!isOpen || !isParent || !isLast?'none':'';\n\t\tvar p=m.parentNode.nextSibling;\n\t\tif(p && p.id){\n\t\t\tvar sp=p;insideBase=false;\n\t\t\twhile(sp){if(sp==$(this.treeBaseDiv)){insideBase=true};sp=sp.parentNode}\n\t\t\tif(!insideBase){return}\n\t\t\tvar bg=\"data:image/png;base64,\"+ $tw.wiki.getTiddlerText(im.path+(im.vertLine?im.vertLine:'vertLine.gif'));\n\t\t\tm.style.backgroundImage='url('+bg+')';\n\t\t\tm.style.backgroundRepeat='repeat-y'\n\t\t};\n\t}\n\tJSONeditor.treeBuilder.prototype.openAndClose=function(x,remem){\n\t\tvar o, div=remem?this.$(x):x.parentNode;\n\t\tif(!div){return}\n\t\tif(remem){o=this.stateMem[div.id]}\n\t\telse {o=x.id.indexOf('Open')<0}\n\t\tif(remem==\"open\"){o=true}\n\t\tthis.stateMem[div.id]=o\n\t\tvar c=div.childNodes;\n\t\tfor(var i=0;i<c.length;i++){\n\t\t\tif(c[i].tagName.toLowerCase()!=\"div\"){continue};\n\t\t\tc[i].style.display=o?'':'none';\n\t\t\tif(o && !c[i].inited){this.setElementLook(c[i])}\n\t\t};\n\t\tthis.setElementLook(div)\n\t}\n\n\n\nJSONeditor.treeBuilder.prototype.JSONstring=function(arg,restore) { \n\t\treturn JSON.stringify(arg,null,this.format );\n}\n"
        },
        "$:/plugins/bj/jsoneditor/folderOpen.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/folderOpen.gif",
            "module-type": "library",
            "text": "R0lGODlhGAAWAMQAAP////z+/Pz69Pz+nPz6lPz2lPzyjPTyjPzqhPzmhPTmfPzefPzWhPzWbMzKzPzGXOTCTOS+VNy+bOy6RMy+XNS6POSyRMyiJMSeHMSaHLyaLMSWHJx6HKRyDP4BAgAAACH5BAEAAB4ALAAAAAAYABYAAAV7ICCOZGmeaKqubHte8OWWchAA2SzmQz/gmWBwlTEYjzabIMNRZRAQoVTaSWUYGElyG0gEqqhM4+krDx4F8CljuQwIBji8UIhQ1KbMpTJA+P9+E3h5GQoECguIigsXgyUbGwcNk5SUGo6PkJqbG00sHKChojqkpaanqKghADs="
        },
        "$:/plugins/bj/jsoneditor/folderNodeFirst.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/folderNodeFirst.gif",
            "module-type": "library",
            "text": "R0lGODlhEAAWAPcLAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAsALAAAAAAQABYAAAhLABcIHEiwoMGDCBMqXMiwIICHECEeBDCxosB/Ayka1LgAo0COBCn+GzlyAcWTGQd6NGmxY8qNLUNGjNiwJsiaDW/iXKhzZ8KeCwICADs="
        },
        "$:/plugins/bj/jsoneditor/folderNodeOpenFirst.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/folderNodeOpenFirst.gif",
            "module-type": "library",
            "text": "R0lGODlhEAAWAPcLAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAsALAAAAAAQABYAAAhBABcIHEiwoMGDCBMqXMiwIICHECEeBDCxokGKFy06XPCvY8cFFEMOxLgxo8mSKAlGXNmwJcmWLmHKfClzIc2BAQEAOw=="
        },
        "$:/plugins/bj/jsoneditor/folderNodeOpenLast.gif": {
            "type": "image/png",
            "title": "$:/plugins/bj/jsoneditor/folderNodeOpenLast.gif",
            "module-type": "library",
            "text": "R0lGODlhEAAWALMAAICAgP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yH5BAEAAAEALAAAAAAQABYAAAQqMMhJq5Xg6n0z/xUgjmNnWl54qmggvG+QzVNK2fV66zVJgsCgcEgsGjURADs="
        },
        "$:/plugins/bj/jsoneditor/license": {
            "title": "$:/plugins/bj/jsoneditor/license",
            "text": "The MIT License (MIT)\n\nCopyright (c) 2014 Jeffrey Wikinson aka buggyj\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
        },
        "$:/plugins/bj/jsoneditor/options.json": {
            "title": "$:/plugins/bj/jsoneditor/options.json",
            "type": "application/json",
            "text": "{\n\"onkeyupdate\":\"no\",\n\"format\":2\n}\n"
        },
        "$:/plugins/bj/jsoneditor/readme": {
            "title": "$:/plugins/bj/jsoneditor/readme",
            "text": "Presents json as a tree to be edited. Note that on keypress updating is disabled as a default, there is a 'set value' button that is used to enter values. \n\nOptions are provide via the file: $:/plugins/bj/jsoneditor/options.json. On keypress updating can be switched on but may be slow due to the editor compiling the json. The other option controls the pretty printing indent spacing.\n\nProject home: http://bjtools.tiddlyspot.com\n\nThis widget is an adaption to TW5 of software of the same name. The orignial can be seen here:\n\nhttp://www.thomasfrank.se/downloadableJS/JSONeditor_example.html \n"
        }
    }
}
{
    "tiddlers": {
        "MDL": {
            "created": "20160215120312455",
            "modified": "20160216160312656",
            "tags": "md+",
            "title": "MDL",
            "type": "application/json",
            "text": "{\n  \"parserrules\": {\n    \"pragmaRuleList\": [\n      \"macrodef\",\n      \"rules\"\n    ],\n    \"blockRuleList\": [\n      \"codeblock\",\n      \"commentblock\",\n      \"filteredtranscludeblock\",\n      \"headingmod\",\n      \"horizrule\",\n      \"html\",\n      \"listdigit\",\n      \"listmod\",\n      \"macrocallblock\",\n      \"quoteblock\",\n      \"styleblock\",\n      \"table\",\n      \"transcludeblock\",\n      \"typedblock\"\n    ],\n    \"inlineRuleList\": [\n      \"strong\",\n      \"codeinline\",\n      \"commentinline\",\n      \"dash\",\n      \"emphasis\",\n      \"entity\",\n      \"extlink\",\n      \"filteredtranscludeinline\",\n      \"hardlinebreaks\",\n      \"html\",\n      \"italic\",\n      \"macrocallinline\",\n      \"prettylink\",\n      \"strikethrough\",\n      \"styleinline\",\n      \"subscript\",\n      \"superscript\",\n      \"transcludeinline\",\n      \"underscore\",\n      \"wikilink\"\n    ]\n  },\n  \"baserules\": \"\"\n}\n"
        },
        "$:/plugins/bj/markdownlike/license": {
            "title": "$:/plugins/bj/markdownlike/license",
            "text": "The MIT License (MIT)\n\nCopyright (c) 2016 Jeffrey Wikinson aka buggyj\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
        },
        "$:/language/Docs/Types/text/vnd.twbase;flexibility=MDL": {
            "description": "markdown like",
            "group": "Text",
            "name": "text/vnd.twbase;flexibility=MDL",
            "title": "$:/language/Docs/Types/text/vnd.twbase;flexibility=MDL",
            "type": "text/vnd.tiddlywiki",
            "text": ""
        },
        "$:/bj/mdl/modules/parsers/wikiparser/rules/strong.js": {
            "text": "/*\\\ntitle: $:/bj/mdl/modules/parsers/wikiparser/rules/strong.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strong\";\nexports.types = {user: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\*\\*/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\*\\*/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
            "title": "$:/bj/mdl/modules/parsers/wikiparser/rules/strong.js",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/bj/mdl/modules/parsers/wikiparser/rules/heading.js": {
            "text": "/*\\\ntitle: $:/bj/mdl/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"headingmod\";\nexports.types = {user: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(#{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classes = this.parser.parseClasses();\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel, \n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \")}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n",
            "title": "$:/bj/mdl/modules/parsers/wikiparser/rules/heading.js",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/bj/mdl/modules/parsers/wikiparser/rules/list.js": {
            "text": "/*\\\ntitle: $:/bj/mdl/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"listmod\";\nexports.types = {user: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\+\\.;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"+\": {listTag: \"ul\", itemTag: \"li\"},\n\t\".\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"p\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\+\\.;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n",
            "title": "$:/bj/mdl/modules/parsers/wikiparser/rules/list.js",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/bj/mdl/modules/parsers/wikiparser/rules/listdigit.js": {
            "text": "/*\\\ntitle: $:/bj/mdl/modules/parsers/wikiparser/rules/listdigit.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"listdigit\";\nexports.types = {user: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([0-9]\\.)/mg;\n};\n\nvar listTypes = {\n\n\t\"0\": {listTag: \"ol\", itemTag: \"li\"},\n\t\"1\": {listTag: \"ol\", itemTag: \"li\"},\n\t\"2\": {listTag: \"ol\", itemTag: \"li\"},\n\t\"3\": {listTag: \"ol\", itemTag: \"li\"},\n\t\"4\": {listTag: \"ol\", itemTag: \"li\"},\n\t\"5\": {listTag: \"ol\", itemTag: \"li\"},\n\t\"6\": {listTag: \"ol\", itemTag: \"li\"},\n\t\"7\": {listTag: \"ol\", itemTag: \"li\"},\n\t\"8\": {listTag: \"ol\", itemTag: \"li\"},\n\t\"9\": {listTag: \"ol\", itemTag: \"li\"}\n\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\t//bj hack length\n\tvar mlength = 1;\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([0-9]\\.)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<1; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (mlength - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > mlength) {\n\t\t\tlistStack.splice(mlength,listStack.length - mlength);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n",
            "title": "$:/bj/mdl/modules/parsers/wikiparser/rules/listdigit.js",
            "type": "application/javascript",
            "module-type": "wikirule"
        },
        "$:/plugins/bj/markdownlike/readme": {
            "title": "$:/plugins/bj/markdownlike/readme",
            "type": "text/vnd.twbase;flexibility=MDL",
            "text": "\n----\n\n##Example Source\n```\n# Source of content made to be even more markdown like\nIn this content I have made the following changes to the rules\n\none level of markdow number lists now supported\n\n1. using **listmod rule** - now I am using a  . for ordered lists\n2. using **headingmod rule** I am using # inplace of ! for headings\n3. using **boldmode rule** I am using two * inplace of two '\n\nI have also:\n\n+ **replaced** * with + for unordered lists\n```\n----\n\n##Example Rendered\n# Source of content made to be even more markdown like\nIn this content I have made the following changes to the rules\n\none level of markdow number lists now supported\n\n1. using **listmod rule** - now I am using a  . for ordered lists\n2. using **headingmod rule** I am using # inplace of ! for headings\n3. using **boldmode rule** I am using two * inplace of two '\n##\nI have also:\n\n+ **replaced** * with + for unordered lists\n"
        }
    }
}
{
    "tiddlers": {
        "$:/plugins/bj/plugins/marked/markdown.js": {
            "type": "application/javascript",
            "title": "$:/plugins/bj/plugins/marked/markdown.js",
            "module-type": "library",
            "text": "/**\n * marked - a markdown parser\n * Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/chjj/marked\n */\n\n;(function() {\n\n/**\n * Block-Level Grammar\n */\n\nvar block = {\n  newline: /^\\n+/,\n  code: /^( {4}[^\\n]+\\n*)+/,\n  fences: noop,\n  hr: /^( *[-*_]){3,} *(?:\\n+|$)/,\n  heading: /^ *(#{1,6}) *([^\\n]+?) *#* *(?:\\n+|$)/,\n  nptable: noop,\n  lheading: /^([^\\n]+)\\n *(=|-){2,} *(?:\\n+|$)/,\n  blockquote: /^( *>[^\\n]+(\\n(?!def)[^\\n]+)*\\n*)+/,\n  list: /^( *)(bull) [\\s\\S]+?(?:hr|def|\\n{2,}(?! )(?!\\1bull )\\n*|\\s*$)/,\n  html: /^ *(?:comment *(?:\\n|\\s*$)|closed *(?:\\n{2,}|\\s*$)|closing *(?:\\n{2,}|\\s*$))/,\n  def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +[\"(]([^\\n]+)[\")])? *(?:\\n+|$)/,\n  table: noop,\n  paragraph: /^((?:[^\\n]+\\n?(?!hr|heading|lheading|blockquote|tag|def))+)\\n*/,\n  text: /^[^\\n]+/\n};\n\nblock.bullet = /(?:[*+-]|\\d+\\.)/;\nblock.item = /^( *)(bull) [^\\n]*(?:\\n(?!\\1bull )[^\\n]*)*/;\nblock.item = replace(block.item, 'gm')\n  (/bull/g, block.bullet)\n  ();\n\nblock.list = replace(block.list)\n  (/bull/g, block.bullet)\n  ('hr', '\\\\n+(?=\\\\1?(?:[-*_] *){3,}(?:\\\\n+|$))')\n  ('def', '\\\\n+(?=' + block.def.source + ')')\n  ();\n\nblock.blockquote = replace(block.blockquote)\n  ('def', block.def)\n  ();\n\nblock._tag = '(?!(?:'\n  + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code'\n  + '|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo'\n  + '|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:/|[^\\\\w\\\\s@]*@)\\\\b';\n\nblock.html = replace(block.html)\n  ('comment', /<!--[\\s\\S]*?-->/)\n  ('closed', /<(tag)[\\s\\S]+?<\\/\\1>/)\n  ('closing', /<tag(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/)\n  (/tag/g, block._tag)\n  ();\n\nblock.paragraph = replace(block.paragraph)\n  ('hr', block.hr)\n  ('heading', block.heading)\n  ('lheading', block.lheading)\n  ('blockquote', block.blockquote)\n  ('tag', '<' + block._tag)\n  ('def', block.def)\n  ();\n\n/**\n * Normal Block Grammar\n */\n\nblock.normal = merge({}, block);\n\n/**\n * GFM Block Grammar\n */\n\nblock.gfm = merge({}, block.normal, {\n  fences: /^ *(`{3,}|~{3,}) *(\\S+)? *\\n([\\s\\S]+?)\\s*\\1 *(?:\\n+|$)/,\n  paragraph: /^/\n});\n\nblock.gfm.paragraph = replace(block.paragraph)\n  ('(?!', '(?!'\n    + block.gfm.fences.source.replace('\\\\1', '\\\\2') + '|'\n    + block.list.source.replace('\\\\1', '\\\\3') + '|')\n  ();\n\n/**\n * GFM + Tables Block Grammar\n */\n\nblock.tables = merge({}, block.gfm, {\n  nptable: /^ *(\\S.*\\|.*)\\n *([-:]+ *\\|[-| :]*)\\n((?:.*\\|.*(?:\\n|$))*)\\n*/,\n  table: /^ *\\|(.+)\\n *\\|( *[-:]+[-| :]*)\\n((?: *\\|.*(?:\\n|$))*)\\n*/\n});\n\n/**\n * Block Lexer\n */\n\nfunction Lexer(options) {\n  this.tokens = [];\n  this.tokens.links = {};\n  this.options = options || marked.defaults;\n  this.rules = block.normal;\n\n  if (this.options.gfm) {\n    if (this.options.tables) {\n      this.rules = block.tables;\n    } else {\n      this.rules = block.gfm;\n    }\n  }\n}\n\n/**\n * Expose Block Rules\n */\n\nLexer.rules = block;\n\n/**\n * Static Lex Method\n */\n\nLexer.lex = function(src, options) {\n  var lexer = new Lexer(options);\n  return lexer.lex(src);\n};\n\n/**\n * Preprocessing\n */\n\nLexer.prototype.lex = function(src) {\n  src = src\n    .replace(/\\r\\n|\\r/g, '\\n')\n    .replace(/\\t/g, '    ')\n    .replace(/\\u00a0/g, ' ')\n    .replace(/\\u2424/g, '\\n');\n\n  return this.token(src, true);\n};\n\n/**\n * Lexing\n */\n\nLexer.prototype.token = function(src, top, bq) {\n  var src = src.replace(/^ +$/gm, '')\n    , next\n    , loose\n    , cap\n    , bull\n    , b\n    , item\n    , space\n    , i\n    , l;\n\n  while (src) {\n    // newline\n    if (cap = this.rules.newline.exec(src)) {\n      src = src.substring(cap[0].length);\n      if (cap[0].length > 1) {\n        this.tokens.push({\n          type: 'space'\n        });\n      }\n    }\n\n    // code\n    if (cap = this.rules.code.exec(src)) {\n      src = src.substring(cap[0].length);\n      cap = cap[0].replace(/^ {4}/gm, '');\n      this.tokens.push({\n        type: 'code',\n        text: !this.options.pedantic\n          ? cap.replace(/\\n+$/, '')\n          : cap\n      });\n      continue;\n    }\n\n    // fences (gfm)\n    if (cap = this.rules.fences.exec(src)) {\n      src = src.substring(cap[0].length);\n      this.tokens.push({\n        type: 'code',\n        lang: cap[2],\n        text: cap[3]\n      });\n      continue;\n    }\n\n    // heading\n    if (cap = this.rules.heading.exec(src)) {\n      src = src.substring(cap[0].length);\n      this.tokens.push({\n        type: 'heading',\n        depth: cap[1].length,\n        text: cap[2]\n      });\n      continue;\n    }\n\n    // table no leading pipe (gfm)\n    if (top && (cap = this.rules.nptable.exec(src))) {\n      src = src.substring(cap[0].length);\n\n      item = {\n        type: 'table',\n        header: cap[1].replace(/^ *| *\\| *$/g, '').split(/ *\\| */),\n        align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n        cells: cap[3].replace(/\\n$/, '').split('\\n')\n      };\n\n      for (i = 0; i < item.align.length; i++) {\n        if (/^ *-+: *$/.test(item.align[i])) {\n          item.align[i] = 'right';\n        } else if (/^ *:-+: *$/.test(item.align[i])) {\n          item.align[i] = 'center';\n        } else if (/^ *:-+ *$/.test(item.align[i])) {\n          item.align[i] = 'left';\n        } else {\n          item.align[i] = null;\n        }\n      }\n\n      for (i = 0; i < item.cells.length; i++) {\n        item.cells[i] = item.cells[i].split(/ *\\| */);\n      }\n\n      this.tokens.push(item);\n\n      continue;\n    }\n\n    // lheading\n    if (cap = this.rules.lheading.exec(src)) {\n      src = src.substring(cap[0].length);\n      this.tokens.push({\n        type: 'heading',\n        depth: cap[2] === '=' ? 1 : 2,\n        text: cap[1]\n      });\n      continue;\n    }\n\n    // hr\n    if (cap = this.rules.hr.exec(src)) {\n      src = src.substring(cap[0].length);\n      this.tokens.push({\n        type: 'hr'\n      });\n      continue;\n    }\n\n    // blockquote\n    if (cap = this.rules.blockquote.exec(src)) {\n      src = src.substring(cap[0].length);\n\n      this.tokens.push({\n        type: 'blockquote_start'\n      });\n\n      cap = cap[0].replace(/^ *> ?/gm, '');\n\n      // Pass `top` to keep the current\n      // \"toplevel\" state. This is exactly\n      // how markdown.pl works.\n      this.token(cap, top, true);\n\n      this.tokens.push({\n        type: 'blockquote_end'\n      });\n\n      continue;\n    }\n\n    // list\n    if (cap = this.rules.list.exec(src)) {\n      src = src.substring(cap[0].length);\n      bull = cap[2];\n\n      this.tokens.push({\n        type: 'list_start',\n        ordered: bull.length > 1\n      });\n\n      // Get each top-level item.\n      cap = cap[0].match(this.rules.item);\n\n      next = false;\n      l = cap.length;\n      i = 0;\n\n      for (; i < l; i++) {\n        item = cap[i];\n\n        // Remove the list item's bullet\n        // so it is seen as the next token.\n        space = item.length;\n        item = item.replace(/^ *([*+-]|\\d+\\.) +/, '');\n\n        // Outdent whatever the\n        // list item contains. Hacky.\n        if (~item.indexOf('\\n ')) {\n          space -= item.length;\n          item = !this.options.pedantic\n            ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')\n            : item.replace(/^ {1,4}/gm, '');\n        }\n\n        // Determine whether the next list item belongs here.\n        // Backpedal if it does not belong in this list.\n        if (this.options.smartLists && i !== l - 1) {\n          b = block.bullet.exec(cap[i + 1])[0];\n          if (bull !== b && !(bull.length > 1 && b.length > 1)) {\n            src = cap.slice(i + 1).join('\\n') + src;\n            i = l - 1;\n          }\n        }\n\n        // Determine whether item is loose or not.\n        // Use: /(^|\\n)(?! )[^\\n]+\\n\\n(?!\\s*$)/\n        // for discount behavior.\n        loose = next || /\\n\\n(?!\\s*$)/.test(item);\n        if (i !== l - 1) {\n          next = item.charAt(item.length - 1) === '\\n';\n          if (!loose) loose = next;\n        }\n\n        this.tokens.push({\n          type: loose\n            ? 'loose_item_start'\n            : 'list_item_start'\n        });\n\n        // Recurse.\n        this.token(item, false, bq);\n\n        this.tokens.push({\n          type: 'list_item_end'\n        });\n      }\n\n      this.tokens.push({\n        type: 'list_end'\n      });\n\n      continue;\n    }\n\n    // html\n    if (cap = this.rules.html.exec(src)) {\n      src = src.substring(cap[0].length);\n      this.tokens.push({\n        type: this.options.sanitize\n          ? 'paragraph'\n          : 'html',\n        pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n        text: cap[0]\n      });\n      continue;\n    }\n\n    // def\n    if ((!bq && top) && (cap = this.rules.def.exec(src))) {\n      src = src.substring(cap[0].length);\n      this.tokens.links[cap[1].toLowerCase()] = {\n        href: cap[2],\n        title: cap[3]\n      };\n      continue;\n    }\n\n    // table (gfm)\n    if (top && (cap = this.rules.table.exec(src))) {\n      src = src.substring(cap[0].length);\n\n      item = {\n        type: 'table',\n        header: cap[1].replace(/^ *| *\\| *$/g, '').split(/ *\\| */),\n        align: cap[2].replace(/^ *|\\| *$/g, '').split(/ *\\| */),\n        cells: cap[3].replace(/(?: *\\| *)?\\n$/, '').split('\\n')\n      };\n\n      for (i = 0; i < item.align.length; i++) {\n        if (/^ *-+: *$/.test(item.align[i])) {\n          item.align[i] = 'right';\n        } else if (/^ *:-+: *$/.test(item.align[i])) {\n          item.align[i] = 'center';\n        } else if (/^ *:-+ *$/.test(item.align[i])) {\n          item.align[i] = 'left';\n        } else {\n          item.align[i] = null;\n        }\n      }\n\n      for (i = 0; i < item.cells.length; i++) {\n        item.cells[i] = item.cells[i]\n          .replace(/^ *\\| *| *\\| *$/g, '')\n          .split(/ *\\| */);\n      }\n\n      this.tokens.push(item);\n\n      continue;\n    }\n\n    // top-level paragraph\n    if (top && (cap = this.rules.paragraph.exec(src))) {\n      src = src.substring(cap[0].length);\n      this.tokens.push({\n        type: 'paragraph',\n        text: cap[1].charAt(cap[1].length - 1) === '\\n'\n          ? cap[1].slice(0, -1)\n          : cap[1]\n      });\n      continue;\n    }\n\n    // text\n    if (cap = this.rules.text.exec(src)) {\n      // Top-level should never reach here.\n      src = src.substring(cap[0].length);\n      this.tokens.push({\n        type: 'text',\n        text: cap[0]\n      });\n      continue;\n    }\n\n    if (src) {\n      throw new\n        Error('Infinite loop on byte: ' + src.charCodeAt(0));\n    }\n  }\n\n  return this.tokens;\n};\n\n/**\n * Inline-Level Grammar\n */\n\nvar inline = {\n  escape: /^\\\\([\\\\`*{}\\[\\]()#+\\-.!_>])/,\n  autolink: /^<([^ >]+(@|:\\/)[^ >]+)>/,\n  url: noop,\n  tag: /^<!--[\\s\\S]*?-->|^<\\/?\\w+(?:\"[^\"]*\"|'[^']*'|[^'\">])*?>/,\n  link: /^!?\\[(inside)\\]\\(href\\)/,\n  reflink: /^!?\\[(inside)\\]\\s*\\[([^\\]]*)\\]/,\n  nolink: /^!?\\[((?:\\[[^\\]]*\\]|[^\\[\\]])*)\\]/,\n  strong: /^__([\\s\\S]+?)__(?!_)|^\\*\\*([\\s\\S]+?)\\*\\*(?!\\*)/,\n  em: /^\\b_((?:__|[\\s\\S])+?)_\\b|^\\*((?:\\*\\*|[\\s\\S])+?)\\*(?!\\*)/,\n  code: /^(`+)\\s*([\\s\\S]*?[^`])\\s*\\1(?!`)/,\n  br: /^ {2,}\\n(?!\\s*$)/,\n  del: noop,\n  text: /^[\\s\\S]+?(?=[\\\\<!\\[_*`]| {2,}\\n|$)/\n};\n\ninline._inside = /(?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*/;\ninline._href = /\\s*<?([\\s\\S]*?)>?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*/;\n\ninline.link = replace(inline.link)\n  ('inside', inline._inside)\n  ('href', inline._href)\n  ();\n\ninline.reflink = replace(inline.reflink)\n  ('inside', inline._inside)\n  ();\n\n/**\n * Normal Inline Grammar\n */\n\ninline.normal = merge({}, inline);\n\n/**\n * Pedantic Inline Grammar\n */\n\ninline.pedantic = merge({}, inline.normal, {\n  strong: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n  em: /^_(?=\\S)([\\s\\S]*?\\S)_(?!_)|^\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)/\n});\n\n/**\n * GFM Inline Grammar\n */\n\ninline.gfm = merge({}, inline.normal, {\n  escape: replace(inline.escape)('])', '~|])')(),\n  url: /^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/,\n  del: /^~~(?=\\S)([\\s\\S]*?\\S)~~/,\n  text: replace(inline.text)\n    (']|', '~]|')\n    ('|', '|https?://|')\n    ()\n});\n\n/**\n * GFM + Line Breaks Inline Grammar\n */\n\ninline.breaks = merge({}, inline.gfm, {\n  br: replace(inline.br)('{2,}', '*')(),\n  text: replace(inline.gfm.text)('{2,}', '*')()\n});\n\n/**\n * Inline Lexer & Compiler\n */\n\nfunction InlineLexer(links, options) {\n  this.options = options || marked.defaults;\n  this.links = links;\n  this.rules = inline.normal;\n  this.renderer = this.options.renderer || new Renderer;\n  this.renderer.options = this.options;\n\n  if (!this.links) {\n    throw new\n      Error('Tokens array requires a `links` property.');\n  }\n\n  if (this.options.gfm) {\n    if (this.options.breaks) {\n      this.rules = inline.breaks;\n    } else {\n      this.rules = inline.gfm;\n    }\n  } else if (this.options.pedantic) {\n    this.rules = inline.pedantic;\n  }\n}\n\n/**\n * Expose Inline Rules\n */\n\nInlineLexer.rules = inline;\n\n/**\n * Static Lexing/Compiling Method\n */\n\nInlineLexer.output = function(src, links, options) {\n  var inline = new InlineLexer(links, options);\n  return inline.output(src);\n};\n\n/**\n * Lexing/Compiling\n */\n\nInlineLexer.prototype.output = function(src) {\n  var out = ''\n    , link\n    , text\n    , href\n    , cap;\n\n  while (src) {\n    // escape\n    if (cap = this.rules.escape.exec(src)) {\n      src = src.substring(cap[0].length);\n      out += cap[1];\n      continue;\n    }\n\n    // autolink\n    if (cap = this.rules.autolink.exec(src)) {\n      src = src.substring(cap[0].length);\n      if (cap[2] === '@') {\n        text = cap[1].charAt(6) === ':'\n          ? this.mangle(cap[1].substring(7))\n          : this.mangle(cap[1]);\n        href = this.mangle('mailto:') + text;\n      } else {\n        text = escape(cap[1]);\n        href = text;\n      }\n      out += this.renderer.link(href, null, text);\n      continue;\n    }\n\n    // url (gfm)\n    if (!this.inLink && (cap = this.rules.url.exec(src))) {\n      src = src.substring(cap[0].length);\n      text = escape(cap[1]);\n      href = text;\n      out += this.renderer.link(href, null, text);\n      continue;\n    }\n\n    // tag\n    if (cap = this.rules.tag.exec(src)) {\n      if (!this.inLink && /^<a /i.test(cap[0])) {\n        this.inLink = true;\n      } else if (this.inLink && /^<\\/a>/i.test(cap[0])) {\n        this.inLink = false;\n      }\n      src = src.substring(cap[0].length);\n      out += this.options.sanitize\n        ? escape(cap[0])\n        : cap[0];\n      continue;\n    }\n\n    // link\n    if (cap = this.rules.link.exec(src)) {\n      src = src.substring(cap[0].length);\n      this.inLink = true;\n      out += this.outputLink(cap, {\n        href: cap[2],\n        title: cap[3]\n      });\n      this.inLink = false;\n      continue;\n    }\n\n    // reflink, nolink\n    if ((cap = this.rules.reflink.exec(src))\n        || (cap = this.rules.nolink.exec(src))) {\n      src = src.substring(cap[0].length);\n      link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n      link = this.links[link.toLowerCase()];\n      if (!link || !link.href) {\n        out += cap[0].charAt(0);\n        src = cap[0].substring(1) + src;\n        continue;\n      }\n      this.inLink = true;\n      out += this.outputLink(cap, link);\n      this.inLink = false;\n      continue;\n    }\n\n    // strong\n    if (cap = this.rules.strong.exec(src)) {\n      src = src.substring(cap[0].length);\n      out += this.renderer.strong(this.output(cap[2] || cap[1]));\n      continue;\n    }\n\n    // em\n    if (cap = this.rules.em.exec(src)) {\n      src = src.substring(cap[0].length);\n      out += this.renderer.em(this.output(cap[2] || cap[1]));\n      continue;\n    }\n\n    // code\n    if (cap = this.rules.code.exec(src)) {\n      src = src.substring(cap[0].length);\n      out += this.renderer.codespan(escape(cap[2], true));\n      continue;\n    }\n\n    // br\n    if (cap = this.rules.br.exec(src)) {\n      src = src.substring(cap[0].length);\n      out += this.renderer.br();\n      continue;\n    }\n\n    // del (gfm)\n    if (cap = this.rules.del.exec(src)) {\n      src = src.substring(cap[0].length);\n      out += this.renderer.del(this.output(cap[1]));\n      continue;\n    }\n\n    // text\n    if (cap = this.rules.text.exec(src)) {\n      src = src.substring(cap[0].length);\n      out += escape(this.smartypants(cap[0]));\n      continue;\n    }\n\n    if (src) {\n      throw new\n        Error('Infinite loop on byte: ' + src.charCodeAt(0));\n    }\n  }\n\n  return out;\n};\n\n/**\n * Compile Link\n */\n\nInlineLexer.prototype.outputLink = function(cap, link) {\n  var href = escape(link.href)\n    , title = link.title ? escape(link.title) : null;\n\n  return cap[0].charAt(0) !== '!'\n    ? this.renderer.link(href, title, this.output(cap[1]))\n    : this.renderer.image(href, title, escape(cap[1]));\n};\n\n/**\n * Smartypants Transformations\n */\n\nInlineLexer.prototype.smartypants = function(text) {\n  if (!this.options.smartypants) return text;\n  return text\n    // em-dashes\n    .replace(/--/g, '\\u2014')\n    // opening singles\n    .replace(/(^|[-\\u2014/(\\[{\"\\s])'/g, '$1\\u2018')\n    // closing singles & apostrophes\n    .replace(/'/g, '\\u2019')\n    // opening doubles\n    .replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g, '$1\\u201c')\n    // closing doubles\n    .replace(/\"/g, '\\u201d')\n    // ellipses\n    .replace(/\\.{3}/g, '\\u2026');\n};\n\n/**\n * Mangle Links\n */\n\nInlineLexer.prototype.mangle = function(text) {\n  var out = ''\n    , l = text.length\n    , i = 0\n    , ch;\n\n  for (; i < l; i++) {\n    ch = text.charCodeAt(i);\n    if (Math.random() > 0.5) {\n      ch = 'x' + ch.toString(16);\n    }\n    out += '&#' + ch + ';';\n  }\n\n  return out;\n};\n\n/**\n * Renderer\n */\n\nfunction Renderer(options) {\n  this.options = options || {};\n}\n\nRenderer.prototype.code = function(code, lang, escaped) {\n  if (this.options.highlight) {\n    var out = this.options.highlight(code, lang);\n    if (out != null && out !== code) {\n      escaped = true;\n      code = out;\n    }\n  }\n\n  if (!lang) {\n    return '<pre><code>'\n      + (escaped ? code : escape(code, true))\n      + '\\n</code></pre>';\n  }\n\n  return '<pre><code class=\"'\n    + this.options.langPrefix\n    + escape(lang, true)\n    + '\">'\n    + (escaped ? code : escape(code, true))\n    + '\\n</code></pre>\\n';\n};\n\nRenderer.prototype.blockquote = function(quote) {\n  return '<blockquote>\\n' + quote + '</blockquote>\\n';\n};\n\nRenderer.prototype.html = function(html) {\n  return html;\n};\n\nRenderer.prototype.heading = function(text, level, raw) {\n  return '<h'\n    + level\n    + ' id=\"'\n    + this.options.headerPrefix\n    + raw.toLowerCase().replace(/[^\\w]+/g, '-')\n    + '\">'\n    + text\n    + '</h'\n    + level\n    + '>\\n';\n};\n\nRenderer.prototype.hr = function() {\n  return this.options.xhtml ? '<hr/>\\n' : '<hr>\\n';\n};\n\nRenderer.prototype.list = function(body, ordered) {\n  var type = ordered ? 'ol' : 'ul';\n  return '<' + type + '>\\n' + body + '</' + type + '>\\n';\n};\n\nRenderer.prototype.listitem = function(text) {\n  return '<li>' + text + '</li>\\n';\n};\n\nRenderer.prototype.paragraph = function(text) {\n  return '<p>' + text + '</p>\\n';\n};\n\nRenderer.prototype.table = function(header, body) {\n  return '<table>\\n'\n    + '<thead>\\n'\n    + header\n    + '</thead>\\n'\n    + '<tbody>\\n'\n    + body\n    + '</tbody>\\n'\n    + '</table>\\n';\n};\n\nRenderer.prototype.tablerow = function(content) {\n  return '<tr>\\n' + content + '</tr>\\n';\n};\n\nRenderer.prototype.tablecell = function(content, flags) {\n  var type = flags.header ? 'th' : 'td';\n  var tag = flags.align\n    ? '<' + type + ' style=\"text-align:' + flags.align + '\">'\n    : '<' + type + '>';\n  return tag + content + '</' + type + '>\\n';\n};\n\n// span level renderer\nRenderer.prototype.strong = function(text) {\n  return '<strong>' + text + '</strong>';\n};\n\nRenderer.prototype.em = function(text) {\n  return '<em>' + text + '</em>';\n};\n\nRenderer.prototype.codespan = function(text) {\n  return '<code>' + text + '</code>';\n};\n\nRenderer.prototype.br = function() {\n  return this.options.xhtml ? '<br/>' : '<br>';\n};\n\nRenderer.prototype.del = function(text) {\n  return '<del>' + text + '</del>';\n};\n\nRenderer.prototype.link = function(href, title, text) {\n  if (this.options.sanitize) {\n    try {\n      var prot = decodeURIComponent(unescape(href))\n        .replace(/[^\\w:]/g, '')\n        .toLowerCase();\n    } catch (e) {\n      return '';\n    }\n    if (prot.indexOf('javascript:') === 0) {\n      return '';\n    }\n  }\n  var out = '<a href=\"' + href + '\"';\n  if (title) {\n    out += ' title=\"' + title + '\"';\n  }\n  out += '>' + text + '</a>';\n  return out;\n};\n\nRenderer.prototype.image = function(href, title, text) {\n  var out = '<img src=\"' + href + '\" alt=\"' + text + '\"';\n  if (title) {\n    out += ' title=\"' + title + '\"';\n  }\n  out += this.options.xhtml ? '/>' : '>';\n  return out;\n};\n\n/**\n * Parsing & Compiling\n */\n\nfunction Parser(options) {\n  this.tokens = [];\n  this.token = null;\n  this.options = options || marked.defaults;\n  this.options.renderer = this.options.renderer || new Renderer;\n  this.renderer = this.options.renderer;\n  this.renderer.options = this.options;\n}\n\n/**\n * Static Parse Method\n */\n\nParser.parse = function(src, options, renderer) {\n  var parser = new Parser(options, renderer);\n  return parser.parse(src);\n};\n\n/**\n * Parse Loop\n */\n\nParser.prototype.parse = function(src) {\n  this.inline = new InlineLexer(src.links, this.options, this.renderer);\n  this.tokens = src.reverse();\n\n  var out = '';\n  while (this.next()) {\n    out += this.tok();\n  }\n\n  return out;\n};\n\n/**\n * Next Token\n */\n\nParser.prototype.next = function() {\n  return this.token = this.tokens.pop();\n};\n\n/**\n * Preview Next Token\n */\n\nParser.prototype.peek = function() {\n  return this.tokens[this.tokens.length - 1] || 0;\n};\n\n/**\n * Parse Text Tokens\n */\n\nParser.prototype.parseText = function() {\n  var body = this.token.text;\n\n  while (this.peek().type === 'text') {\n    body += '\\n' + this.next().text;\n  }\n\n  return this.inline.output(body);\n};\n\n/**\n * Parse Current Token\n */\n\nParser.prototype.tok = function() {\n  switch (this.token.type) {\n    case 'space': {\n      return '';\n    }\n    case 'hr': {\n      return this.renderer.hr();\n    }\n    case 'heading': {\n      return this.renderer.heading(\n        this.inline.output(this.token.text),\n        this.token.depth,\n        this.token.text);\n    }\n    case 'code': {\n      return this.renderer.code(this.token.text,\n        this.token.lang,\n        this.token.escaped);\n    }\n    case 'table': {\n      var header = ''\n        , body = ''\n        , i\n        , row\n        , cell\n        , flags\n        , j;\n\n      // header\n      cell = '';\n      for (i = 0; i < this.token.header.length; i++) {\n        flags = { header: true, align: this.token.align[i] };\n        cell += this.renderer.tablecell(\n          this.inline.output(this.token.header[i]),\n          { header: true, align: this.token.align[i] }\n        );\n      }\n      header += this.renderer.tablerow(cell);\n\n      for (i = 0; i < this.token.cells.length; i++) {\n        row = this.token.cells[i];\n\n        cell = '';\n        for (j = 0; j < row.length; j++) {\n          cell += this.renderer.tablecell(\n            this.inline.output(row[j]),\n            { header: false, align: this.token.align[j] }\n          );\n        }\n\n        body += this.renderer.tablerow(cell);\n      }\n      return this.renderer.table(header, body);\n    }\n    case 'blockquote_start': {\n      var body = '';\n\n      while (this.next().type !== 'blockquote_end') {\n        body += this.tok();\n      }\n\n      return this.renderer.blockquote(body);\n    }\n    case 'list_start': {\n      var body = ''\n        , ordered = this.token.ordered;\n\n      while (this.next().type !== 'list_end') {\n        body += this.tok();\n      }\n\n      return this.renderer.list(body, ordered);\n    }\n    case 'list_item_start': {\n      var body = '';\n\n      while (this.next().type !== 'list_item_end') {\n        body += this.token.type === 'text'\n          ? this.parseText()\n          : this.tok();\n      }\n\n      return this.renderer.listitem(body);\n    }\n    case 'loose_item_start': {\n      var body = '';\n\n      while (this.next().type !== 'list_item_end') {\n        body += this.tok();\n      }\n\n      return this.renderer.listitem(body);\n    }\n    case 'html': {\n      var html = !this.token.pre && !this.options.pedantic\n        ? this.inline.output(this.token.text)\n        : this.token.text;\n      return this.renderer.html(html);\n    }\n    case 'paragraph': {\n      return this.renderer.paragraph(this.inline.output(this.token.text));\n    }\n    case 'text': {\n      return this.renderer.paragraph(this.parseText());\n    }\n  }\n};\n\n/**\n * Helpers\n */\n\nfunction escape(html, encode) {\n  return html\n    .replace(!encode ? /&(?!#?\\w+;)/g : /&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#39;');\n}\n\nfunction unescape(html) {\n  return html.replace(/&([#\\w]+);/g, function(_, n) {\n    n = n.toLowerCase();\n    if (n === 'colon') return ':';\n    if (n.charAt(0) === '#') {\n      return n.charAt(1) === 'x'\n        ? String.fromCharCode(parseInt(n.substring(2), 16))\n        : String.fromCharCode(+n.substring(1));\n    }\n    return '';\n  });\n}\n\nfunction replace(regex, opt) {\n  regex = regex.source;\n  opt = opt || '';\n  return function self(name, val) {\n    if (!name) return new RegExp(regex, opt);\n    val = val.source || val;\n    val = val.replace(/(^|[^\\[])\\^/g, '$1');\n    regex = regex.replace(name, val);\n    return self;\n  };\n}\n\nfunction noop() {}\nnoop.exec = noop;\n\nfunction merge(obj) {\n  var i = 1\n    , target\n    , key;\n\n  for (; i < arguments.length; i++) {\n    target = arguments[i];\n    for (key in target) {\n      if (Object.prototype.hasOwnProperty.call(target, key)) {\n        obj[key] = target[key];\n      }\n    }\n  }\n\n  return obj;\n}\n\n\n/**\n * Marked\n */\n\nfunction marked(src, opt, callback) {\n  if (callback || typeof opt === 'function') {\n    if (!callback) {\n      callback = opt;\n      opt = null;\n    }\n\n    opt = merge({}, marked.defaults, opt || {});\n\n    var highlight = opt.highlight\n      , tokens\n      , pending\n      , i = 0;\n\n    try {\n      tokens = Lexer.lex(src, opt)\n    } catch (e) {\n      return callback(e);\n    }\n\n    pending = tokens.length;\n\n    var done = function(err) {\n      if (err) {\n        opt.highlight = highlight;\n        return callback(err);\n      }\n\n      var out;\n\n      try {\n        out = Parser.parse(tokens, opt);\n      } catch (e) {\n        err = e;\n      }\n\n      opt.highlight = highlight;\n\n      return err\n        ? callback(err)\n        : callback(null, out);\n    };\n\n    if (!highlight || highlight.length < 3) {\n      return done();\n    }\n\n    delete opt.highlight;\n\n    if (!pending) return done();\n\n    for (; i < tokens.length; i++) {\n      (function(token) {\n        if (token.type !== 'code') {\n          return --pending || done();\n        }\n        return highlight(token.text, token.lang, function(err, code) {\n          if (err) return done(err);\n          if (code == null || code === token.text) {\n            return --pending || done();\n          }\n          token.text = code;\n          token.escaped = true;\n          --pending || done();\n        });\n      })(tokens[i]);\n    }\n\n    return;\n  }\n  try {\n    if (opt) opt = merge({}, marked.defaults, opt);\n    return Parser.parse(Lexer.lex(src, opt), opt);\n  } catch (e) {\n    e.message += '\\nPlease report this to https://github.com/chjj/marked.';\n    if ((opt || marked.defaults).silent) {\n      return '<p>An error occured:</p><pre>'\n        + escape(e.message + '', true)\n        + '</pre>';\n    }\n    throw e;\n  }\n}\n\n/**\n * Options\n */\n\nmarked.options =\nmarked.setOptions = function(opt) {\n  merge(marked.defaults, opt);\n  return marked;\n};\n\nmarked.defaults = {\n  gfm: true,\n  tables: true,\n  breaks: false,\n  pedantic: false,\n  sanitize: false,\n  smartLists: false,\n  silent: false,\n  highlight: null,\n  langPrefix: 'lang-',\n  smartypants: false,\n  headerPrefix: '',\n  renderer: new Renderer,\n  xhtml: false\n};\n\n/**\n * Expose\n */\n\nmarked.Parser = Parser;\nmarked.parser = Parser.parse;\n\nmarked.Renderer = Renderer;\n\nmarked.Lexer = Lexer;\nmarked.lexer = Lexer.lex;\n\nmarked.InlineLexer = InlineLexer;\nmarked.inlineLexer = InlineLexer.output;\n\nmarked.parse = marked;\n\nif (typeof module !== 'undefined' && typeof exports === 'object') {\n  module.exports = marked;\n} else if (typeof define === 'function' && define.amd) {\n  define(function() { return marked; });\n} else {\n  this.marked = marked;\n}\n\n}).call(function() {\n  return this || (typeof window !== 'undefined' ? window : global);\n}());\n"
        },
        "$:/language/Docs/Types/text/x-marked": {
            "description": "marked version of markdown",
            "name": "text/x-marked",
            "tags": "",
            "title": "$:/language/Docs/Types/text/x-marked",
            "type": "text/vnd.tiddlywiki",
            "text": ""
        },
        "$:/plugins/bj/plugins/marked/license": {
            "title": "$:/plugins/bj/plugins/marked/license",
            "text": "The MIT License (MIT)\n\nCopyright (c) 2015 Jeffrey Wikinson aka buggyj\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
        },
        "$:/plugins/bj/plugins/marked/readme": {
            "title": "$:/plugins/bj/plugins/marked/readme",
            "text": "Adapter for the marked markdown parser:\nhttps://github.com/chjj/marked\n\n!!Usage\nWhen creating a tiddler, from the 'type' dropdown select 'text/x-marked'\n\n!!!Advanced Options (with defaults)\n<pre>`  gfm: true,\n  tables: true,\n  breaks: false,\n  pedantic: false,\n  sanitize: false,\n  smartLists: false,\n  silent: false,\n  highlight: null,\n  langPrefix: 'lang-',\n  smartypants: false,\n  headerPrefix: '',\n  renderer: new Renderer,\n  xhtml: false\n`</pre>\n\nAt present advanced options can only be set using the Flexitype plugin.\n"
        },
        "$:/plugins/bj/plugins/marked/parsers/markapdaper.js": {
            "text": "/*\\\ntitle: $:/plugins/bj/plugins/marked/parsers/markapdaper.js\ntype: application/javascript\nmodule-type: parser\n\nto support inclusions\n\\*/\n\n(function(){\n\nvar marked = require(\"$:/plugins/bj/plugins/marked/markdown.js\");\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PostMd = function(type,text,options) {\n\tvar opts;\n\tif (!!options) {opts = options.parserrules;}\n\tthis.tree = [{type: \"raw\", html: marked(text,opts)}];\n};\n\nexports[\"text/x-marked\"] = PostMd;\n\n})();\n\n",
            "title": "$:/plugins/bj/plugins/marked/parsers/markapdaper.js",
            "type": "application/javascript",
            "module-type": "parser"
        }
    }
}
{
    "tiddlers": {
        "$:/plugins/bj/storytabs/license": {
            "title": "$:/plugins/bj/storytabs/license",
            "text": "The MIT License (MIT)\n\nCopyright (c) 2015 Jeffrey Wikinson aka Buggyj\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
        },
        "$:/plugins/bj/storytabs/readme": {
            "title": "$:/plugins/bj/storytabs/readme",
            "text": "Facilitates easier navigating between open tiddlers. Links to open tiddlers appear above top of the story river . If 'story mode' is set to zooming (see in appearance tab in the $:/ControlPanel tiddler) then the open tiddlers appear in tabs. The top links are controlled from the 'setting' tab in the $:/ControlPanel tiddler.\n"
        },
        "$:/plugin/bj/storytabs": {
            "title": "$:/plugin/bj/storytabs",
            "type": "text/vnd.tiddlywiki",
            "text": "<div  class=\"tc-tab-buttons\" >\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" variable=\"currentTab\">\n<$reveal type=\"match\" state=\"$:/HistoryList!!current-tiddler\" text=<<currentTab>>>\n<div style=\"display:inline-block;\">\n<$button to=<<currentTab>>  class=\"tc-tab-selected\" style=\"margin-right: 0.0em; border-right: 0.0em\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$button>\n<$button message=\"tm-close-tiddler\" param=<<currentTab>> class=\"tc-tab-selected\"  style=\"border-left: 0.0em;\">&times;</$button></div></$reveal>\n<$reveal type=\"nomatch\" state=\"$:/HistoryList!!current-tiddler\" text=<<currentTab>>>\n<div style=\"display:inline-block;\">\n<$button to=<<currentTab>> style=\"margin-right: 0.0em;\" >\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$button><$button message=\"tm-close-tiddler\" param=<<currentTab>>>\n&times;</$button></div></$reveal>\n</$list>\n</div>\n\n"
        },
        "$:/bj/storytabs/storytabs-caller": {
            "tags": "$:/tags/AboveStory",
            "title": "$:/bj/storytabs/storytabs-caller",
            "type": "text/vnd.tiddlywiki",
            "text": "<$transclude tiddler=\"$:/plugin/bj/storytabs\"  mode=\"inline\"/>\n\n\n"
        },
        "$:plugins/bj/ui/ControlPanel/Settings/StoryTabs": {
            "caption": "Display tabs of Open Tids",
            "tags": "$:/tags/ControlPanel/Settings",
            "title": "$:plugins/bj/ui/ControlPanel/Settings/StoryTabs",
            "type": "text/vnd.tiddlywiki",
            "text": "<$checkbox tiddler=\"$:/plugin/bj/storytabs\" tag=\"$:/tags/AboveStory\" > Enable Story Tabs </$checkbox>\n\n\n"
        }
    }
}
{
    "tiddlers": {
        "SnapRuleMode": {
            "title": "SnapRuleMode",
            "type": "text/vnd.tiddlywiki",
            "text": "[{\"#nosnap\":\"nosave\"\t},{\"#newdata\":\"((*!@exists(@snap)*??*#nosnap*)) inc add\"}]\n"
        },
        "TiddlyClipConfig": {
            "title": "TiddlyClipConfig",
            "type": "text/vnd.tiddlywiki",
            "text": "!default\n|!Category|!Tip|!Tags|!Rule Tid|!Modes|\n|Tid|copy tids||[[defaultTid]]|tiddlers|\n|Snip|copy||[[defaultSnip]]||\n|Pin|pin it||[[defaultPin]]||\n"
        },
        "$:/config/EditorTypeMappings/application/json": {
            "title": "$:/config/EditorTypeMappings/application/json",
            "text": "json\n"
        },
        "$:/plugins/bj/tiddlyclip/ui/Buttons/tiddlyclip": {
            "title": "$:/plugins/bj/tiddlyclip/ui/Buttons/tiddlyclip",
            "tags": "$:/tags/PageControls",
            "caption": "Clip Content",
            "description": "configure tiddlyclip",
            "text": "<$button to=\"TiddlyClipConfig\" title=\"top  clip table\" aria-label=\"top  clip table\" class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>prefix[yes]]\">\n{{$:/plugins/bj/tiddlyclip/icon}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>prefix[yes]]\">\n<$text text=\"top  clip table\"/>\n</$list>\n</$button>\n"
        },
        "$:/plugins/bj/tiddlyclip/icon": {
            "tags": "$:/tags/Image",
            "title": "$:/plugins/bj/tiddlyclip/icon",
            "type": "text/vnd.tiddlywiki",
            "text": "\n<svg  class=\"tc-image-import-button tc-image-button\"  preserveAspectRatio=\"none\"\n width=\"22pt\" height=\"22pt\" viewBox=\"0 0 32 28\"\n  >  \n   <g\n     transform=\"matrix(0.06516688,0,0,0.08453159,-13.159611,-17.662411)\"\n     id=\"layer1\"\n     style=\"fill:#241f1c\">\n    <path\n       d=\"m 557.14285,368.07648 a 142.85715,150 0 1 1 -285.71429,0 142.85715,150 0 1 1 285.71429,0 z\"\n       id=\"path3010\"\n       style=\"fill:#241f1c;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\" />\n  </g>\n  <g\n     transform=\"matrix(0.08280307,-0.10351736,0.08103997,0.10535593,3.3717294,13.619584)\"\n     id=\"g3460\"\n     style=\"fill:#ffffff;fill-rule:evenodd\">\n    <path\n       d=\"m 105.44944,94.213895 c 0,0 4.60002,-0.02418 4.60002,5.188716 0,5.212899 -4.88621,5.212899 -4.88621,5.212899 l -60.155743,0.54232 c 0,0 -44.6399752,1.13201 -44.63997463,-38.512909 C 0.36753293,27 45.042825,27 45.042825,27 l 60.489665,0 c 0,0 33.46425,-1.326501 33.46425,28.177187 0,29.503688 -33.26964,27.668566 -33.26964,27.668566 l -49.553591,0 c 0,0 -33.483586,2.304269 -33.483586,-16.754378 0,-19.058647 33.483586,-16.753074 33.483586,-16.753074 l 49.553591,0 c 0,0 5.51811,10e-7 5.51811,5.484811 0,5.484809 -5.51811,5.68434 -5.51811,5.68434 l -49.553591,0 c 0,0 -18.684379,10e-7 -18.684379,6.137467 0,6.137467 18.684379,5.031683 18.684379,5.031683 l 49.553591,10e-7 c 0,0 22.10845,1.464544 22.10845,-16.499416 0,-19.646785 -22.10845,-16.873655 -22.10845,-16.873655 l -60.684275,0 c 0,0 -33.514097,-10e-7 -33.514097,28.341389 0,28.341389 33.514096,27.313047 33.514096,27.313047 l 60.406616,0.255927 z\"\n       transform=\"matrix(0.70710678,-0.70710678,0.70710678,0.70710678,-26.351768,68.381205)\"\n       id=\"path3462\"\n       style=\"fill:#ffffff\" />\n\n\n  </g>\n</svg>\n"
        },
        "$:/plugins/bj/tiddlyclip/tidpaste.js": {
            "type": "application/javascript",
            "title": "$:/plugins/bj/tiddlyclip/tidpaste.js",
            "module-type": "library",
            "text": "\ntiddlyclip={hello:\"hello\"};\n\n(function(){\ntiddlyclip.modules={};\n\nvar log = function (x) {\n\talert(x);\n}\n\tfunction status (param) {\n\t\ttiddlyclip.log(param);\n\t\t}\n\nif (true) {\n\ntiddlyclip.modules.tPaste = (function () {\n\n\tvar api = \n\t{\n\t\tonLoad:onLoad,\t\t\t\tpaste:paste,\t\t\t\t\n\t\thasMode:hasMode,\t\t\t\n\t\thasModeBegining:hasModeBegining\n\t};\n\tvar   tiddlerObj, twobj,   defaults;\n\n\tfunction onLoad() {\n\t\ttiddlerAPI \t= tiddlyclip.modules.tiddlerAPI;\n\t\ttwobj\t\t= tiddlyclip.modules.twobj;\n\t\tdefaults\t= tiddlyclip.modules.defaults;\n\t}\n/////////////////////////////////////////////////////////////////////////////\n\tfunction findDefaultRule(rule) {\n\t\treturn (rule.substring(0,7)==='default') ? defaults.getDefaultRule(rule):null;\n\t}\n\n\tfunction findCategory (tableOfCats, category) {\t\n\t\tvar categoryRows = tableOfCats.split(\"\\n\");\n\t\tvar cat = {}, tagsAndModes, pieces, catFound=false;\n\t\tvar hasExt = false;\n\t\t\n\t\tfor (var i=0; i<categoryRows.length; i++) { \n\t\t\tpieces = categoryRows[i].split(\"|\");// row is = |Category|Tip|Tags|Rules Tid|Modes|\n\t\t\tif (pieces.length==1) continue; \t//ingore blanklines\n\t\t\tif (pieces.length < 7) {\n\t\t\t\talert('config table format error no of row incorrect '+categoryRows[i]);\n\t\t\t\t return {valid:false};\n\t\t\t}\n\t\t\tif (pieces[1].substring(0,1)==='!') continue; //first row is column headings\n\t\t\tif (category == pieces[1]) {\n\t\t\t\tcatFound = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} //loop end\n\t\t\n\t\tif (!catFound) {status (\"not found cat: \"+category);return {valid:false};}\n\t\t\n\t\tvar ruleDefs =  twobj.getTidContents(pieces[4].replace(/^\\[\\[([\\s\\S]*)\\]\\]/,\"$1\"));//remove wikiword parens if present\n\t\t//if rule is not found use the default rules\n\t\tif (!ruleDefs) {\n\t\t\tstatus (\"rules not found for cat: \"+category+\" was \"+pieces[4]);\n\t\t\truleDefs = findDefaultRule(pieces[4]);\n\t\t\t\n\t\t\t}\n\t\tif (!!ruleDefs)  {\t\n\t\t\ttry {\n\t\t\t\tcat = {rules:null,valid:false};\t\t\n\t\t\t\tcat.rules=addSequenceOfRules(ruleDefs,category);//one or more\n\t\t\t\tcat.modes= extractModes(pieces[5]);\n\t\t\t\tcat.tags = pieces[3];\n\t\t\t\tcat.tip  = pieces[2];\n\t\t\t\tcat.valid= true;\n\t\t\t\tstatus(\"found cat: \"+category)\n\t\t\t\treturn cat;\n\t\t\t} catch(e) {\n\t\t\t\tstatus(\"caught error while adding rules for cat: \" + category);\n\t\t\t\treturn {valid:false};\n\t\t\t}\n\t\t}\n\t\tstatus (\"rules not found for cat: \"+category);\n\t\treturn {valid:false}; \n\t}\n\n\tfunction findSection(activeSection,configTable) {\n        var sectionStrgs;\n\t\tvar content = configTable;\n\t\tif (content != null) {\n\t\t\tsectionStrgs = content.split(defaults.getDefs().FOLDSTART+'['); //sections begin with a title, , followed by a table of categories\n\t\t\tif(sectionStrgs.length>1) {\n\t\t\t\tstatus(\"found clip list format config\")\t\t \n\t\t\t\tsectionStrgs.shift();\t\n\t\t\t\t//only load active categories \n\t\t\t\treturn (sectionStrgs[activeSection].split('!/%%/\\n')[1]);//strip of section name from first line\n\t\t\t} else { \n\t\t\t\tstatus(\"found straight config format\");\n\t\t\t\tsectionStrgs = content.split('\\n!'); //sections begin with a title, eg !mysection, followed by a table of categories\n\t\t\t\t//only load active categories\n\t\t\t\treturn (sectionStrgs[activeSection].replace(/(^\\|)*\\n/,''));//strip of section name from first line\n\t\t\t}\n\n\t\t}else {\n\t\t\tstatus(\"config tiddler not found try with default values\");\n\t\t\treturn defaults.getDefaultCategories().join(\"\\n\");\n\t\t}\n\t}\n//////////////////////////////////////////////////////////\n\tfunction extractModes(tagString) {\n\t\tvar modes =[], tList = tagString.split(' ');\n\t\tfor (var i=0; i< tList.length; i++) {\n\t\t\tmodes[i] = tList[i].trim();\n\t\t}\n\t\treturn modes;\n\t}\n\n\tfunction hasMode (cat,mode) {\n\t\t\tif (!cat.modes) return false;\n\t\tfor (var i=0; i< cat.modes.length;i++)\n\t\t\tif (mode === cat.modes[i]) return true;\n\t\treturn false;\n\t}\n\tfunction hasModeBegining (cat,mode) {\n\t\t\tif (!cat.modes) return false;\n\t\tfor (var i=0; i< cat.modes.length;i++)\n\t\t\tif (mode === cat.modes[i].substr(0,mode.length)) return true;\n\t\treturn false;\n\t}\n//////////////////////////////////////\t\t\n\tfunction addSequenceOfRules(tiddler,cat) { \t\t\n\t\tvar ruleDefs = tiddler.trim().split(\"\\n\");\n\t\tvar arrayOfRules =[];\n\t\tvar firstRow=0,firstrule=0;\n/*\n        if (ruleDefs[firstRow].substring(0,2)==='|!') firstRow += 1;// row  maybe column titles, ie the string |!Title|!Body|!Tags|!Modes|\n\t\tfor (var i=firstrule,j=firstRow; j<ruleDefs.length; i++,j++) {\n\t\t\tarrayOfRules[i]=new Rule(ruleDefs[j]);\n\t\t}\n*/\n\t\tvar j = 0;\n\t\tfor (var i = 0;i < ruleDefs.length;i++) {\n\t\t\t if (ruleDefs[i].charAt(0) !== \"|\" || ruleDefs[i].charAt(1) === \"!\") continue;//row maybe column titles, ie the string |!Title|!Body|!Tags|!Modes| or a comment\n\t\t\t arrayOfRules[j]=new Rule(ruleDefs[i]);\n\t\t\t j++;\n\t\t}\n\n\t\treturn arrayOfRules;\n\t}\n\n\tfunction Rule(defRule, modes) {\n\t\t//INPUT DEF:\n\t\t//defRule is a string of the form '|Title|Body|Tags|Fields|Init values|Modes|' or a struture {\ttitle:'..', body:'..', tags:'..'}\n\t\t//extracts subst patterns for title, body, tags. Also extracts modes\n\t\tvar Tid;\n\t\tvar whiteSpace = /^\\s+|\\s+$/g;//use trim\n\t\tvar isLinked = /^\\[\\[([\\s|\\S]*)\\]\\]$/;\n\t\tif ((typeof defRule) =='string' ) { //we has a row definition\n\t\t\t//remove triple quotes around any | - these were needed to stop TW thinking they were table elements\n\t\t\tvar pieces = defRule.replace(/\\\"\\\"\\\"\\|\\\"\\\"\\\"/g,\"&bar;\").split(\"|\");\n\t\t\tif  (pieces.length <7) {error('short:'+defRule);throw new Error('Invalid Rule');} //error malformeed TODO: inform the user\n\t\t\tfor (var i=1;i<7;i++) {\n\t\t\t\tpieces[i]= pieces[i].replace(\"&bar;\",\"|\"); \n\t\t\t\tif (pieces[i] == null) {\n\t\t\t\t\tif (i==1) throw new Error('Invlid Rule');//must define a name for the tid\n\t\t\t\t} else \tif (i!=3 && isLinked.test(pieces[i])) { // -there is a definition in a seperated tiddler - go get it\n\t\t\t\t    var temp=pieces[i].replace (/^\\[\\[([\\s|\\S]*)\\]\\]$/,\"$1\"); //remove  brackets\n\t\t\t\t\t\t temp =twobj.getTidContents(temp); //this.body contains the name of the tiddler\n\t\t\t\t\t\t if (temp != null) pieces[i] = temp;\t\t\t\t\t\t\n\t\t\t\t} else{\n\t\t\t\t\t\n\t\t\t\t\tif (i==6)  \t\t\t\tpieces[i] = '[{\"#newdata\":\"'+pieces[i]+'\"}]';//modes\t\n\t\t\t\t\telse if (i==4||i==5)\tpieces[i] = '['+pieces[i]+']';\t\n\t\t\t\t\telse if (i==3) {\n\t\t\t\t\t\t  if (pieces[i]) \tpieces[i] = '[{\"#space\":\" \"},{\"$tags\":\"((*@exists($tags)*??*$tags*))((*@exists($tags)*??*#space*))'+pieces[i]+'\"}]'; \n\t\t\t\t\t\t  else \t\t\t\tpieces[i] ='[]'; // don't modify/create\n\t\t\t\t\t   }\n\t\t\t\t\telse if (i==2)  \t\tpieces[i] = '[{\"#newdata\":\"'+pieces[i]+'\"}]';//text\t\t\n\t\t\t\t\telse if (i==1){\n\t\t\t\t\t\t  if (pieces[i]) \tpieces[i] = '[{\"$title\":\"'+pieces[i]+'\"}]';\n\t\t\t\t\t\t  else \t\t\t\tpieces[i] ='[]'; // don't modify/create\n\t\t\t\t\t   }  \t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.title =pieces[1];\n\t\t\tthis.body  =pieces[2];\n\t\t\tthis.tags = pieces[3];\n\t\t\tthis.fields =pieces[4]; \n\t\t\tthis.InitVals=pieces[5];\t\n\t\t\tthis.modes =pieces[6];\n\t\t}\t\n\t\telse { // we are passed a structure\n\t\t\tthis.title =defRule.title;\n\t\t\tthis.body  =defRule.body;\n\t\t\tthis.tags  =defRule.tags;\n\t\t\tthis.fields ='';\n\t\t\tthis.InitVals=\"\";\t\n\t\t\tthis.modes = modes;\t\n\t\t}\t\n\t}\n\n\tfunction userInput(source){ //replace  % delimited strings with user input\n\n\t\treturn source.replace(/%\\[\\$(.*?)\\]%/g,function(m,key,offset,str){\n\t\t\t\n\t\t\tvar parts=key.split(\"::\");\n\t\t\tvar userString={value:\" \"};\n\t\t\t//alert(parts[0]+\"::\"+parts[1]);\n\t\t\tif (parts.length !==2) {\n\t\t\t\t//use as a single field\n\t\t\t\treturn  m;\n\t\t\t}\n\t\t\t//tcBrowser.UserInputDialog(parts[1],userString);\n\t\t\t\n\t\t\treturn (userString.value);\n\t\t}\n\t)};\n\t function decodeutf8(source) {\n\n\t\t var chr1,chr2,chr3,result=\"\",i=0;\n\t\t while (i <source.length){\n\t\t\t chr1= source.charCodeAt(i);\n\t\t\t if (chr1<128) {result+= String.fromCharCode(chr1);i++;}\n\t\t\t else {\n\t\t\t\t chr2=source.charCodeAt(i+1);\n\t\t\t\t if ((chr1 > 191) && (chr1 < 224)){result+= String.fromCharCode(((chr1 & 31) << 6) | (chr2 & 63));i+=2;}\n\t\t\t\t else {\n\t\t\t\t\t chr3=source.charCodeAt(i+2);\n\t\t\t\t\t result+= String.fromCharCode(((chr1 & 15) << 12) | ((chr2 & 63) << 6) | (chr3 & 63));\n\t\t\t\t\t i+=3;\n\t\t\t\t }\n\t\t\t }\n\t\t }\n\t\t return result;\n\t}\n\n\tfunction firstRemoteTid(pageData) {\n\t\tpageData.remoteTidIndex = 0;\n\t\treturn pageData.remoteTidArr[0];\n\t}\n\t\n\tfunction hasNextRemoteTid(pageData) {//alert(api.remoteTidArr.length + \" len \"+api.remoteTidIndex );\n\t\treturn (pageData.remoteTidIndex < pageData.remoteTidArr.length);\n\t}\n\t\n\tfunction nextRemoteTid(pageData) {\n\t\tpageData.remoteTidIndex += 1;\n\t\tif (pageData.remoteTidIndex === pageData.remoteTidArr.length) return null;\n\t\treturn pageData.remoteTidArr[pageData.remoteTidIndex];\t\n\t}\t\n//  BJ! TODO ADD A LOG THAT IS ONLY WRITTEN WHEN SAVING THE TW - this needs to be done in the finish() function of the shim\n    function performAction(cat,pageData) {\n\t\tdefaults.defaultCommands[cat].command(pageData);\n\t}\n\t// This is the function called when clicking the context menu item.\n\tfunction paste(catName,pageData, section, atHome, substitutionTiddler)\n\t{  \n\t\t//BJ: if atHome exists, then catName should be the name of a tiddler containing the cat, if this is \"\"\n\t\t//then use build in 'dummy' rule and use substitutionTiddler as input to the substitution engine\n\t\t\n\t\tstatus (\"paste enter\");\n\t\tvar cat = findCategory (findSection(section,twobj.getTidContents(\"TiddlyClipConfig\")), catName);\n\t\tif (!cat.valid) {\n\t\t\t\tcat = findCategory (findSection(section), catName);//look for default rule\n\t\t}\n\t\tif (!cat.valid) {\t\t\t\n\t\t\tstatus(\"not valid category\");\n\t\t\treturn;\n\t\t}\n\t\tstatus (\"valid category\");\n\t\t//could check for type of cat.rules if function then run -- allows module plugin with Tw5\n\t\tvar cancelled = {val:false};\n\t\tvar tiddlers = [],tideditMode=[];//list of tids to store\n\t\tvar catTags = cat.tags;//main config tags \n\t\tvar patterns = cat.rules;\n\t\tvar startrule=0;\n\n\t\tif(hasMode(cat,\"nosub\")) return;\n\t\t//now loop over each tiddler to be created(defined in the category's extension entry)\n\t\t//if a list of tiddlers are to be copied from a page then we will have to loop over them as well\n\n\t\tstatus (\"before subst loop\");\n\t\tif (!hasModeBegining(cat,\"tiddler\"))  { //user has not selected  tiddler mode\n\t\t\tfor(var i=startrule; i<patterns.length; i++)  {\t\n\t\t\t\tvar tiddlerObj, writeMode;\n\t\t\t\ttiddlerObj = new tiddlerAPI.Tiddler();\n\t\t\t\tstatus (\"before subst\");\n\t\t\t\t\n\t\t\t\ttiddlerObj.setPageVars(pageData);\n\t\t\t\ttiddlerObj.setNormal(patterns[i],pageData);\n\t\t\t\ttiddlerObj.subst(patterns[i],pageData);\n\n\t\t\t\tstatus (\"after subst\");\t\n\t\t\t\t//tiddlerObj.text=userInput(tiddlerObj.text); //not used at present\n\t\t\t\ttiddlerObj.addTags(catTags);\n\t\t\t\tstatus (\"after addTags\");\n\t\t\t\tif (cancelled.val==true) {return;}\n\t\t\t\t//if (pageData.data.WriteMode !=\"none\") writeMode=pageData.data.WriteMode;\n\t\t\t\t//add tiddlers one by one to our list of edits\n\t\t\t\ttiddlers.push(tiddlerObj);\n\n\t\t\t\tstatus (\"after push to list\");\n\t\t\t}\n\t\t} else { \n\t\t\tvar tid;\n\t\t\tfor (tid=firstRemoteTid(pageData); hasNextRemoteTid(pageData);tid=nextRemoteTid(pageData)){\n\t\t\t\tif (!hasMode(cat,\"tiddlerscopy\")) {\n\t\t\t\t\tfor(var i=startrule; i<patterns.length; i++)  {\t\n\t\t\t\t\t\tvar tiddlerObj, writeMode;\n\t\t\t\t\t\ttiddlerObj = new tiddlerAPI.Tiddler(tid);\n\t\t\t\t\t\tstatus (\"before subst\");\n\t\t\t\t\t\t\n\t\t\t\t\t\ttiddlerObj.setPageVars(pageData);\n\t\t\t\t\t\ttiddlerObj.setTids(patterns[i],pageData);\n\t\t\t\t\t\ttiddlerObj.subst(patterns[i],pageData);\n\t\t\t\t\t\tstatus (\"after subst\");\t\n\t\t\t\t\t\t//tiddlerObj.text=userInput(tiddlerObj.text); //not used at present\n\t\t\t\t\t\ttiddlerObj.addTags(catTags);\n\t\t\t\t\t\tstatus (\"after addTags\");\n\t\t\t\t\t\tif (cancelled.val==true) {return;}\n\t\t\t\t\t\t//if (pageData.data.WriteMode !=\"none\") writeMode=pageData.data.WriteMode;\n\t\t\t\t\t\t//add tiddlers one by one to our list of edits\n\t\t\t\t\t\ttiddlers.push(tiddlerObj);\n\n\t\t\t\t\t\tstatus (\"after push to list\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\ttiddlerObj=new tiddlerAPI.Tiddler(tid);\n\t\t\t\t\tvar writeMode;//no editmode\n\t\t\t\t\ttiddlerObj.addTags(catTags);\n\t\t\t\t\ttiddlers.push(tiddlerObj);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\tif(hasMode(cat,\"nosave\")) return;\n\t\tstatus (\"before adding to tw\");\n\t\tvar tidnames=[];\n\t\tfor (var i =0; i< tiddlers.length; i++) {\n\t\t\tif (!tiddlers[i].noSave()){\n\t\t\t\taddTiddlerToTW(tiddlers[i]);\n\t\t\t\ttidnames.push(tiddlers[i].fields.title)\n\t\t\t}\n\t\t}\n\t\tif(hasMode(cat,\"nofin\")) return;\n\t\ttwobj.finish(tidnames);\n\t}  \n     \n    function save(tiddlerObj) {\n\t\tswitch (tiddlerObj.getSaveMode()) {\n\t\t\tcase 'add/import':\n\t\t\t\tif (twobj.tiddlerExists(tiddlerObj.fields.title))  twobj.importtids(tiddlerObj);\n\t\t\t\telse twobj.modifyTW(tiddlerObj);\n\t\t\tbreak;\n\t\t\tcase 'add':\n\t\t\t\ttwobj.modifyTW(tiddlerObj);\n\t\t\tbreak;\n\t\t\tdefault: //import\n\t\t\t\ttwobj.importtids(tiddlerObj);\n\t\t}\n\t}\n\t\t\n\tfunction addTiddlerToTW( tiddlerObj) { \n\n\t\tswitch (tiddlerObj.getWriteMode()) {\n\t\t\tcase 'once':\n\t\t\t\tvar oldtid = twobj.getTiddler(tiddlerObj.fields.title);//retrieve existing version\n\t\t\t\tif (!!oldtid) break;\n\t\t\t\tsave(tiddlerObj);\n\t\t\t\tbreak;\n\t\t\tcase 'move':\n\t\t\t\tvar oldtid = twobj.getTiddler(tiddlerObj.fields.title);//retrieve existing version\n\t\t\t\tif (!!oldtid)  {\n\t\t\t\t\toldtid.fields.title =oldtid.fields.title +'/'+ new Date();//move old tid by appending the date to its title\n\t\t\t\t\toldtid.modes = tiddlerObj.modes //need to know the save mode\n\t\t\t\t\tsave(oldtid);//move out the way\n\t\t\t\t}\n\t\t\t\tsave(tiddlerObj);\n\t\t\t\tbreak;\n\t\t\tcase 'inc':\n\t\t\t\ttiddlerObj.fields.title = twobj.getNewTitle(tiddlerObj.fields.title); \n\t\t\t\tsave(tiddlerObj);\n\t\t\t\tbreak;\n\t\t\tdefault: //import\n\t\t\t\tsave(tiddlerObj);\n\n\t\t}\n\t}\n\n\treturn api;\n}());\n///end tPaste ///\ntiddlyclip.modules.twobj = (function () {\n\n\tvar api = \n\t{\n\t\tonLoad:onLoad, \t\t\ttiddlerExists:tiddlerExists,\n\t\tmodifyTW:modifyTW,\t\tgetTiddler:getTiddler,\n\t\tgetTidContents:getTidContents,finish:finish,\n\t\timporttids:importtids,\tgetNewTitle:getNewTitle\t\n\t}\n\tvar   tiddlerAPI;\n\tfunction onLoad () {\n\t\t\t\ttiddlerAPI \t= tiddlyclip.modules.tiddlerAPI;\n\t}\n\tvar tw =null;\n\tvar storeStart;\t\t\n\n\tfunction getTidContents(tidname) {\n\t\t\treturn tiddlyclip.getTidContents(tidname);\n\t}\t\n\tfunction getNewTitle(tidname) {\n\t\t\treturn tiddlyclip.getNewTitle(tidname);\n\t}\n\tfunction getTiddler(tidname) {\t\n\t\tvar storedTid=tiddlyclip.getTiddler(tidname);\n\t\tif (storedTid) {\n\t\t\treturn (new tiddlerAPI.Tiddler(storedTid,true));\n\t\t}\n\t\telse return null;\n\t}\t\t\n\tfunction modifyTW(t)\n\t{\n\t    var fields={}; \n\t\tt.attribs = t.attribs.filter(function(i) {return t.toRemove.indexOf(i) < 0;});\n\t\tfor (var i = 0; i < t.attribs.length;i++) {\n\t\t\t\tfields[t.attribs[i]]=t.fields[t.attribs[i]];//put extended fields into a group\n\t\t}\n\t\ttiddlyclip.modifyTW(fields);\n\t}\t\t\n\n\tfunction importtids(t){\n\t    var fields={}; \n\t\tt.attribs = t.attribs.filter(function(i) {return t.toRemove.indexOf(i) < 0;});\n\t\tfor (var i = 0; i < t.attribs.length;i++) {\n\t\t\t\tfields[t.attribs[i]]=t.fields[t.attribs[i]];//put fields into a group\n\t\t}\n\t\ttiddlyclip.importTids(fields);\n\t}\t\n\t\t   \t\t\t   \n\tfunction tiddlerExists(title) {\n\t\t\treturn tiddlyclip.tiddlerExists(title);\n\t}\t\n\n\tfunction finish(tids) \n\t{\n\t\ttiddlyclip.finish(tids);\n\t}\n\t\t\t   \t\t\t   \n\treturn api;\n}());\n///end twobj///\n\ntiddlyclip.modules.tiddlerAPI = (function () {\n\n\tvar api = \n\t{\n\t\tonLoad:onLoad, Tiddler:Tiddler\n\t}\n\tvar tcBrowser, twobj,pref, util, table;\n\t\n\tfunction onLoad(doc) {\n\t\ttcBrowser\t= tiddlyclip.modules.tcBrowser;\n\t\ttwobj\t\t= tiddlyclip.modules.twobj;\t\n\t\tdefaults\t= tiddlyclip.modules.defaults;\n\t}\n\tfunction createDiv(){\n\t\treturn document.createElement(\"div\");\n\t}\n\t// Static method to bracket a string with double square brackets if it contains a space\n\tfunction encodeTiddlyLink(title)\n\t{\n\t\treturn title.indexOf(\" \") == -1 ? title : \"[[\" + title + \"]]\";\n\t};\n\n\t// Static method to encodeTiddlyLink for every item in an array and join them with spaces\n\tfunction encodeTiddlyLinkList(list)\n\t{\n\t\tif(list) {\n\t\t\tvar t,results = [];\n\t\t\tfor(t=0; t<list.length; t++)\n\t\t\t\tresults.push(encodeTiddlyLink(list[t]));\n\t\t\treturn results.join(\" \");\n\t\t} else {\n\t\t\treturn \"\";\n\t\t}\n\t};\n\tfunction removeDuplicates(names) {\n\t\tvar i,j,dup,nams = []; \n\n\t\t// Parse a string array from a bracketted list. For example \"OneTiddler [[Another Tiddler]] LastOne\"\n\t\tvar parseStringArray = function(value) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\tvar memberRegExp = /(?:^|[^\\S\\xA0])(?:\\[\\[(.*?)\\]\\])(?=[^\\S\\xA0]|$)|([\\S\\xA0]+)/mg,\n\t\t\t\t\tresults = [],\n\t\t\t\t\tmatch;\n\t\t\t\tdo {\n\t\t\t\t\tmatch = memberRegExp.exec(value);\n\t\t\t\t\tif(match) {\n\t\t\t\t\t\tvar item = match[1] || match[2];\n\t\t\t\t\t\tif(item !== undefined && results.indexOf(item) === -1) {\n\t\t\t\t\t\t\tresults.push(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} while(match);\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t\tnlist = parseStringArray(names);\n\t\t/*\n\t\tfor ( i=0; i < nlist.length; i++)\n\t\t\tnlist[i] = nlist[i].trim();\n\t\tfor ( i=0; i < nlist.length; i++){\n\t\t\tdup = false;\n\t\t\tfor ( j = i ; j > 0; j--) {\n\t\t\t\tif (nlist[i] === nlist[j-1]){\n\t\t\t\t\tdup = true;// alert(\"dup\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!dup) nams.push(nlist[i]);\n\t\t}\n\t\t*/\n\t\treturn encodeTiddlyLinkList(nlist);\n\t}\n\tfunction Tiddler(el,truetid) {\n\t\tthis.attribs = [\"text\"];\n\t\tthis.toRemove =[];\n\t\tvar current = this;\n\t\tcurrent.fields = {};\n\t\tcurrent.fields.text =\"\";\n\t\t//current.fields.title =\"\";\t\n\t\tif (!el) { \n\t\t\tel =  tiddlyclip.newProtoTiddler();\n\t\t\tfor (var atr in el.fields){ \n\t\t\t\t\tcurrent.fields[atr]=el.fields[atr];\n\t\t\t\t\tcurrent.attribs.push(atr);\t\t\n\t\t\t}\t\t\t\n\n\t\t    this.fields.tags=\"\";//BJ FIX remove or move to adapter\n\t\t} else if (!truetid) {\n\t\t\tif((typeof el) ===\"string\"){ //convert html to dom ;\n\t\t\t\tvar wrapper= createDiv();\n\t\t\t\twrapper.innerHTML= el;\n\t\t\t\tel= wrapper.firstChild;\n\t\t\t\twrapper = {};//release div\n\t\t\t}\t\t\t\t\t\t\t\t \t\t\t\t\n\t\t\tthis.fields.text = undoHtmlEncode(el.innerHTML.\n\t\t\t\t\treplace(/\\n<pre xmlns=\"http:\\/\\/www.w3.org\\/1999\\/xhtml\">([\\s|\\S]*)<\\/pre>\\n/mg,\"$1\").\n\t\t\t\t\treplace(/\\n<pre>([\\s|\\S]*)<\\/pre>\\n/mg,\"$1\"));\n\t\t\tvar  j = el.attributes, m, extraTags='';\n\t\t\tfor (var i = j.length; i!== 0; i--) {\n\t\t\t\tm=j[i-1].nodeName; \n\t\t\t\tv=j[i-1].value;\n\t\t\t\tthis.attribs.push(m);\n\t\t\t\tthis.fields[m] = undoHtmlEncode(v) ;\n\t\t\t}\n\n\t\t} else {\n\t\t\tfor (var atr in el.fields){ \n\t\t\t\tcurrent.fields[atr]=el.fields[atr];\n\t\t\t\tcurrent.attribs.push(atr);\t\t\n\t\t\t}\n\t\t\tif (!!this.fields.tags) this.fields.tags = (this.fields.tags instanceof Array)?this.fields.tags.join(' '):this.fields.tags;\n\t\t    else this.fields.tags=\"\";\n\t\t\t//this.body =   this.text;\n\t\t} \n\t\t\n\t\treturn this;\n\t}\n\t\n\tTiddler.prototype.addMimeType=function(mime){\n\t\tthis.attribs.push('type');\n\t\tthis.fields.type = mime;\n\t}\n\t\n\tTiddler.prototype.exportFieldsTo=function(obj){\n\t\tif (!obj) return null;\n\t\tfor (var i = 0; i<this.attribs.length; i++){ \n\t\t\tvar atr = this.attribs[i];\n\t\t\tobj[atr]=this.fields[atr]; \t\n\t\t};\t\t\t\t\t \n\t\treturn obj;\n\t}\t\n\n\tTiddler.prototype.noSave=function(){\n\t\treturn (!this.fields.title ||this.hasMode(\"nosave\"));\n\t}\n\t\t\n\tTiddler.prototype.addTags=function(tags){\n\t\tif (!tags) return;\n\t\tif (!this.fields.tags) {\n\t\t\tthis.fields.tags = removeDuplicates(tags);\n\t\t\tthis.attribs.push(\"tags\");\t\n\t\t}\n\t\telse {\n\t\t\tthis.fields.tags = removeDuplicates(this.fields.tags + ' '+ tags);\n\t\t}\n\t}\n\n\tTiddler.prototype.applyEdits = function(fields) {\n\t\tfor (var i in fields){\t\t\t\t\n\t\t\tif (!this.hasOwnProperty(i)) this.attribs.push(i);//add to list of fields to update. BJ should be this.attribs.hasOwnProperty(i)??\n\t\t\tthis.fields[i] = fields[i];\n\t\t}\n\t}\n\t\n\tTiddler.prototype.removeField = function(field) {\n\t\t\tthis.toRemove.push(field);\n\t}\n\n\tTiddler.prototype.hasMode=function(mode){\n\t\tif (!this.modes) return false;\n\t\tfor (var i=0; i< this.modes.length;i++)\n\t\t\tif (mode === this.modes[i]) return true;\n\t\treturn false;\n\t}\n\t\n\tTiddler.prototype.getWriteMode=function(mode){\n\t\tvar writeMode = 'normal';\n\t\tif (!this.modes) return writeMode;\n\t\tif (this.hasMode(\"move\")) return \"move\";\n\t\telse if (this.hasMode(\"once\")) return \"once\";\n\t\telse if (this.hasMode(\"inc\")) return \"inc\";\n\t\treturn writeMode;\n\t}\n\t\n\tTiddler.prototype.getSaveMode=function(mode) {\n\t\tif (!this.modes) return 'import';\n\t\telse if (this.hasMode(\"add/import\")) return \"add/import\";\n\t\telse if (this.hasMode(\"add\")) return \"add\";\n\t\treturn 'import';\n\t}\n\t\n\tfunction undoHtmlEncode( input ) {\n\t\tinput =input\n        .replace(/&bar;/g, '|')\n        .replace(/&quot;/g, '\"')\n        .replace(/&lt;/g, '<')\n        .replace(/&gt;/g, '>')\n        .replace(/&amp;/g, '&');\n        return (input);   \n\t}\n\n\tfunction extractModes(tagString) {\n\t\tvar modes =[], tList = tagString.split(' ');\n\t\tfor (var i=0; i< tList.length; i++) {\n\t\t\tmodes[i] = tList[i].trim();\n\t\t}\n\t\treturn modes;\n\t}\n\tTiddler.prototype.setPageVars  =\tfunction (pageData){\n\t\tvar dateLong=    'DDD, MMM DDth, YYYY';\n\t\tvar dateTimeLong='DDD, MMM DDth, YYYY at hh12:0mm:0ss am';\t\n\t\tvar dateShort=   'DD MMM YYYY';//journal form\n\t\tvar dateTimeShort=   'YYYY/MM/DD 0hh:0mm:0ss';//journal form\n\n\t\tvar dates =tiddlyclip.dates();\n\t\tfor (var atr in dates){ \n\t\t\tpageData.data[atr]=dates[atr];\n\t\t}\n\t\tpageData.data.category1stWord=pageData.data.category.replace(/(.*) (.*)/,\"$1\");\n\n\t\tvar macrosx =defaults.getDefs();\n\t\ttable={$:{}};table['#']={};table['@']={};\n\t\tfor (var n in pageData.data) {table['@'][n]= pageData.data[n];}\n\t\tfor (var n in macrosx) {table['@'][n]= macrosx[n];}\n\t}\n\n\tTiddler.prototype.setTids  =\tfunction (rule,pageData){\n\n\t\t//---first determine the title\n\t\ttable['#']={};\t\n\t\tthis.exportFieldsTo(table['$']);\n\t\tthis.parseStructure(rule.title);\n\t\tvar title = table['$'].title;\t\t\t \n\t\ttable['@']['newtiddler']= 'false';\n\n\t\t//xecute mode rule and obtain (possibly) modified modes\n\t\tthis.parseStructure(rule.modes);\t\t\t \n\t\tthis.modes=extractModes(table['#']['newdata']);\n\t\t//---modes are now determined \n\t}\n\t\n\tTiddler.prototype.setNormal  =\tfunction (rule,pageData){\n\n\t\t//---first determine the title\n\t\tthis.parseStructure(rule.title);\n\t\tvar title = table['$'].title;\t\t\t \n\t\ttable['#']={};\t\t\n\t\t//---next we need to find the modes before we can decide how to update\n\t\t//-----1- does tiddler exist already?\n\t\tvar storedTid=twobj.getTiddler(title);\n\t\tif (storedTid) {\n\t\t\tstoredTid.exportFieldsTo(table['$']);\n\t\t\ttable['@']['newtiddler']= 'false';\n\t\t} else {\n\t\t\ttable['@']['newtiddler']= 'true';\n\t\t\tthis.exportFieldsTo(table['$']);\n\t\t}\n\t\t//-----2- execute mode rule and obtain (possibly) modified modes\n\t\tthis.parseStructure(rule.modes);\t\t\t \n\t\tthis.modes=extractModes(table['#']['newdata']);\n\t\t//---modes are now determined \n\t\ttable['#']={};\n\t\ttable['$']={};\n\n\t\t//---expose whether this is a new tiddler\n\t\tif (this.hasMode('append')||this.hasMode('prepend')||this.hasMode('modify')) {\n\t\t\tvar storedTid=twobj.getTiddler(title);\n\t\t\tif (storedTid) {\n\t\t\t\tstoredTid.exportFieldsTo(table['$']);\n\t\t\t\ttable['@']['newtiddler']= 'false';\n\t\t\t} else { \n\t\t\t\tthis.exportFieldsTo(table['$']);\n\t\t\t\tthis.parseStructure(rule.InitVals);\n\t\t\t\ttable['@']['newtiddler']= 'true';\n\t\t\t}\n\t\t}\n\t\telse \n\t\t{\n\t\t\tthis.exportFieldsTo(table['$']);\n\t\t\tthis.parseStructure(rule.InitVals);\n\t\t\ttable['@']['newtiddler']= 'true';\n\t\t}\n\t\ttable['$'].title=title;\n\t}\n\tTiddler.prototype.subst  =\tfunction (rule,pageData){\n\t\t//---apply rules\n\t\ttable['#']={};\n\t\tthis.parseStructure(rule.body);\t\n\t\t//---check to see if user will handle insertion of new text\t\t \n\t\tif (!this.hasMode('no-textsaver')) {\n\t\t\tvar data = table['#']['newdata'], prepend =this.hasMode('prepend');\n\t\t\tstatus (\"not textsaver with data \"+ data+\" olddata \"+\ttable['$']['text']);\n\t\t\t//BJ does this.fields.text exist with a new tiddler? \n\t\t\ttable['$']['text'] = (!!prepend)?data + table['$']['text'] :table['$']['text'] + data;\n\t\t}\n\t\ttable['#']={};\n\t\tthis.parseStructure(rule.tags);\t\n\n\t\ttable['#']={};\n\t\ttable['@'].fields=table['$'];\n\t\tthis.parseStructure(rule.fields);\n\t\t//---move data from parser table into tiddler\n\t\tthis.applyEdits(table['$']);\n\t\treturn this;\n\t}\n\t///////////////// parser implementation /////////////////\n\tvar error=function (message) {\n\t\t alert(message);\n\t}\n\n\tfunction getSimpleVarFrom (n ) {\n\t\tn = n.trim();\n\t\tvar type = n.substring(0,1);\n\t\tif (type !== '#' &&type !=='$' && type !=='@') error(\"variable: invalid name \"+n);\n        else return {type:type, leftSide:n.substring(1)};\n\t}\n\tfunction valOf(n, test) {\n\t\tvar val, type = n.substring(0,1);\n\t\tif (type !== '#' &&type !=='$'&&type !=='@'){\n\t\t\terror(\"source: invalid name\"+n);\n\t\t\treturn null;\n\t\t}\n\t\telse {\n\t\t\tval=table[type][n.substring(1)];\n\t\t\tif (val == undefined) { \n\t\t\t\tif (!test)  error(\"source: invalid val \"+n);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn val;\n\t\t}\n\t }\n\tfunction toValues(sources) {\n\t\tvar values = [], returned;\n\t\tfor (var i = 0 ; i < sources.length ;i++) {\n\t\t\tif ((values[i]= valOf(sources[i]))==null) return null;\n\t\t}\n\t\treturn  values;\n\t}\n\tfunction makeInt (value) {\n\t\tif(/^(\\-|\\+)?([0-9]+)$/.test(value)) {\n\t\t\treturn Number(value);\n\t\t}\n\t\treturn NaN;\n\t}\n\n\tTiddler.prototype.parseStructure=function(cb,localonly) {\n\t\t//updates the global 'table'\n\t\tvar target, b;\n\t\ttry {\n\t\tb=JSON.parse(cb);\n\t\t} catch(e) {\n\t\t\terror(cb+\" is not a json\");\n\t\t\treturn;\n\t\t}\n\t\tfor (var i=0; i < b.length; i++) {\n\t\t\tvar moreThanOne = 0;\n\t\t\tfor (var n in b[i]) {//n is our nodes combined target/operator string - eg #x#EQ\n\t\t\t\tif (moreThanOne) error (\"general:more than one subterm in node\");\n\t\t\t\tvar rightSide =b[i][n];\n\t\t\t\tif (typeof rightSide === \"object\") error(\"source: invalid type object\");\n\t\t\t\telse if (typeof rightSide === \"string\") {\n\t\t\t\t\tvar replaceOp= this.replaceALL(rightSide);\n\t\t\t\t\tif (!replaceOp.abort) rightSide = replaceOp.result;\n\t\t\t\t\telse {\n\t\t\t\t\t\tmoreThanOne++;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse error(\"source: invalid type\");\n\t\t\t\tvar returedVals =  getSimpleVarFrom (n);\n\t\t\t\tvar leftSide =  returedVals.leftSide;\n\t\t\t\tvar type \t =  returedVals.type;\n\t\t\t\tif (type !== '#' &&type !=='$') error(\"target: invalid name \"+n);\t\t\t\n\t\t\t\tif (!localonly)  table[type][leftSide] = rightSide;\n\t\t\t\telse {\n\t\t\t\t\tif (type=='#') table[type][leftSide] = rightSide;\n\t\t\t\t\telse error(\"target: invalid assignment\");\n\t\t\t\t}\n\t\t\t\tmoreThanOne++;\t\t\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction handleBinaryForm(leftSide,operator,rightSide) {\n\t\tswitch (operator) {\n\t\t\tcase 'PS':\n\t\t\tcase 'MS':\n\t\t\t\trightSide = makeInt(rightSide);\n\t\t\t\tif ( isNaN(rightSide)) {error(\"rightside: can only add integers\"); return null;}\n\t\t\t\tleftSide = makeInt(leftSide);\n\t\t\t\tif (isNaN(leftSide)) {error(\"leftside: can only add integers\"); return null;}\n\t\t\t\treturn ((operator==='PS')?leftSide+rightSide:leftSide-rightSide);\t\t\t\n\t\t\t\tbreak;\n\t\t\tcase 'EQ':\n\t\t\tcase 'NQ':\n\t\t\t//alert(leftSide+\" cmp \"+rightSide);\n\t\t\t\treturn ((operator==='EQ')?leftSide==rightSide:leftSide!=rightSide);\t\t\t\n\t\t\t\tbreak;\n\t\t\tdefault: error(\"operator not found\");\n\t\t\t\t\t return null;\n\t\t}\t\n\t}\n\t Tiddler.prototype.abort=function(source) {\n\t\tif (/@abort\\(/.test(source) ){ return true;}\n\t\treturn false;\n\t}\n\t Tiddler.prototype.handleFunction=function(source) {\n\t\tvar self = this, abort=false;\n\t\tfunction alertAll() {\n\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\targs.unshift('alertAll');\n\t\t\talert(args.join(' '));\n\t\t}\n\t\tif (!/@(.*)\\(([\\S\\s]*?)\\)/.test(source) )return {result:null,abort:abort};\n\t\t//abort macro\n\t\treturn {result:source.replace(/@(.*)\\(([\\S\\s]*?)\\)/g,function(m,key1,key2,offset,str){\n\t\t\tif (key1==\"delete\") {\n\t\t\t\tself.removeField(key2.substring(1));\n\t\t\t\treturn \"deleted \"+key2;\n\t\t\t}\n\t\t\tif (key1==\"abort\") {\n\t\t\t\tif (!key2) {abort=true;return null;} //empty params means abort whatever\n\t\t\t\tif (valOf(key2, true) == null) {abort=true;return null;} //if val not exist abort\n\t\t\t\tif (valOf(key2) === 'false'){abort=true;return null;}\n\t\t\t\treturn \"\";//otherwise just remove the abort() token\n\t\t\t}\n\t\t\tif (key1==\"exists\") {\n\t\t\t\tif (valOf(key2, true) != null)\n\t\t\t\t\treturn \"true\";\n\t\t\t\telse\n\t\t\t\t\treturn \"false\"\n\t\t\t}\n\t\t\tif (key1==\"alert\") {\n\t\t\t\tif (valOf(key2) == null)\n\t\t\t\t\talert(key2+\" null\");\n\t\t\t\telse\n\t\t\t\t\talert(valOf(key2));\n\t\t\t\treturn \"alerted\";\n\t\t\t}\n\n\t\t\t//handle normal functions\n\t\t\tvar vals;\n\t\t\tif (!!key2) vals = toValues(key2.split(/\\s*,\\s*/));\n\t\t\telse vals = null;\n\t\t\tif (key1==\"alertAll\") {\n\t\t\t\t\talertAll.apply(null,vals);\n\t\t\t\t\treturn \"all alerted\";\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn tiddlyclip.macro[key1].apply(null,vals);\n\t\t\t}\n\t\t\tcatch(e) {\n\t\t\t\talert (key1 + \"marco not found\");\t\n\t\t\t}\n/*\n\t\t\ttry {\n\t\t\t\treturn tiddlyclip[key1](val);\n\t\t\t} catch (e) {\n\t\t\t\terror (\"macro \"+key1 +\" not found\");\n\t\t\t\treturn \"macro \" + key1 + \" not found\";\n\t\t\t} \n*/\t\t\t\t\n\t\t\treturn m;\n\t\t}),abort:abort};\n\t}\n\t\n\tTiddler.prototype.replaceALL=function(source, data){ //replace all ((* *)) delimited strings\n\t\tvar self = this, abort=false;\n\t\treturn {result:source.replace(/\\(\\(\\*([\\S\\s]*?)\\*\\)\\)/g,function(m,key,offset,str){ \n\t\t\tvar parts, vals, res, firstterm, firstparts, testedTrue = true;\n\t\t\t// check for  ((*conditional*??*Use this variable*??*or use this variable*))\n\t\t\tfirstparts= key.split(\"*??*\");\n\t\t\t//handle conditional string\n\t\t\tif (firstparts.length >1) {\t\n\t\t\t\tvar negate=(firstparts[0].substring(0,1)== '!');\n\t\t\t\tif (negate) {\n\t\t\t\t\tfirstterm = firstparts[0].substring(1);\n\t\t\t\t} else {\n\t\t\t\t\tfirstterm = firstparts[0];\n\t\t\t\t}\n\t\t\t\t// regex condition\n\t\t\t\tif ((parts= firstterm.split(\"/\")).length ==3) {\n\t\t\t\t\tif ((vals = toValues(parts)) == null) return m;\n\t\t\t\t\tvar regParts = (valOf(parts[1])).split(\"/\");\n\t\t\t\t\tvar pattern=new RegExp(regParts[1],regParts[2]);\n\t\t\t\t\t\n\t\t\t\t\tif (negate&&pattern.test(vals[0])) testedTrue = false;\n\t\t\t\t\telse if (!negate&&!pattern.test(vals[0]))testedTrue = false;\n\t\t\t\t}\n\t\t\t\t// comparision\n\t\t\t\telse if ((parts= firstterm.split(\"==\")).length ==2) {\n\t\t\t\t\tif ((vals =toValues(parts))==null) return m;\n\t\t\t\t\tif ((res=handleBinaryForm(vals[0],negate?\"NQ\":\"EQ\",vals[1]))==null) return m;\n\t\t\t\t\telse if (!res) testedTrue = false; \n\t\t\t\t} \n\t\t\t\t// macro\n\t\t\t\telse if ((res = self.handleFunction(firstterm).result) != null) { // a function\n\t\t\t\t\tif ( negate && res===\"true\") \t{testedTrue = false;}\n\t\t\t\t\tif (!negate && res===\"false\") {testedTrue = false;}\n\n\t\t\t\t}\n\t\t\t\t// boolean variable\n\t\t\t\telse {\n\t\t\t\t\tif ((vals =valOf(firstterm))==null)  return m;\n\t\t\t\t\tif ( negate && vals===\"true\") \ttestedTrue = false;\n\t\t\t\t\tif (!negate && vals===\"false\") testedTrue = false;\n\t\t\t\t}\n\n\t\t\t\tif (testedTrue) {\n\t\t\t\t\tkey = firstparts[1];\n\t\t\t\t} \n\t\t\t\telse { \n\t\t\t\t\tif (firstparts.length == 2) return '';//no 'else' defined\n\t\t\t\t\tkey = firstparts[2];\n\t\t\t\t}\n\t\t\t}\n\t\t\t// end of handling conditional string part\n\t\t\tvar parts;\n\t\t\t// regex ((*@PageRef/#rule/#term*)) or ((*.....*??*@PageRef/#rule/#term*))\n\t\t\tif ((parts = key.split(\"/\")).length ==3) {\n\t\t\t\tif ((vals = toValues(parts)) == null) return m;\n\t\t\t\tvar regParts = (valOf(parts[1]));\n\t\t\t\tvar regexBody = regParts.replace(/\\/([\\s\\S]*)\\/.*$/,\"$1\");\n\t\t\t\tvar regexflags = regParts.replace(/.*\\/(.*?)$/,\"$1\");\n\t\t\t\tvar pattern=new RegExp(regexBody,regexflags);\n\t\t\treturn vals[0].replace(pattern, vals[2]);\n\t\t\t}\n\t\t\t// substitute\n\t\t\tif ((parts = key.split(\":\")).length ==3) {\n\t\t\t\tif ((vals = toValues(parts)) == null) return m;\t\t\n\t\t\t\treturn vals[0].replace(vals[1], vals[2]);\n\t\t\t}\n\t\t\t// add \n\t\t\tif ((parts = key.split(\"+\")).length == 2) {\n\t\t\t\tif ((vals = toValues(parts)) == null) return m;\n\t\t\t\tif ((res = handleBinaryForm(vals[0],\"PS\",vals[1])) == null) return m;\n\t\t\t\treturn res.toString();\n\t\t\t}\t\n\t\t\t// subtract\t\n\t\t\tif ((parts= key.split(\"-\")).length ==2) {\n\t\t\t\tif ((vals = toValues(parts)) == null) return m;\n\t\t\t\tif ((res = handleBinaryForm(vals[0],\"PS\",vals[1])) == null) return m;\n\t\t\t\treturn res.toString();\n\t\t\t}\n\t\t\t// macro\n\t\t\tvar returned = self.handleFunction(key);\n\t\t\tif (returned.abort) {abort=true; return null};//abort replaceAll completely\n\t\t\tif ((res = returned.result) != null) return res;\n\t\t\telse \n\t\t\t// vanilla variable\n\t\t\tif ((res = valOf(key)) != null) return res;\n\t\t\t// error\n\t\t\treturn m;\n\t\t}),abort:abort};\n    }\n\t///////////////// parser implementation end/////////////////\n\treturn api;\n\t\n}());\n///end tiddlerObj///\n tiddlyclip.modules.defaults = (function () {\n\tvar defaultCommands = {\n\t\tsearch:{tip:'search selection in tw', command:function(){alert(\"mysearch\")}}\n\t};\n\tvar tPaste, twobj;\n\tfunction onLoad() {\n\t\ttwobj=tiddlyclip.modules.twobj;\n\t}\n\tvar api = \n\t{\n\t\tonLoad:onLoad, getDefaultRule:getDefaultRule, \n\t\tgetDefaultCategories:getDefaultCategories,\n\t\tgetDefs:getDefs,\n\t\tdefaultCommands:defaultCommands\n\t}\t\n\n\tfunction getDefs(){\n\t\tif (!twobj.tiddlerExists(\"TiddlyClipDefs\"))  return tiddlyclip.defs;\n\n\t\tvar content = twobj.getTidContents(\"TiddlyClipDefs\");//where all marcos are defined\t\n\t\ttry {\n\t\t\tif (content ==\"\") return tiddlyclip.defs;\n\t\t\tvar values =JSON.parse(content);\n\t\t\tif (!!values) {return values;}\n\t\t}catch(e){\t\n\t\t}\n\t\treturn tiddlyclip.defs; \n\t}\n\t\n\tfunction getDefaultCategories() {\n\t\treturn tiddlyclip.defaultCategories;\n\t}\t\t\n \n\tfunction getDefaultRule(ruleName) {\n\t\treturn tiddlyclip.getDefaultRule(ruleName);\n\t}\n \treturn api;\n}());\n///end defaults///\n\n\nvar MODULES = tiddlyclip.modules;\nfor (var mod in MODULES) {\n\tMODULES[mod].onLoad();\n}\n\n} \n\n}());\n\n"
        },
        "defaultPin": {
            "title": "defaultPin",
            "type": "text/vnd.tiddlywiki",
            "text": "\\rules only table wikilink prettylink\n\n|!Title|!Body|!Tags|!Fields modifiers|!field initials|!Modes|\n|((*@pageTitle*))|((*@pageRef*))\\n\\n[img[((*@onImage*??*@imageURL*??*@largestImgURL*))]]\\n\\n((*@text*))\\n\\n((*@exists(@userstring)*??*@userstring*))|||{\"$location\":\"((*@pageRef*))\"},{\"$caption\":\"((*@pageTitle*))\"},{\"$when\":\"((*@dateTimeShort*))\"}|inc add|\n"
        },
        "defaultSnap": {
            "title": "defaultSnap",
            "type": "text/vnd.tiddlywiki",
            "text": "\\rules only table wikilink prettylink\n\n|!Title|!Body|!Tags|!Fields modifiers|!field initials|!Modes|\n|((*@pageTitle*))/thumbprint|((*@exists(@snap)*??*@snap*))|ClippedImage||{\"$type\":\"image/png\"},{\"$when\":\"((*@dateTimeShort*))\"},{\"$location\":\"((*@pageRef*))\"}|[[SnapRuleMode]]|\n|((*@pageTitle*))|((*@pageRef*))\\n\\n{{((*@pageTitle*))/thumbprint}}\\n\\n((*@text*))\\n\\n|||{\"$location\":\"((*@pageRef*))\"},{\"$caption\":\"((*@pageTitle*))\"},{\"$when\":\"((*@dateTimeShort*))\"}|append add|\n"
        },
        "defaultSnip": {
            "title": "defaultSnip",
            "type": "text/vnd.tiddlywiki",
            "text": "\\rules only table wikilink prettylink\n\n|!Title|!Body|!Tags|!Fields modifiers|!field initials|!Modes|\n|((*@pageTitle*))|((*@pageRef*))\\n\\n((*@text*))\\n\\n|||{\"$location\":\"((*@pageRef*))\"},{\"$caption\":\"((*@pageTitle*))\"},{\"$when\":\"((*@dateTimeShort*))\"}|append add|\n\t\t\t\t\t\t\n"
        },
        "defaultTip": {
            "title": "defaultTip",
            "type": "text/vnd.tiddlywiki",
            "text": "\\rules only table wikilink prettylink\n\n|!Title|!Body|!Tags|!Fields modifiers|!field initials|!Modes|\n||||{\"#type\":\"text/x-tiddlywiki\"},{\"$type\":\"((*@classic*??*#type*??*@abort()*))\"}||no-textsaver import|\n\n\n"
        },
        "$:/plugins/bj/tiddlyclip/tcadapter.js": {
            "text": "/*\\\ntitle: $:/plugins/bj/tiddlyclip/tcadapter.js\ntype: application/javascript\nmodule-type: widget\n\n\n\\*/\n\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nif($tw.browser) {\n\trequire(\"$:/plugins/bj/tiddlyclip/tidpaste.js\");\n}\nvar CreateTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tiddlyclip-create\", handler: \"handleTiddlyclipEvent\"}\n\t]);\n};\n\n\n/*\nInherit from the base widget class\n*/\nCreateTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCreateTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n}\n\nCreateTiddlerWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[all[shadows+tiddlers]tag[$:/tags/tiddlyclip]]\";\n\treturn this.wiki.filterTiddlers(defaultFilter,this);\n}\n/*\nCompute the internal state of the widget\n*/\nCreateTiddlerWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get our parameters here we could allow an module to modify the plugin\n\t// Get the commands and place them in the tiddlyclip structure to expose them to the user\n\ttiddlyclip.dates=function(){\n\t\tvar dates ={};\n\t\tvar dateLong=    'DDD, MMM DDth, YYYY';\n\t\tvar dateTimeLong='DDD, MMM DDth, YYYY at hh12:0mm:0ss am';\t\n\t\tvar dateShort=   'DD MMM YYYY';//journal form\n\t\tvar dateTimeShort=   'YYYY/MM/DD 0hh:0mm:0ss';//journal form\n\t\t\n\t\tdates.yearMonth=$tw.utils.stringifyDate(new Date()).replace(/(.*)\\.(.*)/,\"$1\").substr(0,6);\n\t\tdates.dateTimeLong=   $tw.utils.formatDateString(new Date(),dateTimeLong);\t\n\t\tdates.dateLong=       $tw.utils.formatDateString(new Date(),dateLong);\t\t\n\t\tdates.dateShort=      $tw.utils.formatDateString(new Date(),dateShort);\t       \n\t\tdates.dateComma=     dates.dateShort.toString().replace(/ /g,':');\n\t\tdates.dateTimeShort=  $tw.utils.formatDateString(new Date(),dateTimeShort);\n\t\treturn dates;\n\t}\n\ttiddlyclip.getDefaultRule=function (ruleName) {\n\t\tvar defaultRules = {\n\t\t\tdefaultTid:'||||{\"#type\":\"text/x-tiddlywiki\"},{\"$type\":\"((*@classic*??*#type*??*@abort()*))\"}||no-textsaver import|',\n\t\t\tdefaultSnip:\n\t\t\t'|((*@pageTitle*))/thumbprint|((*@exists(@snap)*??*@snap*))|ClippedImage|'+\n\t\t\t'|{\"$type\":\"image/png\"},{\"$when\":\"((*@dateTimeShort*))\"},{\"$location\":\"((*@pageRef*))\"}|[[SnapRuleMode]]|'+\n\t\t\t'|((*@pageTitle*))|((*@pageRef*))\\\\n\\\\n{{((*@pageTitle*))/thumbprint}}\\\\n\\\\n((*@text*))\\\\n\\\\n||'+\n\t\t\t'|{\"$location\":\"((*@pageRef*))\"},{\"$caption\":\"((*@pageTitle*))\"},{\"$when\":\"((*@dateTimeShort*))\"}||',\n\t\t\tdefaultPin: '|((*@pageTitle*))|((*@pageRef*))\\\\n\\\\n[img[((*@onImage*??*@imageURL*??*@largestImgURL*))]]\\\\n\\\\n((*@text*))\\\\n\\\\n((*@exists(@userstring)*??*@userstring*))||'+\n\t\t\t\t\t\t'|{\"$location\":\"((*@pageRef*))\"},{\"$caption\":\"((*@pageTitle*))\"},{\"$when\":\"((*@dateTimeShort*))\"}|inc|'\n\t\t}\n\t\treturn defaultRules[ruleName];\n\t}\n\ttiddlyclip.defaultCategories = [\n\t\t\"|Tid|copy tids||defaultTid|tiddlers|\",\n\t\t\"|Snip|copy||defaultSnip||\",\n\t\t\"|Pin|Pin it||defaultPin||\"\n\t];\n\n\ttiddlyclip.defs = {\n\t}\n\ttiddlyclip.newProtoTiddler = function (){\n\t\tvar tid = new $tw.Tiddler($tw.wiki.getCreationFields(),$tw.wiki.getModificationFields());\n\t\tvar current = {fields:{}};\n\t\tfor (var atr in tid.fields){ \n\t\t\tcurrent.fields[atr]=tid.getFieldString(atr);\t\n\t\t}\n\t\treturn current;\t\n\t}\n\ttiddlyclip.modifyTW= function(fields){\n\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(fields,$tw.wiki.getModificationFields()));\n\t}\n\ttiddlyclip.getNewTitle= function(base,options) {\n\t\t\toptions = options || {prefix: \"-\"};\n\t\t\treturn $tw.wiki.generateNewTitle(base,options);\n\t}\n\ttiddlyclip.getTidContents= function(tidname) {\n\t\tvar tiddler = $tw.wiki.getTiddler(tidname);\n\t\t\tswitch (tiddler.fields.type) {\n\t\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\t\treturn JSON.stringify($tw.utils.parseFields(tiddler.fields.text));\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn $tw.wiki.getTiddlerText(tidname);\n\t}\n\t//$tw.wiki.my.logEnable= function() {tiddlyclip.logit=true};\n\t//$tw.wiki.my.logDisable= function() {tiddlyclip.logit=false};\n\ttiddlyclip.log= function(x) {\n\t\t//if (tiddlyclip.logit) \n\t\t//alert(x);\n\t};\n\ttiddlyclip.tiddlerExists= function(title) {\n\t\t\treturn($tw.wiki.tiddlerExists(title));\n\t}\t\n\ttiddlyclip.getTiddler= function (title) {\n\t\tvar tid = $tw.wiki.getTiddler(title);\n\t\tif (!tid){\n\t\t\treturn null;\n\t\t}\n\t\tvar current = {fields:{}};\n\t\tfor (var atr in tid.fields){ \n\t\t\tcurrent.fields[atr]=tid.getFieldString(atr);\t\n\t\t}\n\t\treturn current;\t\n\t}\t\n\ttiddlyclip.finish=function (tids) {\n\t\tself.dispatchEvent({type: \"tm-auto-save-wiki\"}); \n\t}\n\ttiddlyclip.importTids =function (tidfields) {\n\t\t//tiddlyclip.log(\"savefile at last!\");\n\t\t// Get the details from the message\n        var tiddlerFieldsArray = [tidfields];\t\t\t\t\t\n\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\t\n\t}\n\tthis.list = this.getTiddlerList();\n\ttiddlyclip.macro={};\n\t$tw.utils.each(this.list,function(title,index) {\n\t\ttry {\n\t\t\tvar func = require(title);\n\t\t\t\n\t\t\ttiddlyclip.macro[func.name]=func.run;\n\t\t} catch (e) {\n\t\t\talert(\"tc: problem with command \" + title);\n\t\t} \n\t});\t\t\n\tthis.makeChildWidgets();\n};\n\nCreateTiddlerWidget.prototype.handleTiddlyclipEvent = function(event) {\n\n\ttiddlyclip.modules.tPaste.paste(event.category,event.pagedata,event.currentsection);\t\n\treturn false;\n};\n\t\t\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCreateTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\t//var changedAttributes = this.computeAttributes();\n\tif(false) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\nexports.createclip = CreateTiddlerWidget;\n\n})();\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar tcWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\ntcWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\ntcWidget.prototype.render = function(parent,nextSibling) {\n\tvar doc = document;\n\tvar self =this;\n\t{\n\t\t// Inject the message box\n\t\tvar messageBox = doc.getElementById(\"tiddlyclip-message-box\");\n\t\t//remove previously setup\n\t\tif(messageBox) messageBox.outerHTML = \"\";\n\n\t\tmessageBox = doc.createElement(\"div\");\n\t\tmessageBox.id = \"tiddlyclip-message-box\";\n\t\tmessageBox.style.display = \"none\";\n\t\tdoc.body.appendChild(messageBox);\n\n\t\t// Attach the event handler to the message box\n\t\tmessageBox.addEventListener(\"tiddlyclip-save-file\", onSaveFile,false);\n\t};\n\tfunction onSaveFile(event) {\n\t\t//tiddlyclip.log(\"savefile at last!\");\n\t\t// Get the details from the message\n\t\tvar message = event.target;\n\t    var category = message.getAttribute(\"data-tiddlyclip-category\");\n\t    var pageData = message.getAttribute(\"data-tiddlyclip-pageData\");\n\t    var transformed =  JSON.parse(pageData);\n\t    if (!transformed.data) alert(\"not data\");\n\t    var currentsection = message.getAttribute(\"data-tiddlyclip-currentsection\");\t\t\t\t\t\n\t\tself.dispatchEvent({type: \"tiddlyclip-create\", category:category, pagedata: transformed, currentsection:currentsection});\t\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\ntcWidget.prototype.execute = function() {\n\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\ntcWidget.prototype.refresh = function(changedTiddlers) {\n\n\t\treturn false;\t\t\n\n};\n\nexports[\"tcadapter\"] = tcWidget;\n\n})();\n",
            "title": "$:/plugins/bj/tiddlyclip/tcadapter.js",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/plugins/bj/tiddlyclip/template": {
            "title": "$:/plugins/bj/tiddlyclip/template",
            "tags": "$:/tags/PageTemplate",
            "text": "<$createclip>\n<$tcadapter>\n</$createclip>\n</$tcadapter>\n\n"
        },
        "$:/plugins/bj/tiddlyclip/convert.js": {
            "type": "application/javascript",
            "title": "$:/plugins/bj/tiddlyclip/convert.js",
            "tags": "$:/tags/tiddlyclip",
            "module-type": "library",
            "text": "exports.name =\"htmlToTW2\";\nexports.run  = function(text)\n\t{\n\n\n\t\n\tvar toTW  =(function() {\n\t  var ELEMENT = this.Node?Node.ELEMENT_NODE:1,\n\t\t\t TEXT = this.Node?Node.TEXT_NODE:   3,\n\t\t\t CDATA= this.Node?Node.CDATA_SECTION_NODE:4,\n\t\t   COMMENT= this.Node?Node.COMMENT_NODE:  8;\n\t\n\t\tvar Tname = {\n\t\t//need to add a flag the says only add a \\n if not preceeded by \\n\n\t\t\n\t\t// -- table --\n\t\ttable   :[handleTabBg,handleTabEnd,''],//todo add handle end to add footer '\n\t\tthead\t:[handleTheadBg, \"\",\"\"],\n\t\ttbody\t:[handleTbodyBg, \"\",\"\"],\n\t\ttfoot\t:[handleTfootBg, \"\",\"\"],\n\t\ttr\t\t:[trStart,trEnd,''],\n\t\ttd\t\t:[tdStart,tdEnd,''],\n\t\tth\t\t:[tdStart,tdEnd,'th'],\n\n\t\t// -- heading --\n\n\t\th1:[\"\\newline!\"\t\t\t,\"\\n\",\"\"],\n\t\th2:[\"\\newline!!\"\t\t,\"\\n\",\"\"],\n\t\th3:[\"\\newline!!!\"\t\t,\"\\n\",\"\"],\n\t\th4:[\"\\newline!!!!\"\t\t,\"\\n\",\"\"],\n\t\th5:[\"\\newline!!!!!\"\t\t,\"\\n\",\"\"],\n\t\th6:[\"\\newline!!!!!!\"\t,\"\\n\",\"\"],\n\t\t\n\t\t// -- list --\n\t\tul\t\t:[\"\"\t\t\t,\"\\newline\",\"ul\"],\n\t\tol\t\t:[\"\"\t\t\t,\"\\newline\",\"ol\"],\n\t\tdl\t\t:[\"\"\t\t\t,\"\\newline\",\"dl\"],\n\t\tli\t\t:[handleBullit\t,\"\",\"li\"],\n\t\tdt\t\t:[handleBullit\t,\"\",\"dt\"],\n\t\tdd\t\t:[handleBullit\t,\"\",\"dd\"],\n\t\t\n\t\t// -- quoteByBlock --\t\t\n\t\t// -- quoteByLine --\n\t\tblockquote:[handlebq, \"\\newline\",\"bq\"],\n\t\t\n\t\t// -- rule --\n\t\t// -- monospacedByLine --\n\t\t// -- wikifyComment --\t\n\t\t// -- macro --\n\t\t// -- prettyLink --\n\t\t// -- wikiLink --\n\t\t// -- urlLink --\n\t\ta\t\t:[\"[[\"\t\t\t,handleLink,\"\"], \n\t\t\n\t\t// -- image --\n\t\timg\t\t:[handleImg, '',''],\n\t\t\n\t\t// -- html --\n\t\t// -- commentByBlock --\n\t\t// -- characterFormat --\n\t\tb      :[ \"''\",  \"''\" ,\"\"],\n\t\tstrong :[ \"''\",  \"''\" ,\"\"],\n\t\ti      :[ \"//\",  \"//\" ,\"\"],\n\t\tem     :[ \"//\",  \"//\" ,\"\"],\n\t\tu      :[ \"__\",  \"__\",\"\"],\n\t\tsub    :[ \"~~\",  \"~~\",\"\"],\n\t\tsup    :[ \"^^\",  \"^^\",\"\"],\n\t\tstrike :[ \"--\",  \"--\",\"\"],\n\t\t\n\t\t// -- customFormat --\n\t\tspan:[handleSPAN\t\t,endDIV,\"\"],\t\n\t\tdiv:[handleDIV\t\t\t,endDIV,\"\"],\t\n\t\t// -- mdash --\n\t\thr:[\"<hr>\"\t,\"\",\"\"],\t\t\n\t\t// -- lineBreak --\n\n\t\tbr\t\t:[handleBreak,\t\"\",\"\"],\n\t\t\n\t\t// -- rawText --\n\t\t// -- htmlEntitiesEncoding --\n\n\t\tcode   :[ \"{{{\",  \"}}}\",\"\"],\n\t\ttt     :[ \"{{{\",  \"}}}\",\"\"],\n\t\tpre   :[ \"\\newline{{{\\n\",  \"\\newline}}}\\n\",\"\"]\n\n\t\t}\t\n\t\tvar MAXCOL=20;\n\t\tvar spanDwCounters = new Array(MAXCOL);\n\t\tvar colCount =0;\t\n\t\tvar intable=false;\n\t\tvar foot,tofoot,head,footer;\n\t\tvar divStackEmpty =[];\n\t\t\t\t\n\t  return function tw(el, outer, LOCALE,parentbullit) {\n\t\t\tvar i = 0, j = el.childNodes, k='', m, n,\n\t\t\t\tl = j.length;\n\t\t\tvar nodeFound=false, ind, bullit = [];\n\t\t\tif (!parentbullit) parentbullit = [];\n\t\t\tfor (ind = 0; ind < parentbullit.length;ind++) bullit.push(parentbullit[ind]);\n\t\t\t\n\t\t\tif (outer) \n\t\t\t{\n\t\t\t\tm = el.nodeName.toLowerCase();\n\t\t\t\t\n\t\t\t\tfor (var name in Tname) {\n\n\t\t\t\t\tif (name === m) {\n\t\t\t\t\t\tk = typeof Tname[name][0] == \"function\"?\n\t\t\t\t\t\t\t\tTname[name][0](el, outer, LOCALE,parentbullit):Tname[name][0];\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t//alert( \"m=\"+m+\" \"+k);\n\t\t\t\t\t\tbullit.push(Tname[name][2]);//pass on tag to child for bulit list\n\t\t\t\t\t\tnodeFound = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar temp='';\n\t\t\twhile(i !== l) switch((n = j[i++]).nodeType) {\n\n\t\t\t  case ELEMENT: temp +=tw(n, true, LOCALE,bullit); break;\n\t\t\t  case TEXT:    temp += doTrim(m,n.nodeValue); break;\n\t\t\t  case COMMENT: temp += \"/% \" +n.nodeValue +\" %/\";break;\n\t\t\t  \n\n\t\t\t} \n\t\t\tif (tofoot===true) footer += temp; else k += temp;\n\t\t\t\n\t\t\tvar kk='blank';\n\t\t\tif (!outer) return trimNl(k);\n\t\t\tfor (var name in Tname) {\n\t\t\t\tif (name === m) {\n\t\t\t\t\tkk = (typeof Tname[name][1] == \"function\"?\n\t\t\t\t\t\t\t\tTname[name][1](el, outer, LOCALE):Tname[name][1]);\n\t\t\t\t\t//return (k+Tname[name][1]);\n\t\t\t\t\t//alert ('kk '+kk);\n\t\t\t\t\treturn k+kk;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn k;\n\t\t}; \n\t\tfunction attr(el,LOCALE) {\n\t\t\tvar i = 0, j = el.attributes, k = new Array(l = j.length), l, nm,v;\n\t\t\twhile(i !== l) {\n\t\t\t\tnm = j[i].nodeName ;\n\t\t\t\tv = j[i].value;\n\t\t\t\tk[i]='';\n\t\t\t\t//check to see if src is local, add path if it is \n\t\t\t\tif ((nm==='src')||(nm==='href')){\n\t\t\t\t\tvar pathStart = v.substring(0,4);\n\t\t\t\t\t\n\t\t\t\t\tif ((pathStart==='file') ||(pathStart === 'http'))\n\t\t\t\t\t\tk[i] +=nm + '=\"'+ v + '\"'; \n\t\t\t\t\telse {\n\t\t\t\t\t\tif (nm==='src') {\n\t\t\t\t\t\t\tif (!!LOCALE) {\n\t\t\t\t\t\t\t\tvar locale = LOCALE.split('//');\n\t\t\t\t\t\t\t\tlocale = locale[0]+'//'+locale[1].split('/')[0];\n\t\t\t\t\t\t\t\tk[i] +=nm +  '=\"'+ locale+v + '\"';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse k[i] +=nm +  '=\"'+v + '\"';\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tk[i] +=nm +  '=\"'+ LOCALE+v + '\"';\t\n\t\t\t\t\t}\n\t\t\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tk[i] +=nm + '=\"'+ v +'\"';\n\t\t\t\t//alert(nm+\" =\"+v);\n\t\t\t\ti++;\n\t\t\t}\n\t\t\treturn (l?\" \":\"\") + k.join(\" \");\n\t  }\n\t\t  \n\t\tfunction handleSPAN(el, outer, LOCALE,parentbullit,bullitstack) {\n\t\t\tvar k = '{{\"', style = '';\n\t\t\tvar attrlist = attr(el,LOCALE);\n\t\t\tvar empty = true;\n\t\t\tfor (var i= 0;i< attrlist.length;i++) { \n\t\t\t\titem = attrlist[i].split(':');\n\n\t\t\t\tif (item[0] ==='style'){\n\t\t\t\t\tk +=attrlist[i].substring(6,attrlist[i].length-1).replace(/\"/g,\"'\")+\";\";\n\t\t\t\t   empty = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdivStackEmpty.push(empty);\n\t\t\tif (empty === true) return '';\n\t\t\treturn k+'\"{\\newline';\n\t\t}\n\n\t\tfunction handleDIV(el, outer, LOCALE,parentbullit,bullitstack) {\n\t\t\tvar k = '{{\"', align = 'left',style = '';\n\t\t\tvar attrlist = attr(el,LOCALE);\n\t\t\tvar empty = true;\n\t\t\tfor (var i= 0;i< attrlist.length;i++) { \n\t\t\t\titem = attrlist[i].split(':');\n\t\t\t\tif (item[0] ==='align'){ \n\t\t\t\t\tk +='align:'+item[1]+\";\";\n\t\t\t\t\tempty = false;\n\t\t\t\t}\n\t\t\t\telse if (item[0] ==='style') {\n\t\t\t\t\tk +=attrlist[i].substring(6,attrlist[i].length-1).replace(/\"/g,\"'\")+\";\";\n\t\t\t\t\tempty = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdivStackEmpty.push(empty);\n\t\t\tif (empty === true) return '';\n\t\t\treturn k+'\"{\\newline';\n\t\t}\n\t\tfunction endDIV() {\n\t\t\tif (divStackEmpty.pop() === true) return \"\";\n\t\t\treturn '}}}';\n\t\t}\t\n\t\tfunction doTrim(name, content) {\n\t\t\tvar whiteSpace = /^\\s+|\\s+$/g;\n\t\t\tif (name!=='pre') return content.replace(whiteSpace, ' ');\n\t\t\treturn content;\n\t\t}\n\t   function trimNl(k)\n\t   {\n\t\t   return k.replace (/(\\newline)+/g,\"\\newline\").replace (/\\n\\newline/g,\"\\n\").\n\t\t\t\t\treplace(/\\newline/g,\"\\n\").          replace(/\\n.*?\\trim\\|/g,\"\\n|\").\n\t\t\t\t\treplace(/\\|([h,f])\\trim.*?\\n/g,\"|$1\\n\").     replace(/\\trim/g,\"\");//replace(/\\trim/g,\"\\n\");tiddler\tfunction\n\t\t  }\n\t\tfunction trimNewLines(k,term) { \n\t\t\tif ((term.length >6) &&(term.substring(0,7) === '\\newline')) {\n\t\t\t\ttt = term.substring(7,term.length);\n\t\t\t\tif ((k.length > 1) &&(k.substring(k.length-1,k.length)==='\\n')) return k + tt;\n\t\t\t\telse return (k + '\\n' + tt);\n\t\t\t}\n\t\t\treturn k + term;\n\t\t}\n\t\t\n\t\tfunction handleBreak (el, outer, LOCALE,parentbullit,bullitstack) \t{\n\t\t\tif (intable === true) return '<<br>>';\n\t\t\treturn \"\\n\";\n\t\t}\n\t\t\n\t\tfunction handleBullit(el, outer, LOCALE,parentbullit,bullitstack) {\n\t\t\tvar bullit;// = parentbullit[parentbullit.length-1];\n\t\t\tfor (var i =0 ; i < parentbullit.length; i++) {\n\t\t\t\tbullit = parentbullit[parentbullit.length-1-i];\n\t\t\t\tif ((bullit === 'dl')||(bullit === 'ul')||(bullit === 'ol')) break;\n\t\t\t}\n\t\t\t//if (i === parentbullit.length) alert (\"error\");\n\n\t\t\tif ((this[2] ==='dt')&&(bullit === 'dl')){ return '\\newline'+handleBullitList(parentbullit)+';';}\n\t\t\tif (bullit === 'ul') { return '\\newline'+handleBullitList(parentbullit,parentbullit.length-1-i) +'*';}\n\t\t\tif (bullit === 'ol') { return '\\newline'+handleBullitList(parentbullit,parentbullit.length-1-i)+'#';}\n\t\t\tif (bullit === 'dl') { return '\\newline'+handleBullitList(parentbullit,parentbullit.length-1-i)+':';}\n\t\t\treturn '';\n\t\t}\n\n\n\t\tfunction handleBullitList(parentbullit,end) {\n\t\t\tif (parentbullit.length < 1) return;\n\t\t\t\n\t\t\tvar bullitInner = parentbullit[end-1];\n\t\t\tfor (var i =end-1 ; i>-1; i--) {\n\t\t\t\tbullitInner = parentbullit[i];\n\t\t\t\tif ((bullitInner === 'dt')||(bullitInner === 'li')||(bullitInner === 'dd')) break;\n\t\t\t}\n\t\t\tif (i === end) { alert (\"error\"); return;}\n\t\t\tend = i;\n\t\t\tvar bullitOuter = parentbullit[end-1];\n\t\t\tfor (var i =end-1 ; i>-1; i--) {\n\t\t\t\tbullitOuter = parentbullit[i];\n\t\t\t\tif ((bullitOuter === 'dl')||(bullitOuter === 'ul')||(bullitOuter === 'ol')) break;\n\t\t\t}\n\t\t\tif (i === end) { alert (\"error\"); return;}\n\t\t\t//parentbullit=parentbullit.substring(0,parentbullit.length-4);\n\t\t\t\n\t\t\tif ((bullitInner ==='dt')&&(bullitOuter === 'dl')){ return handleBullitList(parentbullit,i)+';';}\n\t\t\tif (bullitOuter === 'ul') { return handleBullitList(parentbullit,i)+'*';}\n\t\t\tif (bullitOuter === 'ol') { return handleBullitList(parentbullit,i)+'#';}\n\t\t\tif (bullitOuter === 'dl') { return handleBullitList(parentbullit,i)+':';}\n\t\t\treturn '';\n\t\t}\n\t\tfunction handleLink (el, outer, LOCALE) {\n\t\t\treturn  '|' +el.getAttribute(\"href\") +']]';\n\t\t}\n\t\tfunction handlebq (el, outer, LOCALE,parentbullit,bullitstack)\t{\n\t\t\tvar bullit;// = parentbullit[parentbullit.length-1];\n\t\t\tvar outline = '\\newline>';\n\t\t\tfor (var i =parentbullit.length-1 ; i >-1; i--) {\n\t\t\t\tbullit = parentbullit[i];\n\t\t\t\tif (bullit === 'bq') outline += '>';\n\t\t\t}\n\n\t\t\treturn outline;\n\t\t}\n\n\n\t\tfunction handleTabBg (el, outer, LOCALE,parentbullit,bullitstack) {\n\t\t\tfor (var i = 0; i < MAXCOL; i++) spanDwCounters[i]=0;\n\t\t\tfoot = false;\n\t\t\ttofoot = false;\n\t\t\thead = false;\n\t\t\tfooter = '';\n\t\t\treturn '';\n\t\t}\n\t\tfunction handleTheadBg() {\n\t\t\thead = true; //flag to put header char on each of row\n\t\t\treturn '';\n\t\t}\n\t\tfunction handleTbodyBg() {\n\t\t\ttofoot=false;\n\t\t\thead = false;\n\t\t\treturn '';\n\t\t}\n\t\tfunction handleTfootBg() {\n\t\t\tfoot = true; //flag to put foot char on each of row\n\t\t\ttofoot =true;//when footer html is before body save to temp area then append\n\t\t\treturn '';\n\t\t}\n\t\tfunction handleTabEnd(){\n\t\t\tif (foot===true)\n\t\t\treturn footer + \"f\\newline\"; //move footer to end of table\n\t\t\telse return '\\newline';\n\t\t\treturn '';\n\t\t}\n\t\tfunction trStart (el, outer, LOCALE,parentbullit,bullitstack) {\n\t\t\tcolCount =0;\n\t\t\tif (tofoot===true) footer+='\\newline'; else  return '\\newline';\n\t\t\treturn '';\n\t\t}\n\t\tfunction trEnd (){\n\t\t    if (tofoot===true) { footer+='|f\\trim';return '';}\n\t\t    if (head===true) return  '|h\\trim';\n\t\t    return '|\\trim';\n\t\t}\n\t\tfunction tdStart (el, outer, LOCALE,parentbullit,bullitstack) {\n\t\t\tvar k ='|';\n\t\t\tintable = true; //<br> are converted to <<br>> not newline due to tw formatting\n\t\t\tif (colCount === 0) k='\\trim|';\n\t\t\tif \t(spanDwCounters[colCount] >1) {\n\t\t\t\tk +='~|';\n\t\t\t\tspanDwCounters[colCount]--;\n\t\t\t} else\n\t\t\t\tif (this[2]==='th') k +='!';\n\t\t\tvar rowspan =  parseInt( el.getAttribute('rowspan'))|| 1;\n\t\t\tspanDwCounters[colCount]= rowspan;\n\t\t\t\n\t\t\tvar colspan =  parseInt(el.getAttribute('colspan') )|| 1;\n\t\t\t//alert(\"colspan \"+colspan);\n\t\t\tfor (var i = 0; i<colspan-1; i++) k+='>|';\n\t\t\t\n\t\t\tvar align = el.getAttribute('align') || 'none';\n\t\t\tvar style = el.getAttribute('style') || '';\n\t\t\tif (style === 'text-align: center;') align = 'center';\n\t\t\tif (style ==='text-align: right;')   align = 'right' ;\n\t\t\tif ((align ==='center')||(align ==='right')) k+=' ';\n\t\t\tif (tofoot===true)footer+=k; else return k;\n\t\t\treturn '';\n\t\t}\n\t\t\n\t\tfunction tdEnd (el, outer, LOCALE,parentbullit,bullitstack) {\n\t\t\tcolCount +=1;\n\t\t\tintable = false;\n\t\t\tvar align =  el.getAttribute('align') || 'none';\n\t\t\tvar style = el.getAttribute('style') || '';\n\t\t\tif (style === 'text-align: center;') align = 'center';\n\t\t\tif (style ==='text-align: left;')   align = 'left' ;\n\n\t\t\tif (align ==='center') if (tofoot===true)footer+=' ';else return ' ';\t\n\t\t\tif (align ==='left') if (tofoot===true)footer+=' '; else return ' ';\n\t\t\tif (tofoot===true)footer+='';else return '';\n\t\t\treturn '';\n\t\t\t//if (tofoot===true) alert (footer);\n\t\t}\n\n\t\tfunction handleImg(el, outer, LOCALE,parentbullit,bullitstack) {\n\t\t\tvar img = el.getAttribute('src');\n\t\t\tif (!img) return '';\n\n\t\t\tvar pathStart = img.substring(0,4);\n\n\t\t\tif ((pathStart!=='file') && (pathStart !== 'http'))\n\t\t\t{\n\t\t\t\tvar locale = LOCALE.split('//');\n\t\t\t\tlocale = locale[0]+'//'+locale[1].split('/')[0];\n\t\t\t\timg= locale+img;\t\n\t\t\t}\t\n\t\t\tvar alt = el.getAttribute('alt');\n\t\t\tvar align = el.getAttribute('align');\n\t\t\tvar title = el.getAttribute('title');\n\n\t\t\tvar ret = \"[\";\n\t\t\tif (align === 'left') ret += \"<\" ;\n\t\t\tif (align === 'right') ret += \">\" ;\n\t\t\tret += \"img[\";\n\t\t\tif (title) ret += \"$title|\" \n\t\t\tret += (img+\"]]\");\n\t\t\treturn ret;\n\t\t}\n\t})(); \n\t\tvar content = \"<html><body>\" + text + \"</body></html>\";\n\t\t// Create the iframe\n\t\tvar iframe = document.createElement(\"iframe\");\n\t\tiframe.style.display = \"none\";\n\t\tdocument.body.appendChild(iframe);\n\t\tvar doc = iframe.document;\n\t\tif(iframe.contentDocument)\n\t\t\tdoc = iframe.contentDocument; \n\t\telse if(iframe.contentWindow)\n\t\t\tdoc = iframe.contentWindow.document; \n\t\t// Put the content in the iframe\n\t\tdoc.open();\n\t\tdoc.writeln(content);\n\t\tdoc.close();\n\t\t// convert to tiddlytext\n\t\tvar twcontent = toTW(doc.body);\n\t\tiframe.parentNode.removeChild(iframe);\n\t\treturn twcontent;\n}\n///end convert///\n"
        },
        "$:/plugins/bj/tiddlyclip/sublink.js": {
            "type": "application/javascript",
            "title": "$:/plugins/bj/tiddlyclip/sublink.js",
            "tags": "$:/tags/tiddlyclip",
            "module-type": "library",
            "text": "exports.name =\"sublink\";\nexports.run  = function(link,global) {\n\tvar here = (this.document.location.toString().split(\"#\")[0]).replace(/(.*)\\/.*?$/,\"$1\");\n\tvar  pos = -1;\n\tpos = link.indexOf(here);\n\tif (!global && pos === 0) return \"./\" + link.substr(here.length+1);\n\treturn link;\n}\n\n"
        },
        "$:/plugins/bj/tiddlyclip/multitid.js": {
            "type": "application/javascript",
            "title": "$:/plugins/bj/tiddlyclip/multitid.js",
            "tags": "$:/tags/tiddlyclip",
            "module-type": "library",
            "text": "exports.name =\"tomultid\";\nexports.run  = function(IMPORT_TITLE,tiddler)\n\t{\n\n\tvar tiddlers = [tiddler];\n\n\t// Get the current $:/Import tiddler\n\tvar importTiddler = $tw.wiki.getTiddler(IMPORT_TITLE),\n\t\timportData = $tw.wiki.getTiddlerData(IMPORT_TITLE,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: IMPORT_TITLE,\n\t\t\ttype: \"application/json\",\n\t\t\t\"multitid-type\": \"vault\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\t$tw.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\n\treturn \"saved\";\n};\n\n\n"
        }
    }
}
{
    "tiddlers": {
        "$:/plugins/bj/typestemplate/callEditPicker": {
            "title": "$:/plugins/bj/typestemplate/callEditPicker",
            "text": "<<editTemplatePicker>>\n\n"
        },
        "$:/plugins/bj/typestemplate/callViewPicker": {
            "title": "$:/plugins/bj/typestemplate/callViewPicker",
            "text": "<<viewTemplatePicker>>\n\n"
        },
        "$:/plugins/bj/typestemplate/editTemplatePicker.js": {
            "text": "/*\\\ntitle: $:/plugins/bj/typestemplate/editTemplatePicker.js\ntype: application/javascript\nmodule-type: macro\n\n\n\\*/\n\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n\n*/\n\nexports.name = \"editTemplatePicker\";\n\nexports.params = [\n\n];\n/*\nRun the macro\n*/\n// Mappings from content type to edit templates type are stored in tiddlers with this prefix\nvar EDIT_TEMPLATE_MAPPING_PREFIX = \"$:/config/EditTemplateTypeMappings/\";\n\nexports.run = function() {\n\t\nvar cur = this.getVariable(\"currentTiddler\"), template, \n\ttiddler = this.wiki.getTiddler(cur);\n\t\n\ttiddler && tiddler.fields && tiddler.fields.type? \n\t\t\ttemplate =  $tw.wiki.getTiddlerText(EDIT_TEMPLATE_MAPPING_PREFIX +tiddler.fields.type) : template = null;\n\tif (!template)\n\t\treturn  $tw.wiki.getTiddlerText(\"$:/core/ui/EditTemplate\");\t\n\ttemplate = template.trim();\nreturn  $tw.wiki.getTiddlerText(template)||$tw.wiki.getTiddlerText(\"$:/core/ui/EditTemplate\");\n}\n\n})();\n",
            "title": "$:/plugins/bj/typestemplate/editTemplatePicker.js",
            "type": "application/javascript",
            "module-type": "macro"
        },
        "$:/plugins/bj/typestemplate/license": {
            "title": "$:/plugins/bj/typestemplate/license",
            "text": "The MIT License (MIT)\n\nCopyright (c) 2015 Jeffrey Wikinson aka buggyj\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
        },
        "$:/plugins/bj/typestemplate/readme": {
            "title": "$:/plugins/bj/typestemplate/readme",
            "text": ""
        },
        "$:/core/ui/PageTemplate/story": {
            "title": "$:/core/ui/PageTemplate/story",
            "tags": "$:/tags/PageTemplate",
            "text": "<section class=\"tc-story-river\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template=\"$:/plugins/bj/typestemplate/callViewPicker\" editTemplate=\"$:/plugins/bj/typestemplate/callEditPicker\" storyview={{$:/view}} />\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n"
        },
        "$:/plugins/bj/typestemplate/viewTemplatePicker.js": {
            "text": "/*\\\ntitle: $:/plugins/bj/typestemplate/viewTemplatePicker.js\ntype: application/javascript\nmodule-type: macro\n\n\n\\*/\n\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n\n*/\n\nexports.name = \"viewTemplatePicker\";\n\nexports.params = [\n\n];\n/*\nRun the macro\n*/\n// Mappings from content type to edit templates type are stored in tiddlers with this prefix\nvar VIEW_TEMPLATE_MAPPING_PREFIX = \"$:/config/ViewTemplateTypeMappings/\";\n\nexports.run = function() {\n\t\nvar cur = this.getVariable(\"currentTiddler\"), template = null, \n\ttiddler = this.wiki.getTiddler(cur);\n\t\n\ttiddler && tiddler.fields && tiddler.fields.type? \n\t\t\ttemplate =  $tw.wiki.getTiddlerText(VIEW_TEMPLATE_MAPPING_PREFIX +tiddler.fields.type) : template = null;\n\tif (!template)\n\t\treturn  $tw.wiki.getTiddlerText(\"$:/core/ui/ViewTemplate\");\n\ttemplate = template.trim();\nreturn  $tw.wiki.getTiddlerText(template)||$tw.wiki.getTiddlerText(\"$:/core/ui/ViewTemplate\");\n}\n\n})();\n",
            "title": "$:/plugins/bj/typestemplate/viewTemplatePicker.js",
            "type": "application/javascript",
            "module-type": "macro"
        }
    }
}
{
    "tiddlers": {
        "$:/bj/modules/widgets/edit.js": {
            "text": "/*\\\ntitle: $:/bj/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\\*/\n\nif($tw.browser )   {\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ready = false;\n\nvar MIN_TEXT_AREA_HEIGHT = 100; // Minimum height of textareas in pixels\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditHtmlWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\nvar PLUSMODE = (typeof $tw.wiki.getTiddler(\"$:/language/Docs/Types/text/x-perimental\")!='undefined');\n\n/*\nInherit from the base widget class\n*/\nEditHtmlWidget.prototype = new Widget();\n\nEditHtmlWidget.prototype.postRender = function() {\n\tvar self = this,\n\t\tcm;\n\tvar toWiki = function(text) {\n\t\t//if($tw.browser) alert(\"in towiki \"+text)\n\n\t\t//BJ FIXME - in theory the attribs can be in any order, so this may fail as it is\n\t\tvar newtext = \"\";\n\n\t\t newtext = text.replace(/^<p><span class=\\\"verbatim\\\".*?>([^<]*)<\\/span><\\/p>/,\n\t\tfunction(m,key,offset,str){\n                if (key.indexOf('<') != -1) {// we have caputure some formatting - !abort\n\t\t\t\t\treturn m;\n\t\t\t\t}\n\t\t\t\treturn $tw.utils.htmlDecode(key) + \"\\n<!-- verbatim -->\";\n\n\t\t});\n\t\tnewtext =\n\t\tnewtext.replace(/<p><span class=\\\"verbatim\\\".*?>([^<]*)<\\/span><\\/p>/g,\n\t\tfunction(m,key,offset,str){\n                if (key.indexOf('<') != -1) {// we have caputure some formatting - !abort\n\t\t\t\t\treturn m;\n\t\t\t\t}\n\t\t\t\treturn \"\\n<!-- nl verb -->\"+$tw.utils.htmlDecode(key)+\"<!-- atim -->\";\n\n\t\t\t\n\t\t});\n\t\tnewtext = newtext.replace(/<span class=\\\"verbatim\\\".*?>([^<]*)<\\/span>/g,\n\t\t\tfunction(m,key,offset,str){\n\t\t\t\tif (key.indexOf('<')!=-1) {// we have caputure some formatting - !abort\n\t\t\t\t\treturn m;\n\t\t\t\t}\n\t\t\t\treturn \"<!-- verb -->\"+$tw.utils.htmlDecode(key)+\"<!-- atim -->\";\n\t\t\t});\n\t\treturn newtext;\n\t}\n\n\tif($tw.browser && window.CKEDITOR && this.editTag === \"textarea\") {\n\t\t\n\t\tvar ck =\"editor\"+ Math.random();\n\t\tthis.domNodes[0].firstChild.setAttribute(\"name\",ck);\n\t\tthis.domNodes[0].firstChild.setAttribute(\"id\",ck);\n\t\tvar config;\n\t\ttry {\n\t\t    config = $tw.wiki.getTiddlerData(\"$:/plugins/bj/visualeditor/config.json\");\n\t\t} catch(e) {\n\t\t\talert(\"invalid config format\");\n\t\t\tconfig = [];\n\t\t}\n\t\tCKEDITOR.replace(ck, config);//,\n\n\t\tCKEDITOR.instances[ck].on('change', \n\t\t\tfunction() { \n\t\t\t\tif (PLUSMODE && self.edittype == 'text/x-perimental') {\n\t\t\t\t\tself.saveChanges(toWiki(CKEDITOR.instances[ck].getData()));\n\t\t\t\t} else {\n\t\t\t\t\tself.saveChanges(CKEDITOR.instances[ck].getData());\n\t\t\t\t} \n\t\t\t}\n\t\t);\n\t} \n};\n\nEditHtmlWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tvar fromWiki = function(text) {\n\t\tvar preAmble = '<span class=\"verbatim\">';\n\t\tvar index=1;\n\t\t//seperate the /define .../end section\n\t\ttext = text.split(\"<\\!-- verbatim -->\");\n\t\tif (text.length == 1) //no preamble defined\n\t\t\tindex = 0;\n\t\telse\n\t\t\ttext[0] = preAmble+$tw.utils.htmlEncode(text[0]) + '</span>'\n\t\ttext[index] = text[index].replace(/^<\\!-- nl verb -->([\\s\\S]*?)<\\!-- atim -->/mg,\n\t\tfunction(m,key,offset,str){//alert(key);\n\t\t\treturn '<p>' + preAmble+$tw.utils.htmlEncode(key)+'</span>'+'</p>';\n\t\t});//alert (\"newtext \"+text[index]);\n\t\ttext[index] = text[index].replace(/<\\!-- verb -->([\\s\\S]*?)<\\!-- atim -->/g,\n\t\tfunction(m,key,offset,str){//alert(key);\n\t\t\treturn preAmble+$tw.utils.htmlEncode(key)+'</span>';\n\t\t});\n\t\t//alert (\"newtext \"+text.join(\"\"));\n\t\treturn text.join(\"\");\n\t}\n\t// Create our element\n\tvar outerDomNode = this.document.createElement('div');\n\t\touterDomNode.className = \"tw-ckeditor-instance\";\n\tvar domNode = this.document.createElement(this.editTag);\n\n\tif(this.editPlaceholder) {\n\t\tdomNode.setAttribute(\"placeholder\",this.editPlaceholder);\n\t}\n\t// Assign classes\n\tif(this.editClass) {\n\t\tdomNode.className = this.editClass;\n\t}\n\t// Set the text\n\tvar editInfo = this.getEditInfo();\n\tif(this.editTag === \"textarea\") {\n\t\tif (PLUSMODE && this.edittype == 'text/x-perimental') {\n\t\t\tdomNode.appendChild(this.document.createTextNode(fromWiki(editInfo.value)));\n\t\t} else  {\n\t\t\tdomNode.appendChild(this.document.createTextNode(editInfo.value));\n\t\t} \n\t} else {\n\t\talert(\"visual editor only works with textarea\")\n\t}\n    outerDomNode.appendChild(domNode);\n\t// Insert the element into the DOM\n\tparent.insertBefore(outerDomNode,nextSibling);\n\tthis.domNodes.push(outerDomNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nGet the tiddler being edited and current value\n*/\nEditHtmlWidget.prototype.getEditInfo = function() {\n\t// Get the edit value\n\tvar self = this,\n\t\tvalue,\n\t\tupdate;\n\tif(this.editIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\tupdate = function(value) {\n\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t}\n\t\t};\n\t} else {\n\t\t// Get the current tiddler and the field name\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t} else {\n\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\tswitch(this.editField) {\n\t\t\t\tcase \"text\":\n\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"title\":\n\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tvalue = \"\";\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (this.editDefault !== undefined) {\n\t\t\t\tvalue = this.editDefault;\n\t\t\t}\n\t\t}\n\t\tupdate = function(value) {\n\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\tupdateFields = {\n\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t};\n\t\t\tupdateFields[self.editField] = value;\n\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t};\n\t}\n\treturn {value: value, update: update};\n};\n\nEditHtmlWidget.prototype.getAttribute = function () {\n\t//parameters are passed to parent so get them from there\n\treturn this.parentWidget.getAttribute.apply(this.parentWidget, arguments);\n}\n \nEditHtmlWidget.prototype.execute = function() {\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editDefault = this.getAttribute(\"default\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\tthis.onkeyupdate = this.getAttribute(\"onkeyupdate\",\"yes\"); \n\t// Get the content type of the thing we're editing\n\tthis.edittype = \"\";\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\tthis.edittype = tiddler.fields.type;\n\t\t}\n\t}\n\t// only textarea can be visually edited\n\tthis.editTag = \"textarea\"\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditHtmlWidget.prototype.refresh = function(changedTiddlers) {\n// attribute changes are caught by parent widget\n\tif(changedTiddlers[this.editTitle]) {\n\t\t//this.refreshSelf(); BJ maybe we don't like to have our edits pulled - this could be an option\n\t\t//return true;\n\t}\n\treturn false;\n};\n\n/*\nUpdate the editor with new text. This method is separate from updateEditorDomNode()\nso that subclasses can override updateEditor() and still use updateEditorDomNode()\n*/\nEditHtmlWidget.prototype.updateEditor = function(text) {\n\tthis.updateEditorDomNode(text);\n};\n\n/*\nUpdate the editor dom node with new text\n*/\nEditHtmlWidget.prototype.updateEditorDomNode = function(text) {\n\t// Replace the edit value if the tiddler we're editing has changed\n\tvar domNode = this.domNodes[0].firstChild;\n\tif(!domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.document.activeElement !== domNode) {\n\t\t\tdomNode.value = text;\n\t\t}\n\t\t// Fix the height if needed\n\t\t//this.fixHeight();\n\t}\n};\n\n/*\nHandle a dom \"input\" event\n*/\nEditHtmlWidget.prototype.handleInputEvent = function(event) {\n\tthis.saveChanges(this.domNodes[0].firstChild.value);\n\t//this.fixHeight();\n\treturn true;\n};\n\nEditHtmlWidget.prototype.handleFocusEvent = function(event) {\n\tif(this.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0].firstChild,\n\t\t\ttitle: this.editFocusPopup,\n\t\t\twiki: this.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\nEditHtmlWidget.prototype.saveChanges = function(text) {\n\tvar editInfo = this.getEditInfo();\n\tif(text !== editInfo.value) {\n\t\teditInfo.update(text);\n\t}\n};\n\n$tw.utils.registerFileType(\"text/x-perimental\",\"utf8\",\".perimental\");\nexports[\"__!ckebase__\"] = EditHtmlWidget;//choose an unparseable name to make widget 'private'\n\n//-------------- base initialisation - ----------------\n\nvar startup =  function () { //do after lib is loaded\n\tif (typeof CKEDITOR != 'undefined')   {\n\t\tvar PLUSMODE  = (typeof $tw.wiki.getTiddler(\"$:/language/Docs/Types/text/x-perimental\")!='undefined');\n\n\t\tvar sty;\n\t\ttry {\n\t\t sty=$tw.wiki.getTiddlerData(\"$:/plugins/bj/visualeditor/styles.json\");\n\t\t} catch(e){ \n\t\t\talert(\"invalid style format\");\n\t\t\tsty=[];\n\t\t}\n\t\tif (PLUSMODE) sty.push({ \"name\": \"verbatim\",\"element\": \"span\",\"attributes\": {\"class\": \"verbatim\"}});\n\n\t\tCKEDITOR.stylesSet.add( 'default',sty);\n\t\tif (PLUSMODE) CKEDITOR.addCss($tw.wiki.getTiddlerData(\"$:/plugins/bj/visualeditor/verbatim.json\").verbatim);\n\t\tCKEDITOR.on( 'instanceReady', function( ev ) {\n\t\t\tvar blockTags = ['div','h1','h2','h3','h4','h5','h6','p','pre','li','blockquote','ul','ol',\n\t\t\t\t\t\t\t'table','thead','tbody','tfoot','td','th',];\n\t\t\tvar rules = {\n\t\t\t\tindent : false,\n\t\t\t\tbreakBeforeOpen : true,\n\t\t\t\tbreakAfterOpen : false,\n\t\t\t\tbreakBeforeClose : false,\n\t\t\t\tbreakAfterClose : false\n\t\t\t};\n\n\t\t\tfor (var i=0; i<blockTags.length; i++) {\n\t\t\t\tev.editor.dataProcessor.writer.setRules( blockTags[i], rules );\n\t\t\t}\n\t\t});\n\n\t\t//BJ hide tw5 tags and macros from ckeditor\n\t\tCKEDITOR.config.protectedSource.push(/<\\/?\\$[^<]*\\/?>/g);\n\t\tCKEDITOR.config.protectedSource.push(/<<[^<]*>>/g);\n\t\t//CKEDITOR. config.protectedSource.push(/<\\?[\\s\\S]*?\\?>/g); // PHP Code\n\t\tCKEDITOR.config.protectedSource.push(/<code>[\\s\\S]*?<\\/code>/gi); // Code tags\n\t\tCKEDITOR.config.entities = false;\n\t}\n\n\tvar atiddler = $tw.wiki.getTiddler(\"$:/config/EditorTypeMappings/text/html\");\n\tif (atiddler == undefined) {\n\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),\n\t\t\t\t{title:\"$:/config/EditorTypeMappings/text/html\", text:\"html\"}));\n\t}\n\tatiddler = $tw.wiki.getTiddler(\"$:/config/EditorTypeMappings/text/x-perimental\");\n\tif (atiddler == undefined) {\t\n\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),\n\t\t\t\t\t{title:\"$:/config/EditorTypeMappings/text/x-perimental\", text:\"x-perimental\"}));\n\t}\n}\n\n//require(\"$:/plugins/bj/visualeditor/ckeditor.js\"); BJ -option to build in the lib?\n/*\ncreate lib loader \n*/\nif($tw.browser)  {\n\tvar head = document.getElementsByTagName('head')[0];\n\tvar js = document.createElement(\"script\");\n\tjs.type = \"text/javascript\";\n\tjs.onload = function() {  \n\t\t//do non-tree initialisation\n\t\tstartup();\n\t\tready = true;//BJ do this in startup\n\t\t//broadcast ready message\n\t\t$tw.wiki.setTextReference(\"$:/temp/ckeready\",\"ready\");\n\t}\n\tif (window.location.hostname == \"bjtools.tiddlyspot.com\") {\n\t\tjs.src = $tw.wiki.getTiddlerText(\"$:/plugin/bj/visualeditor/bjtools/lib\")||\"\";\n\t}\n\telse {\n\t\tvar tiddler = $tw.wiki.getTiddler(\"$:/plugin/bj/visualeditor/includelib\")||{fields:{}};\n\t\tvar src = (tiddler.fields.text)||\"\";\n\t\tjs.src = src.replace(/.*?<script.*?src=[\"'](.*?)[\"'][\\s\\S]*/,\"$1\");\n\t\tif (tiddler.fields.tags) {\n\t\t\tvar pos = tiddler.fields.tags.indexOf(\"$:/core/wiki/rawmarkup\");\n\t\t\tif(pos !== -1) {\n\t\t\t\talert(\"Please remove the tag $:/core/wiki/rawmarkup from tiddler $:/plugin/bj/visualeditor/includelib\")\n\t\t\t}\n\t\t}\n\t}\n\thead.appendChild(js);\n} \n//----------------base initialisation finished-----------------------------\n\nvar LoadWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n \nLoadWidget.prototype = new Widget();\n\n\n\nLoadWidget.prototype.getLoadingMessage = function() {\n\tvar message = \"<h2>loading ckeditor\",\n\t\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",message,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n \nLoadWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n\nLoadWidget.prototype.execute = function() {\n\n\tif (ready) {\n\t\t// insert the real widget\n\t\tthis.makeChildWidgets([{type: \"__!ckebase__\"}]);\n\t}\n\telse this.makeChildWidgets(this.getLoadingMessage());\n};\n\nLoadWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the 'lib is loaded' is indicated\n\t\tif(Object.keys(changedAttributes).length || changedTiddlers[\"$:/temp/ckeready\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nLoadWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tthis.invokeActions(this,event);\n\treturn true; // Action was invoked\n};\n\nexports[\"edit-html\"] = LoadWidget;\nexports[\"edit-x-perimental\"] = LoadWidget;\n})();\n}\n",
            "title": "$:/bj/modules/widgets/edit.js",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/plugins/bj/visualeditor/styles.json": {
            "type": "application/json",
            "title": "$:/plugins/bj/visualeditor/styles.json",
            "module-type": "library",
            "text": "[\n\t{ \"name\": \"Blue Title\",     \"element\": \"h3\",      \"styles\": { \"color\": \"Blue\" } },\n\t{ \"name\": \"Red Title\",      \"element\": \"h3\",      \"styles\": { \"color\": \"Red\" } },\n\t{ \"name\": \"Marker: Yellow\",\t\"element\": \"span\",    \"styles\": { \"background-color\": \"Yellow\"} },\n\t{ \"name\": \"Marker: Red\",\t\"element\": \"span\",    \"styles\": { \"background-color\": \"Red\"} },\n\t{ \"name\": \"Marker: Green\",\t\"element\": \"span\",    \"styles\": { \"background-color\": \"Lime\" } }\n]\n\n"
        },
        "$:/plugins/bj/visualeditor/config.json": {
            "type": "application/json",
            "title": "$:/plugins/bj/visualeditor/config.json",
            "module-type": "library",
            "text": "{\n\"removePlugins\":\"smiley,wsc,scayt,forms,save,preview,print\",\n\"customConfig\":\"\",\n\"language\" : \"en\",\n\"defaultLanguage\" : \"en\",\n\"contentsCss\" : \"\",\n\"disableNativeSpellChecker\" : false,\n\"resize_enabled\" : true,\n\"toolbarGroups\":[{ \"name\": \"clipboard\", \"groups\": [ \"clipboard\", \"undo\" ] },\n\t\t{ \"name\": \"editing\", \"groups\": [ \"find\", \"selection\", \"spellchecker\", \"editing\" ] },\n\t\t{ \"name\": \"links\", \"groups\": [ \"links\" ] },\n\t\t{ \"name\": \"insert\", \"groups\": [ \"insert\" ] },\n\t\t{ \"name\": \"forms\", \"groups\": [ \"forms\" ] },\n\t\t{ \"name\": \"tools\", \"groups\": [ \"tools\" ] },\n\t\t{ \"name\": \"document\", \"groups\": [ \"mode\", \"document\", \"doctools\" ] },\n\t\t{ \"name\": \"others\", \"groups\": [ \"others\" ] },\n\t\t{ \"name\": \"about\", \"groups\": [ \"about\" ] },\n\t\t{ \"name\": \"basicstyles\", \"groups\": [ \"basicstyles\", \"cleanup\" ] },\n\t\t{ \"name\": \"paragraph\", \"groups\": [ \"list\", \"indent\", \"blocks\", \"align\", \"bidi\", \"paragraph\" ] },\n\t\t{ \"name\": \"styles\", \"groups\": [ \"styles\" ] },\n\t\t{ \"name\": \"colors\", \"groups\": [ \"colors\" ] }\n\t] \n}\n"
        },
        "$:/plugins/bj/visualeditor/verbatim.json": {
            "type": "application/json",
            "title": "$:/plugins/bj/visualeditor/verbatim.json",
            "module-type": "library",
            "text": "{\n\"verbatim\":\".verbatim{background-color: red;border:2px solid;}\"\n}\n"
        },
        "$:/plugin/bj/visualeditor/includelib": {
            "title": "$:/plugin/bj/visualeditor/includelib",
            "description": "load the external lib",
            "text": "<script src='http://127.0.0.1/libs/ckeditor/ckeditor.js'></script>\n\n"
        },
        "$:/plugin/bj/visualeditor/bjtools/lib": {
            "title": "$:/plugin/bj/visualeditor/bjtools/lib",
            "description": "load the external lib from web",
            "text": "http://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.3.2/ckeditor.js\n"
        },
        "$:/plugins/bj/visualeditor/readme": {
            "title": "$:/plugins/bj/visualeditor/readme",
            "text": "!!!Basic Configuration\nThis plugin enables ckeditor to be used in a tiddlywiki. For the Ckeditor license see http://ckeditor.com/about/license\n\nckeditor can be used directly from the web, eg http://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.3.2/ckeditor.js\nor can be obtained directly from http://ckeditor.com/download\n\nNote that this plugin is designed to work with the ckeditor standard packages (but can be configured for custom packages).\n\nThe tiddler $:/plugin/bj/visualeditor/includelib\n\nneeds to contain the location of the ckeditor library. The default is\n\n```\nhttp://127.0.0.1/libs/ckeditor/ckeditor.js\n```\nchange to your location. Note that this can be an online location eg\n\n```\nhttp://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.3.2/ckeditor.js\n\n```\n\n!!!Advanced configuration\nConfiguration options as described on the ckeditor website can be set in the tiddler \n$:/plugins/bj/visualeditor/config.json\nUser styles (also described on the ckeditor website) are included in the tiddler \n$:/plugins/bj/visualeditor/styles.json\n"
        },
        "$:/language/Docs/Types/text/x-htmlp": {
            "title": "$:/language/Docs/Types/text/x-htmlp",
            "description": "ckeditor usage",
            "name": "text/x-htmlp",
            "group": "Text"
        },
        "$:/config/EditorTypeMappings/text/x-htmlp": {
            "title": "$:/config/EditorTypeMappings/text/x-htmlp",
            "text": "html"
        }
    }
}
{
    "tiddlers": {
        "$:/config/HighlightPlugin/TypeMappings/application/javascript": {
            "title": "$:/config/HighlightPlugin/TypeMappings/application/javascript",
            "text": "javascript"
        },
        "$:/config/HighlightPlugin/TypeMappings/application/json": {
            "title": "$:/config/HighlightPlugin/TypeMappings/application/json",
            "text": "json"
        },
        "$:/config/HighlightPlugin/TypeMappings/text/css": {
            "title": "$:/config/HighlightPlugin/TypeMappings/text/css",
            "text": "css"
        },
        "$:/config/HighlightPlugin/TypeMappings/text/html": {
            "title": "$:/config/HighlightPlugin/TypeMappings/text/html",
            "text": "html"
        },
        "$:/config/HighlightPlugin/TypeMappings/image/svg+xml": {
            "title": "$:/config/HighlightPlugin/TypeMappings/image/svg+xml",
            "text": "xml"
        },
        "$:/config/HighlightPlugin/TypeMappings/text/x-markdown": {
            "title": "$:/config/HighlightPlugin/TypeMappings/text/x-markdown",
            "text": "markdown"
        },
        "$:/plugins/tiddlywiki/highlight/highlight.js": {
            "text": "var hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\n/*! highlight.js v9.18.1 | BSD3 License | git.io/hljslicense */\n!function(e){var n=\"object\"==typeof window&&window||\"object\"==typeof self&&self;\"undefined\"==typeof exports||exports.nodeType?n&&(n.hljs=e({}),\"function\"==typeof define&&define.amd&&define([],function(){return n.hljs})):e(exports)}(function(a){var f=[],i=Object.keys,_={},c={},C=!0,n=/^(no-?highlight|plain|text)$/i,l=/\\blang(?:uage)?-([\\w-]+)\\b/i,t=/((^(<[^>]+>|\\t|)+|(?:\\n)))/gm,r={case_insensitive:\"cI\",lexemes:\"l\",contains:\"c\",keywords:\"k\",subLanguage:\"sL\",className:\"cN\",begin:\"b\",beginKeywords:\"bK\",end:\"e\",endsWithParent:\"eW\",illegal:\"i\",excludeBegin:\"eB\",excludeEnd:\"eE\",returnBegin:\"rB\",returnEnd:\"rE\",variants:\"v\",IDENT_RE:\"IR\",UNDERSCORE_IDENT_RE:\"UIR\",NUMBER_RE:\"NR\",C_NUMBER_RE:\"CNR\",BINARY_NUMBER_RE:\"BNR\",RE_STARTERS_RE:\"RSR\",BACKSLASH_ESCAPE:\"BE\",APOS_STRING_MODE:\"ASM\",QUOTE_STRING_MODE:\"QSM\",PHRASAL_WORDS_MODE:\"PWM\",C_LINE_COMMENT_MODE:\"CLCM\",C_BLOCK_COMMENT_MODE:\"CBCM\",HASH_COMMENT_MODE:\"HCM\",NUMBER_MODE:\"NM\",C_NUMBER_MODE:\"CNM\",BINARY_NUMBER_MODE:\"BNM\",CSS_NUMBER_MODE:\"CSSNM\",REGEXP_MODE:\"RM\",TITLE_MODE:\"TM\",UNDERSCORE_TITLE_MODE:\"UTM\",COMMENT:\"C\",beginRe:\"bR\",endRe:\"eR\",illegalRe:\"iR\",lexemesRe:\"lR\",terminators:\"t\",terminator_end:\"tE\"},m=\"</span>\",O=\"Could not find the language '{}', did you forget to load/include a language module?\",B={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},o=\"of and for in not or if then\".split(\" \");function x(e){return e.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\")}function g(e){return e.nodeName.toLowerCase()}function u(e){return n.test(e)}function s(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function E(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:\"start\",offset:t,node:r}),t=e(r,t),g(r).match(/br|hr|img|input/)||a.push({event:\"stop\",offset:t,node:r}));return t}(e,0),a}function d(e,n,t){var r=0,a=\"\",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:\"start\"===n[0].event?e:n:e.length?e:n}function c(e){a+=\"<\"+g(e)+f.map.call(e.attributes,function(e){return\" \"+e.nodeName+'=\"'+x(e.value).replace(/\"/g,\"&quot;\")+'\"'}).join(\"\")+\">\"}function l(e){a+=\"</\"+g(e)+\">\"}function u(e){(\"start\"===e.event?c:l)(e.node)}for(;e.length||n.length;){var s=o();if(a+=x(t.substring(r,s[0].offset)),r=s[0].offset,s===e){for(i.reverse().forEach(l);u(s.splice(0,1)[0]),(s=o())===e&&s.length&&s[0].offset===r;);i.reverse().forEach(c)}else\"start\"===s[0].event?i.push(s[0].node):i.pop(),u(s.splice(0,1)[0])}return a+x(t.substr(r))}function R(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return s(n,{v:null},e)})),n.cached_variants?n.cached_variants:function e(n){return!!n&&(n.eW||e(n.starts))}(n)?[s(n,{starts:n.starts?s(n.starts):null})]:Object.isFrozen(n)?[s(n)]:[n]}function p(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(p)}}function v(n,r){var a={};return\"string\"==typeof n?t(\"keyword\",n):i(n).forEach(function(e){t(e,n[e])}),a;function t(t,e){r&&(e=e.toLowerCase()),e.split(\" \").forEach(function(e){var n=e.split(\"|\");a[n[0]]=[t,function(e,n){return n?Number(n):function(e){return-1!=o.indexOf(e.toLowerCase())}(e)?0:1}(n[0],n[1])]})}}function S(r){function s(e){return e&&e.source||e}function f(e,n){return new RegExp(s(e),\"m\"+(r.cI?\"i\":\"\")+(n?\"g\":\"\"))}function a(a){var i,e,o={},c=[],l={},t=1;function n(e,n){o[t]=e,c.push([e,n]),t+=function(e){return new RegExp(e.toString()+\"|\").exec(\"\").length-1}(n)+1}for(var r=0;r<a.c.length;r++){n(e=a.c[r],e.bK?\"\\\\.?(?:\"+e.b+\")\\\\.?\":e.b)}a.tE&&n(\"end\",a.tE),a.i&&n(\"illegal\",a.i);var u=c.map(function(e){return e[1]});return i=f(function(e,n){for(var t=/\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./,r=0,a=\"\",i=0;i<e.length;i++){var o=r+=1,c=s(e[i]);for(0<i&&(a+=n),a+=\"(\";0<c.length;){var l=t.exec(c);if(null==l){a+=c;break}a+=c.substring(0,l.index),c=c.substring(l.index+l[0].length),\"\\\\\"==l[0][0]&&l[1]?a+=\"\\\\\"+String(Number(l[1])+o):(a+=l[0],\"(\"==l[0]&&r++)}a+=\")\"}return a}(u,\"|\"),!0),l.lastIndex=0,l.exec=function(e){var n;if(0===c.length)return null;i.lastIndex=l.lastIndex;var t=i.exec(e);if(!t)return null;for(var r=0;r<t.length;r++)if(null!=t[r]&&null!=o[\"\"+r]){n=o[\"\"+r];break}return\"string\"==typeof n?(t.type=n,t.extra=[a.i,a.tE]):(t.type=\"begin\",t.rule=n),t},l}if(r.c&&-1!=r.c.indexOf(\"self\")){if(!C)throw new Error(\"ERR: contains `self` is not supported at the top-level of a language.  See documentation.\");r.c=r.c.filter(function(e){return\"self\"!=e})}!function n(t,e){t.compiled||(t.compiled=!0,t.k=t.k||t.bK,t.k&&(t.k=v(t.k,r.cI)),t.lR=f(t.l||/\\w+/,!0),e&&(t.bK&&(t.b=\"\\\\b(\"+t.bK.split(\" \").join(\"|\")+\")\\\\b\"),t.b||(t.b=/\\B|\\b/),t.bR=f(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\\B|\\b/),t.e&&(t.eR=f(t.e)),t.tE=s(t.e)||\"\",t.eW&&e.tE&&(t.tE+=(t.e?\"|\":\"\")+e.tE)),t.i&&(t.iR=f(t.i)),null==t.relevance&&(t.relevance=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return R(\"self\"===e?t:e)})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e),t.t=a(t))}(r)}function T(n,e,a,t){var i=e;function o(e,n){if(function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}if(e.eW)return o(e.parent,n)}function c(e,n,t,r){if(!t&&\"\"===n)return\"\";if(!e)return n;var a='<span class=\"'+(r?\"\":B.classPrefix);return(a+=e+'\">')+n+(t?\"\":m)}function l(){p+=null!=d.sL?function(){var e=\"string\"==typeof d.sL;if(e&&!_[d.sL])return x(v);var n=e?T(d.sL,v,!0,R[d.sL]):w(v,d.sL.length?d.sL:void 0);return 0<d.relevance&&(M+=n.relevance),e&&(R[d.sL]=n.top),c(n.language,n.value,!1,!0)}():function(){var e,n,t,r,a,i,o;if(!d.k)return x(v);for(r=\"\",n=0,d.lR.lastIndex=0,t=d.lR.exec(v);t;)r+=x(v.substring(n,t.index)),a=d,i=t,void 0,o=g.cI?i[0].toLowerCase():i[0],(e=a.k.hasOwnProperty(o)&&a.k[o])?(M+=e[1],r+=c(e[0],x(t[0]))):r+=x(t[0]),n=d.lR.lastIndex,t=d.lR.exec(v);return r+x(v.substr(n))}(),v=\"\"}function u(e){p+=e.cN?c(e.cN,\"\",!0):\"\",d=Object.create(e,{parent:{value:d}})}function s(e){var n=e[0],t=e.rule;return t&&t.endSameAsBegin&&(t.eR=function(e){return new RegExp(e.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\"),\"m\")}(n)),t.skip?v+=n:(t.eB&&(v+=n),l(),t.rB||t.eB||(v=n)),u(t),t.rB?0:n.length}var f={};function r(e,n){var t=n&&n[0];if(v+=e,null==t)return l(),0;if(\"begin\"==f.type&&\"end\"==n.type&&f.index==n.index&&\"\"===t)return v+=i.slice(n.index,n.index+1),1;if(\"begin\"===(f=n).type)return s(n);if(\"illegal\"===n.type&&!a)throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(d.cN||\"<unnamed>\")+'\"');if(\"end\"===n.type){var r=function(e){var n=e[0],t=i.substr(e.index),r=o(d,t);if(r){var a=d;for(a.skip?v+=n:(a.rE||a.eE||(v+=n),l(),a.eE&&(v=n));d.cN&&(p+=m),d.skip||d.sL||(M+=d.relevance),(d=d.parent)!==r.parent;);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),u(r.starts)),a.rE?0:n.length}}(n);if(null!=r)return r}return v+=t,t.length}var g=D(n);if(!g)throw console.error(O.replace(\"{}\",n)),new Error('Unknown language: \"'+n+'\"');S(g);var E,d=t||g,R={},p=\"\";for(E=d;E!==g;E=E.parent)E.cN&&(p=c(E.cN,\"\",!0)+p);var v=\"\",M=0;try{for(var b,h,N=0;d.t.lastIndex=N,b=d.t.exec(i);)h=r(i.substring(N,b.index),b),N=b.index+h;for(r(i.substr(N)),E=d;E.parent;E=E.parent)E.cN&&(p+=m);return{relevance:M,value:p,i:!1,language:n,top:d}}catch(e){if(e.message&&-1!==e.message.indexOf(\"Illegal\"))return{i:!0,relevance:0,value:x(i)};if(C)return{relevance:0,value:x(i),language:n,top:d,errorRaised:e};throw e}}function w(t,e){e=e||B.languages||i(_);var r={relevance:0,value:x(t)},a=r;return e.filter(D).filter(L).forEach(function(e){var n=T(e,t,!1);n.language=e,n.relevance>a.relevance&&(a=n),n.relevance>r.relevance&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function M(e){return B.tabReplace||B.useBR?e.replace(t,function(e,n){return B.useBR&&\"\\n\"===e?\"<br>\":B.tabReplace?n.replace(/\\t/g,B.tabReplace):\"\"}):e}function b(e){var n,t,r,a,i,o=function(e){var n,t,r,a,i=e.className+\" \";if(i+=e.parentNode?e.parentNode.className:\"\",t=l.exec(i)){var o=D(t[1]);return o||(console.warn(O.replace(\"{}\",t[1])),console.warn(\"Falling back to no-highlight mode for this block.\",e)),o?t[1]:\"no-highlight\"}for(n=0,r=(i=i.split(/\\s+/)).length;n<r;n++)if(u(a=i[n])||D(a))return a}(e);u(o)||(B.useBR?(n=document.createElement(\"div\")).innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\"):n=e,i=n.textContent,r=o?T(o,i,!0):w(i),(t=E(n)).length&&((a=document.createElement(\"div\")).innerHTML=r.value,r.value=d(t,E(a),i)),r.value=M(r.value),e.innerHTML=r.value,e.className=function(e,n,t){var r=n?c[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}(e.className,o,r.language),e.result={language:r.language,re:r.relevance},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.relevance}))}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");f.forEach.call(e,b)}}var N={disableAutodetect:!0};function D(e){return e=(e||\"\").toLowerCase(),_[e]||_[c[e]]}function L(e){var n=D(e);return n&&!n.disableAutodetect}return a.highlight=T,a.highlightAuto=w,a.fixMarkup=M,a.highlightBlock=b,a.configure=function(e){B=s(B,e)},a.initHighlighting=h,a.initHighlightingOnLoad=function(){window.addEventListener(\"DOMContentLoaded\",h,!1),window.addEventListener(\"load\",h,!1)},a.registerLanguage=function(n,e){var t;try{t=e(a)}catch(e){if(console.error(\"Language definition for '{}' could not be registered.\".replace(\"{}\",n)),!C)throw e;console.error(e),t=N}p(_[n]=t),t.rawDefinition=e.bind(null,a),t.aliases&&t.aliases.forEach(function(e){c[e]=n})},a.listLanguages=function(){return i(_)},a.getLanguage=D,a.requireLanguage=function(e){var n=D(e);if(n)return n;throw new Error(\"The '{}' language is required, but not loaded.\".replace(\"{}\",e))},a.autoDetection=L,a.inherit=s,a.debugMode=function(){C=!1},a.IR=a.IDENT_RE=\"[a-zA-Z]\\\\w*\",a.UIR=a.UNDERSCORE_IDENT_RE=\"[a-zA-Z_]\\\\w*\",a.NR=a.NUMBER_RE=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",a.CNR=a.C_NUMBER_RE=\"(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",a.BNR=a.BINARY_NUMBER_RE=\"\\\\b(0b[01]+)\",a.RSR=a.RE_STARTERS_RE=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",a.BE=a.BACKSLASH_ESCAPE={b:\"\\\\\\\\[\\\\s\\\\S]\",relevance:0},a.ASM=a.APOS_STRING_MODE={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:\"comment\",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:\"doctag\",b:\"(?:TODO|FIXME|NOTE|BUG|XXX):\",relevance:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C(\"//\",\"$\"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C(\"/\\\\*\",\"\\\\*/\"),a.HCM=a.HASH_COMMENT_MODE=a.C(\"#\",\"$\"),a.NM=a.NUMBER_MODE={cN:\"number\",b:a.NR,relevance:0},a.CNM=a.C_NUMBER_MODE={cN:\"number\",b:a.CNR,relevance:0},a.BNM=a.BINARY_NUMBER_MODE={cN:\"number\",b:a.BNR,relevance:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:\"number\",b:a.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",relevance:0},a.RM=a.REGEXP_MODE={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[a.BE,{b:/\\[/,e:/\\]/,relevance:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:\"title\",b:a.IR,relevance:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:\"title\",b:a.UIR,relevance:0},a.METHOD_GUARD={b:\"\\\\.\\\\s*\"+a.UIR,relevance:0},[a.BE,a.ASM,a.QSM,a.PWM,a.C,a.CLCM,a.CBCM,a.HCM,a.NM,a.CNM,a.BNM,a.CSSNM,a.RM,a.TM,a.UTM,a.METHOD_GUARD].forEach(function(e){!function n(t){Object.freeze(t);var r=\"function\"==typeof t;Object.getOwnPropertyNames(t).forEach(function(e){!t.hasOwnProperty(e)||null===t[e]||\"object\"!=typeof t[e]&&\"function\"!=typeof t[e]||r&&(\"caller\"===e||\"callee\"===e||\"arguments\"===e)||Object.isFrozen(t[e])||n(t[e])});return t}(e)}),a});hljs.registerLanguage(\"swift\",function(e){var i={keyword:\"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet\",literal:\"true false nil\",built_in:\"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip\"},t=e.C(\"/\\\\*\",\"\\\\*/\",{c:[\"self\"]}),n={cN:\"subst\",b:/\\\\\\(/,e:\"\\\\)\",k:i,c:[]},r={cN:\"string\",c:[e.BE,n],v:[{b:/\"\"\"/,e:/\"\"\"/},{b:/\"/,e:/\"/}]},a={cN:\"number\",b:\"\\\\b([\\\\d_]+(\\\\.[\\\\deE_]+)?|0x[a-fA-F0-9_]+(\\\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\\\b\",relevance:0};return n.c=[a],{k:i,c:[r,e.CLCM,t,{cN:\"type\",b:\"\\\\b[A-Z][\\\\wÀ-ʸ']*[!?]\"},{cN:\"type\",b:\"\\\\b[A-Z][\\\\wÀ-ʸ']*\",relevance:0},a,{cN:\"function\",bK:\"func\",e:\"{\",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{b:/</,e:/>/},{cN:\"params\",b:/\\(/,e:/\\)/,endsParent:!0,k:i,c:[\"self\",a,r,e.CBCM,{b:\":\"}],i:/[\"']/}],i:/\\[|%/},{cN:\"class\",bK:\"struct protocol class extension enum\",k:i,e:\"\\\\{\",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][\\u00C0-\\u02B80-9A-Za-z$_]*/})]},{cN:\"meta\",b:\"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\"},{bK:\"import\",e:/$/,c:[e.CLCM,t]}]}});hljs.registerLanguage(\"less\",function(e){function r(e){return{cN:\"string\",b:\"~?\"+e+\".*?\"+e}}function t(e,r,t){return{cN:e,b:r,relevance:t}}var a=\"[\\\\w-]+\",c=\"(\"+a+\"|@{\"+a+\"})\",s=[],n=[],b={b:\"\\\\(\",e:\"\\\\)\",c:n,relevance:0};n.push(e.CLCM,e.CBCM,r(\"'\"),r('\"'),e.CSSNM,{b:\"(url|data-uri)\\\\(\",starts:{cN:\"string\",e:\"[\\\\)\\\\n]\",eE:!0}},t(\"number\",\"#[0-9A-Fa-f]+\\\\b\"),b,t(\"variable\",\"@@?\"+a,10),t(\"variable\",\"@{\"+a+\"}\"),t(\"built_in\",\"~?`[^`]*?`\"),{cN:\"attribute\",b:a+\"\\\\s*:\",e:\":\",rB:!0,eE:!0},{cN:\"meta\",b:\"!important\"});var i=n.concat({b:\"{\",e:\"}\",c:s}),l={bK:\"when\",eW:!0,c:[{bK:\"and not\"}].concat(n)},o={b:c+\"\\\\s*:\",rB:!0,e:\"[;}]\",relevance:0,c:[{cN:\"attribute\",b:c,e:\":\",eE:!0,starts:{eW:!0,i:\"[<=$]\",relevance:0,c:n}}]},u={cN:\"keyword\",b:\"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\\\b\",starts:{e:\"[;{}]\",rE:!0,c:n,relevance:0}},v={cN:\"variable\",v:[{b:\"@\"+a+\"\\\\s*:\",relevance:15},{b:\"@\"+a}],starts:{e:\"[;}]\",rE:!0,c:i}},C={v:[{b:\"[\\\\.#:&\\\\[>]\",e:\"[;{}]\"},{b:c,e:\"{\"}],rB:!0,rE:!0,i:\"[<='$\\\"]\",relevance:0,c:[e.CLCM,e.CBCM,l,t(\"keyword\",\"all\\\\b\"),t(\"variable\",\"@{\"+a+\"}\"),t(\"selector-tag\",c+\"%?\",0),t(\"selector-id\",\"#\"+c),t(\"selector-class\",\"\\\\.\"+c,0),t(\"selector-tag\",\"&\",0),{cN:\"selector-attr\",b:\"\\\\[\",e:\"\\\\]\"},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"\\\\(\",e:\"\\\\)\",c:i},{b:\"!important\"}]};return s.push(e.CLCM,e.CBCM,u,v,o,C),{cI:!0,i:\"[=>'/<($\\\"]\",c:s}});hljs.registerLanguage(\"armasm\",function(s){return{cI:!0,aliases:[\"arm\"],l:\"\\\\.?\"+s.IR,k:{meta:\".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND \",built_in:\"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @\"},c:[{cN:\"keyword\",b:\"\\\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?\",e:\"\\\\s\"},s.C(\"[;@]\",\"$\",{relevance:0}),s.CBCM,s.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",relevance:0},{cN:\"title\",b:\"\\\\|\",e:\"\\\\|\",i:\"\\\\n\",relevance:0},{cN:\"number\",v:[{b:\"[#$=]?0x[0-9a-f]+\"},{b:\"[#$=]?0b[01]+\"},{b:\"[#$=]\\\\d+\"},{b:\"\\\\b\\\\d+\"}],relevance:0},{cN:\"symbol\",v:[{b:\"^[a-z_\\\\.\\\\$][a-z0-9_\\\\.\\\\$]+\"},{b:\"^\\\\s*[a-z_\\\\.\\\\$][a-z0-9_\\\\.\\\\$]+:\"},{b:\"[=#]\\\\w+\"}],relevance:0}]}});hljs.registerLanguage(\"ruby\",function(e){var c=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\",b={keyword:\"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor\",literal:\"true false nil\"},r={cN:\"doctag\",b:\"@[A-Za-z]+\"},a={b:\"#<\",e:\">\"},n=[e.C(\"#\",\"$\",{c:[r]}),e.C(\"^\\\\=begin\",\"^\\\\=end\",{c:[r],relevance:10}),e.C(\"^__END__\",\"\\\\n$\")],s={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:b},t={cN:\"string\",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/`/,e:/`/},{b:\"%[qQwWx]?\\\\(\",e:\"\\\\)\"},{b:\"%[qQwWx]?\\\\[\",e:\"\\\\]\"},{b:\"%[qQwWx]?{\",e:\"}\"},{b:\"%[qQwWx]?<\",e:\">\"},{b:\"%[qQwWx]?/\",e:\"/\"},{b:\"%[qQwWx]?%\",e:\"%\"},{b:\"%[qQwWx]?-\",e:\"-\"},{b:\"%[qQwWx]?\\\\|\",e:\"\\\\|\"},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/},{b:/<<[-~]?'?(\\w+)(?:.|\\n)*?\\n\\s*\\1\\b/,rB:!0,c:[{b:/<<[-~]?'?/},{b:/\\w+/,endSameAsBegin:!0,c:[e.BE,s]}]}]},i={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",endsParent:!0,k:b},l=[t,a,{cN:\"class\",bK:\"class module\",e:\"$|;\",i:/=/,c:[e.inherit(e.TM,{b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\"}),{b:\"<\\\\s*\",c:[{b:\"(\"+e.IR+\"::)?\"+e.IR}]}].concat(n)},{cN:\"function\",bK:\"def\",e:\"$|;\",c:[e.inherit(e.TM,{b:c}),i].concat(n)},{b:e.IR+\"::\"},{cN:\"symbol\",b:e.UIR+\"(\\\\!|\\\\?)?:\",relevance:0},{cN:\"symbol\",b:\":(?!\\\\s)\",c:[t,{b:c}],relevance:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",relevance:0},{b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{cN:\"params\",b:/\\|/,e:/\\|/,k:b},{b:\"(\"+e.RSR+\"|unless)\\\\s*\",k:\"unless\",c:[a,{cN:\"regexp\",c:[e.BE,s],i:/\\n/,v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r{\",e:\"}[a-z]*\"},{b:\"%r\\\\(\",e:\"\\\\)[a-z]*\"},{b:\"%r!\",e:\"![a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}].concat(n),relevance:0}].concat(n);s.c=l;var d=[{b:/^\\s*=>/,starts:{e:\"$\",c:i.c=l}},{cN:\"meta\",b:\"^([>?]>|[\\\\w#]+\\\\(\\\\w+\\\\):\\\\d+:\\\\d+>|(\\\\w+-)?\\\\d+\\\\.\\\\d+\\\\.\\\\d(p\\\\d+)?[^>]+>)\",starts:{e:\"$\",c:l}}];return{aliases:[\"rb\",\"gemspec\",\"podspec\",\"thor\",\"irb\"],k:b,i:/\\/\\*/,c:n.concat(d).concat(l)}});hljs.registerLanguage(\"lua\",function(e){var t=\"\\\\[=*\\\\[\",a=\"\\\\]=*\\\\]\",n={b:t,e:a,c:[\"self\"]},l=[e.C(\"--(?!\"+t+\")\",\"$\"),e.C(\"--\"+t,a,{c:[n],relevance:10})];return{l:e.UIR,k:{literal:\"true false nil\",keyword:\"and break do else elseif end for goto if in local not or repeat return then until while\",built_in:\"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstringmodule next pairs pcall print rawequal rawget rawset require select setfenvsetmetatable tonumber tostring type unpack xpcall arg selfcoroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove\"},c:l.concat([{cN:\"function\",bK:\"function\",e:\"\\\\)\",c:[e.inherit(e.TM,{b:\"([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*\"}),{cN:\"params\",b:\"\\\\(\",eW:!0,c:l}].concat(l)},e.CNM,e.ASM,e.QSM,{cN:\"string\",b:t,e:a,c:[n],relevance:5}])}});hljs.registerLanguage(\"matlab\",function(e){var a=\"('|\\\\.')+\",s={relevance:0,c:[{b:a}]};return{k:{keyword:\"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while\",built_in:\"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson max min nanmax nanmin mean nanmean type table readtable writetable sortrows sort figure plot plot3 scatter scatter3 cellfun legend intersect ismember procrustes hold num2cell \"},i:'(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",bK:\"function\",e:\"$\",c:[e.UTM,{cN:\"params\",v:[{b:\"\\\\(\",e:\"\\\\)\"},{b:\"\\\\[\",e:\"\\\\]\"}]}]},{cN:\"built_in\",b:/true|false/,relevance:0,starts:s},{b:\"[a-zA-Z][a-zA-Z_0-9]*\"+a,relevance:0},{cN:\"number\",b:e.CNR,relevance:0,starts:s},{cN:\"string\",b:\"'\",e:\"'\",c:[e.BE,{b:\"''\"}]},{b:/\\]|}|\\)/,relevance:0,starts:s},{cN:\"string\",b:'\"',e:'\"',c:[e.BE,{b:'\"\"'}],starts:s},e.C(\"^\\\\s*\\\\%\\\\{\\\\s*$\",\"^\\\\s*\\\\%\\\\}\\\\s*$\"),e.C(\"\\\\%\",\"$\")]}});hljs.registerLanguage(\"apache\",function(e){var r={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{aliases:[\"apacheconf\"],cI:!0,c:[e.HCM,{cN:\"section\",b:\"</?\",e:\">\"},{cN:\"attribute\",b:/\\w+/,relevance:0,k:{nomarkup:\"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername\"},starts:{e:/$/,relevance:0,k:{literal:\"on off all\"},c:[{cN:\"meta\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"variable\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",r]},r,e.QSM]}}],i:/\\S/}});hljs.registerLanguage(\"yaml\",function(e){var b=\"true false yes no null\",a={cN:\"string\",relevance:0,v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/\\S+/}],c:[e.BE,{cN:\"template-variable\",v:[{b:\"{{\",e:\"}}\"},{b:\"%{\",e:\"}\"}]}]};return{cI:!0,aliases:[\"yml\",\"YAML\",\"yaml\"],c:[{cN:\"attr\",v:[{b:\"\\\\w[\\\\w :\\\\/.-]*:(?=[ \\t]|$)\"},{b:'\"\\\\w[\\\\w :\\\\/.-]*\":(?=[ \\t]|$)'},{b:\"'\\\\w[\\\\w :\\\\/.-]*':(?=[ \\t]|$)\"}]},{cN:\"meta\",b:\"^---s*$\",relevance:10},{cN:\"string\",b:\"[\\\\|>]([0-9]?[+-])?[ ]*\\\\n( *)[\\\\S ]+\\\\n(\\\\2[\\\\S ]+\\\\n?)*\"},{b:\"<%[%=-]?\",e:\"[%-]?%>\",sL:\"ruby\",eB:!0,eE:!0,relevance:0},{cN:\"type\",b:\"!\"+e.UIR},{cN:\"type\",b:\"!!\"+e.UIR},{cN:\"meta\",b:\"&\"+e.UIR+\"$\"},{cN:\"meta\",b:\"\\\\*\"+e.UIR+\"$\"},{cN:\"bullet\",b:\"\\\\-(?=[ ]|$)\",relevance:0},e.HCM,{bK:b,k:{literal:b}},{cN:\"number\",b:e.CNR+\"\\\\b\"},a]}});hljs.registerLanguage(\"plaintext\",function(e){return{disableAutodetect:!0}});hljs.registerLanguage(\"erlang-repl\",function(e){return{k:{built_in:\"spawn spawn_link self\",keyword:\"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor\"},c:[{cN:\"meta\",b:\"^[0-9]+> \",relevance:10},e.C(\"%\",\"$\"),{cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",relevance:0},e.ASM,e.QSM,{b:\"\\\\?(::)?([A-Z]\\\\w*(::)?)+\"},{b:\"->\"},{b:\"ok\"},{b:\"!\"},{b:\"(\\\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\\\b[a-z'][a-zA-Z0-9_']*)\",relevance:0},{b:\"[A-Z][a-zA-Z0-9_']*\",relevance:0}]}});hljs.registerLanguage(\"cmake\",function(e){return{aliases:[\"cmake.in\"],cI:!0,k:{keyword:\"break cmake_host_system_information cmake_minimum_required cmake_parse_arguments cmake_policy configure_file continue elseif else endforeach endfunction endif endmacro endwhile execute_process file find_file find_library find_package find_path find_program foreach function get_cmake_property get_directory_property get_filename_component get_property if include include_guard list macro mark_as_advanced math message option return separate_arguments set_directory_properties set_property set site_name string unset variable_watch while add_compile_definitions add_compile_options add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_link_options add_subdirectory add_test aux_source_directory build_command create_test_sourcelist define_property enable_language enable_testing export fltk_wrap_ui get_source_file_property get_target_property get_test_property include_directories include_external_msproject include_regular_expression install link_directories link_libraries load_cache project qt_wrap_cpp qt_wrap_ui remove_definitions set_source_files_properties set_target_properties set_tests_properties source_group target_compile_definitions target_compile_features target_compile_options target_include_directories target_link_directories target_link_libraries target_link_options target_sources try_compile try_run ctest_build ctest_configure ctest_coverage ctest_empty_binary_directory ctest_memcheck ctest_read_custom_files ctest_run_script ctest_sleep ctest_start ctest_submit ctest_test ctest_update ctest_upload build_name exec_program export_library_dependencies install_files install_programs install_targets load_command make_directory output_required_files remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or not command policy target test exists is_newer_than is_directory is_symlink is_absolute matches less greater equal less_equal greater_equal strless strgreater strequal strless_equal strgreater_equal version_less version_greater version_equal version_less_equal version_greater_equal in_list defined\"},c:[{cN:\"variable\",b:\"\\\\${\",e:\"}\"},e.HCM,e.QSM,e.NM]}});hljs.registerLanguage(\"kotlin\",function(e){var t={keyword:\"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default\",built_in:\"Byte Short Char Int Long Boolean Float Double Void Unit Nothing\",literal:\"true false null\"},a={cN:\"symbol\",b:e.UIR+\"@\"},n={cN:\"subst\",b:\"\\\\${\",e:\"}\",c:[e.CNM]},c={cN:\"variable\",b:\"\\\\$\"+e.UIR},r={cN:\"string\",v:[{b:'\"\"\"',e:'\"\"\"(?=[^\"])',c:[c,n]},{b:\"'\",e:\"'\",i:/\\n/,c:[e.BE]},{b:'\"',e:'\"',i:/\\n/,c:[e.BE,c,n]}]};n.c.push(r);var i={cN:\"meta\",b:\"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\\\s*:(?:\\\\s*\"+e.UIR+\")?\"},l={cN:\"meta\",b:\"@\"+e.UIR,c:[{b:/\\(/,e:/\\)/,c:[e.inherit(r,{cN:\"meta-string\"})]}]},s={cN:\"number\",b:\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",relevance:0},b=e.C(\"/\\\\*\",\"\\\\*/\",{c:[e.CBCM]}),o={v:[{cN:\"type\",b:e.UIR},{b:/\\(/,e:/\\)/,c:[]}]},d=o;return d.v[1].c=[o],o.v[1].c=[d],{aliases:[\"kt\"],k:t,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,b,{cN:\"keyword\",b:/\\b(break|continue|return|this)\\b/,starts:{c:[{cN:\"symbol\",b:/@\\w+/}]}},a,i,l,{cN:\"function\",bK:\"fun\",e:\"[(]|$\",rB:!0,eE:!0,k:t,i:/fun\\s+(<.*>)?[^\\s\\(]+(\\s+[^\\s\\(]+)\\s*=/,relevance:5,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,relevance:0,c:[e.UTM]},{cN:\"type\",b:/</,e:/>/,k:\"reified\",relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,endsParent:!0,k:t,relevance:0,c:[{b:/:/,e:/[=,\\/]/,eW:!0,c:[o,e.CLCM,b],relevance:0},e.CLCM,b,i,l,r,e.CNM]},b]},{cN:\"class\",bK:\"class interface trait\",e:/[:\\{(]|$/,eE:!0,i:\"extends implements\",c:[{bK:\"public protected internal private constructor\"},e.UTM,{cN:\"type\",b:/</,e:/>/,eB:!0,eE:!0,relevance:0},{cN:\"type\",b:/[,:]\\s*/,e:/[<\\(,]|$/,eB:!0,rE:!0},i,l]},r,{cN:\"meta\",b:\"^#!/usr/bin/env\",e:\"$\",i:\"\\n\"},s]}});hljs.registerLanguage(\"javascript\",function(e){var r=\"<>\",a=\"</>\",t={b:/<[A-Za-z0-9\\\\._:-]+/,e:/\\/[A-Za-z0-9\\\\._:-]+>|\\/>/},c=\"[A-Za-z$_][0-9A-Za-z$_]*\",n={keyword:\"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise\"},s={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)n?\"},{b:\"\\\\b(0[oO][0-7]+)n?\"},{b:e.CNR+\"n?\"}],relevance:0},o={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:n,c:[]},i={b:\"html`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"xml\"}},b={b:\"css`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"css\"}},l={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,o]};o.c=[e.ASM,e.QSM,i,b,l,s,e.RM];var u=o.c.concat([e.CBCM,e.CLCM]);return{aliases:[\"js\",\"jsx\",\"mjs\",\"cjs\"],k:n,c:[{cN:\"meta\",relevance:10,b:/^\\s*['\"]use (strict|asm)['\"]/},{cN:\"meta\",b:/^#!/,e:/$/},e.ASM,e.QSM,i,b,l,e.CLCM,e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{cN:\"doctag\",b:\"@[A-Za-z]+\",c:[{cN:\"type\",b:\"\\\\{\",e:\"\\\\}\",relevance:0},{cN:\"variable\",b:c+\"(?=\\\\s*(-)|$)\",endsParent:!0,relevance:0},{b:/(?=[^\\n])\\s/,relevance:0}]}]}),e.CBCM,s,{b:/[{,\\n]\\s*/,relevance:0,c:[{b:c+\"\\\\s*:\",rB:!0,relevance:0,c:[{cN:\"attr\",b:c,relevance:0}]}]},{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+c+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:c},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:n,c:u}]}]},{cN:\"\",b:/\\s/,e:/\\s*/,skip:!0},{v:[{b:r,e:a},{b:t.b,e:t.e}],sL:\"xml\",c:[{b:t.b,e:t.e,skip:!0,c:[\"self\"]}]}],relevance:0},{cN:\"function\",bK:\"function\",e:/\\{/,eE:!0,c:[e.inherit(e.TM,{b:c}),{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,c:u}],i:/\\[|%/},{b:/\\$[(.]/},e.METHOD_GUARD,{cN:\"class\",bK:\"class\",e:/[{;=]/,eE:!0,i:/[:\"\\[\\]]/,c:[{bK:\"extends\"},e.UTM]},{bK:\"constructor get set\",e:/\\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage(\"scss\",function(e){var t=\"@[a-z-]+\",r={cN:\"variable\",b:\"(\\\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\\\b\"},i={cN:\"number\",b:\"#[0-9A-Fa-f]+\"};e.CSSNM,e.QSM,e.ASM,e.CBCM;return{cI:!0,i:\"[=/|']\",c:[e.CLCM,e.CBCM,{cN:\"selector-id\",b:\"\\\\#[A-Za-z0-9_-]+\",relevance:0},{cN:\"selector-class\",b:\"\\\\.[A-Za-z0-9_-]+\",relevance:0},{cN:\"selector-attr\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"selector-tag\",b:\"\\\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\\\b\",relevance:0},{cN:\"selector-pseudo\",b:\":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)\"},{cN:\"selector-pseudo\",b:\"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)\"},r,{cN:\"attribute\",b:\"\\\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\\\b\",i:\"[^\\\\s]\"},{b:\"\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b\"},{b:\":\",e:\";\",c:[r,i,e.CSSNM,e.QSM,e.ASM,{cN:\"meta\",b:\"!important\"}]},{b:\"@(page|font-face)\",l:t,k:\"@page @font-face\"},{b:\"@\",e:\"[{;]\",rB:!0,k:\"and or not only\",c:[{b:t,cN:\"keyword\"},r,e.QSM,e.ASM,i,e.CSSNM]}]}});hljs.registerLanguage(\"perl\",function(e){var t=\"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when\",r={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:t},s={b:\"->{\",e:\"}\"},n={v:[{b:/\\$\\d/},{b:/[\\$%@](\\^\\w\\b|#\\w+(::\\w+)*|{\\w+}|\\w+(::\\w*)*)/},{b:/[\\$%@][^\\s\\w{]/,relevance:0}]},c=[e.BE,r,n],a=[n,e.HCM,e.C(\"^\\\\=\\\\w\",\"\\\\=cut\",{eW:!0}),s,{cN:\"string\",c:c,v:[{b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",relevance:5},{b:\"qw\\\\s+q\",e:\"q\",relevance:5},{b:\"'\",e:\"'\",c:[e.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[e.BE]},{b:\"{\\\\w+}\",c:[],relevance:0},{b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",c:[],relevance:0}]},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",relevance:0},{b:\"(\\\\/\\\\/|\"+e.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",relevance:0,c:[e.HCM,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",relevance:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[e.BE],relevance:0}]},{cN:\"function\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",eE:!0,relevance:5,c:[e.TM]},{b:\"-\\\\w\\\\b\",relevance:0},{b:\"^__DATA__$\",e:\"^__END__$\",sL:\"mojolicious\",c:[{b:\"^@@.*\",e:\"$\",cN:\"comment\"}]}];return r.c=a,{aliases:[\"pl\",\"pm\"],l:/[\\w\\.]+/,k:t,c:s.c=a}});hljs.registerLanguage(\"go\",function(e){var n={keyword:\"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune\",literal:\"true false iota nil\",built_in:\"append cap close complex copy imag len make new panic print println real recover delete\"};return{aliases:[\"golang\"],k:n,i:\"</\",c:[e.CLCM,e.CBCM,{cN:\"string\",v:[e.QSM,e.ASM,{b:\"`\",e:\"`\"}]},{cN:\"number\",v:[{b:e.CNR+\"[i]\",relevance:1},e.CNM]},{b:/:=/},{cN:\"function\",bK:\"func\",e:\"\\\\s*(\\\\{|$)\",eE:!0,c:[e.TM,{cN:\"params\",b:/\\(/,e:/\\)/,k:n,i:/[\"']/}]}]}});hljs.registerLanguage(\"x86asm\",function(s){return{cI:!0,l:\"[.%]?\"+s.IR,k:{keyword:\"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63\",built_in:\"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0  xmm1  xmm2  xmm3  xmm4  xmm5  xmm6  xmm7  xmm8  xmm9 xmm10  xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0  ymm1  ymm2  ymm3  ymm4  ymm5  ymm6  ymm7  ymm8  ymm9 ymm10  ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0  zmm1  zmm2  zmm3  zmm4  zmm5  zmm6  zmm7  zmm8  zmm9 zmm10  zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr\",meta:\"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__  __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__  __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__\"},c:[s.C(\";\",\"$\",{relevance:0}),{cN:\"number\",v:[{b:\"\\\\b(?:([0-9][0-9_]*)?\\\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\\\b\",relevance:0},{b:\"\\\\$[0-9][0-9A-Fa-f]*\",relevance:0},{b:\"\\\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\\\b\"},{b:\"\\\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\\\b\"}]},s.QSM,{cN:\"string\",v:[{b:\"'\",e:\"[^\\\\\\\\]'\"},{b:\"`\",e:\"[^\\\\\\\\]`\"}],relevance:0},{cN:\"symbol\",v:[{b:\"^\\\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\\\s+label)\"},{b:\"^\\\\s*%%[A-Za-z0-9_$#@~.?]*:\"}],relevance:0},{cN:\"subst\",b:\"%[0-9]+\",relevance:0},{cN:\"subst\",b:\"%!S+\",relevance:0},{cN:\"meta\",b:/^\\s*\\.[\\w_-]+/}]}});hljs.registerLanguage(\"cpp\",function(e){function t(e){return\"(?:\"+e+\")?\"}var r=\"decltype\\\\(auto\\\\)\",a=\"[a-zA-Z_]\\\\w*::\",i=\"(\"+r+\"|\"+t(a)+\"[a-zA-Z_]\\\\w*\"+t(\"<.*?>\")+\")\",c={cN:\"keyword\",b:\"\\\\b[a-z\\\\d_]*_t\\\\b\"},s={cN:\"string\",v:[{b:'(u8?|U|L)?\"',e:'\"',i:\"\\\\n\",c:[e.BE]},{b:\"(u8?|U|L)?'(\\\\\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\\\S)|.)\",e:\"'\",i:\".\"},{b:/(?:u8?|U|L)?R\"([^()\\\\ ]{0,16})\\((?:.|\\n)*?\\)\\1\"/}]},n={cN:\"number\",v:[{b:\"\\\\b(0b[01']+)\"},{b:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)(u|U|l|L|ul|UL|f|F|b|B)\"},{b:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"}],relevance:0},o={cN:\"meta\",b:/#\\s*[a-z]+\\b/,e:/$/,k:{\"meta-keyword\":\"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include\"},c:[{b:/\\\\\\n/,relevance:0},e.inherit(s,{cN:\"meta-string\"}),{cN:\"meta-string\",b:/<.*?>/,e:/$/,i:\"\\\\n\"},e.CLCM,e.CBCM]},l={cN:\"title\",b:t(a)+e.IR,relevance:0},u=t(a)+e.IR+\"\\\\s*\\\\(\",p={keyword:\"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_tshort reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq\",built_in:\"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary\",literal:\"true false nullptr NULL\"},m=[c,e.CLCM,e.CBCM,n,s],d={v:[{b:/=/,e:/;/},{b:/\\(/,e:/\\)/},{bK:\"new throw return else\",e:/;/}],k:p,c:m.concat([{b:/\\(/,e:/\\)/,k:p,c:m.concat([\"self\"]),relevance:0}]),relevance:0},b={cN:\"function\",b:\"(\"+i+\"[\\\\*&\\\\s]+)+\"+u,rB:!0,e:/[{;=]/,eE:!0,k:p,i:/[^\\w\\s\\*&:<>]/,c:[{b:r,k:p,relevance:0},{b:u,rB:!0,c:[l],relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,k:p,relevance:0,c:[e.CLCM,e.CBCM,s,n,c,{b:/\\(/,e:/\\)/,k:p,relevance:0,c:[\"self\",e.CLCM,e.CBCM,s,n,c]}]},c,e.CLCM,e.CBCM,o]};return{aliases:[\"c\",\"cc\",\"h\",\"c++\",\"h++\",\"hpp\",\"hh\",\"hxx\",\"cxx\"],k:p,i:\"</\",c:[].concat(d,b,m,[o,{b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:p,c:[\"self\",c]},{b:e.IR+\"::\",k:p},{cN:\"class\",bK:\"class struct\",e:/[{;:]/,c:[{b:/</,e:/>/,c:[\"self\"]},e.TM]}]),exports:{preprocessor:o,strings:s,k:p}}});hljs.registerLanguage(\"arduino\",function(e){var t=\"boolean byte word String\",r=\"setup loopKeyboardController MouseController SoftwareSerial EthernetServer EthernetClient LiquidCrystal RobotControl GSMVoiceCall EthernetUDP EsploraTFT HttpClient RobotMotor WiFiClient GSMScanner FileSystem Scheduler GSMServer YunClient YunServer IPAddress GSMClient GSMModem Keyboard Ethernet Console GSMBand Esplora Stepper Process WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage Client Server GSMPIN FileIO Bridge Serial EEPROM Stream Mouse Audio Servo File Task GPRS WiFi Wire TFT GSM SPI SD runShellCommandAsynchronously analogWriteResolution retrieveCallingNumber printFirmwareVersion analogReadResolution sendDigitalPortPair noListenOnLocalhost readJoystickButton setFirmwareVersion readJoystickSwitch scrollDisplayRight getVoiceCallStatus scrollDisplayLeft writeMicroseconds delayMicroseconds beginTransmission getSignalStrength runAsynchronously getAsynchronously listenOnLocalhost getCurrentCarrier readAccelerometer messageAvailable sendDigitalPorts lineFollowConfig countryNameWrite runShellCommand readStringUntil rewindDirectory readTemperature setClockDivider readLightSensor endTransmission analogReference detachInterrupt countryNameRead attachInterrupt encryptionType readBytesUntil robotNameWrite readMicrophone robotNameRead cityNameWrite userNameWrite readJoystickY readJoystickX mouseReleased openNextFile scanNetworks noInterrupts digitalWrite beginSpeaker mousePressed isActionDone mouseDragged displayLogos noAutoscroll addParameter remoteNumber getModifiers keyboardRead userNameRead waitContinue processInput parseCommand printVersion readNetworks writeMessage blinkVersion cityNameRead readMessage setDataMode parsePacket isListening setBitOrder beginPacket isDirectory motorsWrite drawCompass digitalRead clearScreen serialEvent rightToLeft setTextSize leftToRight requestFrom keyReleased compassRead analogWrite interrupts WiFiServer disconnect playMelody parseFloat autoscroll getPINUsed setPINUsed setTimeout sendAnalog readSlider analogRead beginWrite createChar motorsStop keyPressed tempoWrite readButton subnetMask debugPrint macAddress writeGreen randomSeed attachGPRS readString sendString remotePort releaseAll mouseMoved background getXChange getYChange answerCall getResult voiceCall endPacket constrain getSocket writeJSON getButton available connected findUntil readBytes exitValue readGreen writeBlue startLoop IPAddress isPressed sendSysex pauseMode gatewayIP setCursor getOemKey tuneWrite noDisplay loadImage switchPIN onRequest onReceive changePIN playFile noBuffer parseInt overflow checkPIN knobRead beginTFT bitClear updateIR bitWrite position writeRGB highByte writeRed setSpeed readBlue noStroke remoteIP transfer shutdown hangCall beginSMS endWrite attached maintain noCursor checkReg checkPUK shiftOut isValid shiftIn pulseIn connect println localIP pinMode getIMEI display noBlink process getBand running beginSD drawBMP lowByte setBand release bitRead prepare pointTo readRed setMode noFill remove listen stroke detach attach noTone exists buffer height bitSet circle config cursor random IRread setDNS endSMS getKey micros millis begin print write ready flush width isPIN blink clear press mkdir rmdir close point yield image BSSID click delay read text move peek beep rect line open seek fill size turn stop home find step tone sqrt RSSI SSID end bit tan cos sin pow map abs max min get run put\",i=\"DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL DEFAULT OUTPUT INPUT HIGH LOW\",o=e.requireLanguage(\"cpp\").rawDefinition(),a=o.k;return a.keyword+=\" \"+t,a.literal+=\" \"+i,a.built_in+=\" \"+r,o});hljs.registerLanguage(\"nginx\",function(e){var r={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+e.UIR}]},b={eW:!0,l:\"[a-z/_]+\",k:{literal:\"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll\"},relevance:0,i:\"=>\",c:[e.HCM,{cN:\"string\",c:[e.BE,r],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{b:\"([a-z]+):/\",e:\"\\\\s\",eW:!0,eE:!0,c:[r]},{cN:\"regexp\",c:[e.BE,r],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:!0},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:!0},{b:\"\\\\*(\\\\.[a-z\\\\-]+)+\"},{b:\"([a-z\\\\-]+\\\\.)+\\\\*\"}]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b\"},{cN:\"number\",b:\"\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b\",relevance:0},r]};return{aliases:[\"nginxconf\"],c:[e.HCM,{b:e.UIR+\"\\\\s+{\",rB:!0,e:\"{\",c:[{cN:\"section\",b:e.UIR}],relevance:0},{b:e.UIR+\"\\\\s\",e:\";|{\",rB:!0,c:[{cN:\"attribute\",b:e.UIR,starts:b}],relevance:0}],i:\"[^\\\\s\\\\}]\"}});hljs.registerLanguage(\"xml\",function(e){var c={cN:\"symbol\",b:\"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;\"},s={b:\"\\\\s\",c:[{cN:\"meta-keyword\",b:\"#?[a-z_][a-z1-9_-]+\",i:\"\\\\n\"}]},a=e.inherit(s,{b:\"\\\\(\",e:\"\\\\)\"}),t=e.inherit(e.ASM,{cN:\"meta-string\"}),l=e.inherit(e.QSM,{cN:\"meta-string\"}),r={eW:!0,i:/</,relevance:0,c:[{cN:\"attr\",b:\"[A-Za-z0-9\\\\._:-]+\",relevance:0},{b:/=\\s*/,relevance:0,c:[{cN:\"string\",endsParent:!0,v:[{b:/\"/,e:/\"/,c:[c]},{b:/'/,e:/'/,c:[c]},{b:/[^\\s\"'=<>`]+/}]}]}]};return{aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xjb\",\"xsd\",\"xsl\",\"plist\",\"wsf\",\"svg\"],cI:!0,c:[{cN:\"meta\",b:\"<![a-z]\",e:\">\",relevance:10,c:[s,l,t,a,{b:\"\\\\[\",e:\"\\\\]\",c:[{cN:\"meta\",b:\"<![a-z]\",e:\">\",c:[s,a,l,t]}]}]},e.C(\"\\x3c!--\",\"--\\x3e\",{relevance:10}),{b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",relevance:10},c,{cN:\"meta\",b:/<\\?xml/,e:/\\?>/,relevance:10},{b:/<\\?(php)?/,e:/\\?>/,sL:\"php\",c:[{b:\"/\\\\*\",e:\"\\\\*/\",skip:!0},{b:'b\"',e:'\"',skip:!0},{b:\"b'\",e:\"'\",skip:!0},e.inherit(e.ASM,{i:null,cN:null,c:null,skip:!0}),e.inherit(e.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:\"tag\",b:\"<style(?=\\\\s|>)\",e:\">\",k:{name:\"style\"},c:[r],starts:{e:\"</style>\",rE:!0,sL:[\"css\",\"xml\"]}},{cN:\"tag\",b:\"<script(?=\\\\s|>)\",e:\">\",k:{name:\"script\"},c:[r],starts:{e:\"<\\/script>\",rE:!0,sL:[\"actionscript\",\"javascript\",\"handlebars\",\"xml\"]}},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"name\",b:/[^\\/><\\s]+/,relevance:0},r]}]}});hljs.registerLanguage(\"markdown\",function(e){return{aliases:[\"md\",\"mkdown\",\"mkd\"],c:[{cN:\"section\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",relevance:0},{cN:\"bullet\",b:\"^\\\\s*([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",relevance:0}]},{cN:\"quote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"^```\\\\w*\\\\s*$\",e:\"^```[ ]*$\"},{b:\"`.+?`\"},{b:\"^( {4}|\\\\t)\",e:\"$\",relevance:0}]},{b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].*?[\\\\)\\\\]]\",rB:!0,c:[{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,rE:!0,relevance:0},{cN:\"link\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:!0,eE:!0},{cN:\"symbol\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:!0,eE:!0}],relevance:10},{b:/^\\[[^\\n]+\\]:/,rB:!0,c:[{cN:\"symbol\",b:/\\[/,e:/\\]/,eB:!0,eE:!0},{cN:\"link\",b:/:\\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage(\"properties\",function(e){var r=\"[ \\\\t\\\\f]*\",t=\"(\"+r+\"[:=]\"+r+\"|[ \\\\t\\\\f]+)\",n=\"([^\\\\\\\\\\\\W:= \\\\t\\\\f\\\\n]|\\\\\\\\.)+\",a=\"([^\\\\\\\\:= \\\\t\\\\f\\\\n]|\\\\\\\\.)+\",c={e:t,relevance:0,starts:{cN:\"string\",e:/$/,relevance:0,c:[{b:\"\\\\\\\\\\\\n\"}]}};return{cI:!0,i:/\\S/,c:[e.C(\"^\\\\s*[!#]\",\"$\"),{b:n+t,rB:!0,c:[{cN:\"attr\",b:n,endsParent:!0,relevance:0}],starts:c},{b:a+t,rB:!0,relevance:0,c:[{cN:\"meta\",b:a,endsParent:!0,relevance:0}],starts:c},{cN:\"attr\",relevance:0,b:a+r+\"$\"}]}});hljs.registerLanguage(\"bash\",function(e){var t={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},a={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,t,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[e.BE]}]};return{aliases:[\"sh\",\"zsh\"],l:/\\b-?[a-z\\._]+\\b/,k:{keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\",_:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"meta\",b:/^#![^\\n]+sh\\s*$/,relevance:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:!0,c:[e.inherit(e.TM,{b:/\\w[\\w\\d_]*/})],relevance:0},e.HCM,a,{cN:\"\",b:/\\\\\"/},{cN:\"string\",b:/'/,e:/'/},t]}});hljs.registerLanguage(\"dockerfile\",function(e){return{aliases:[\"docker\"],cI:!0,k:\"from maintainer expose env arg user onbuild stopsignal\",c:[e.HCM,e.ASM,e.QSM,e.NM,{bK:\"run cmd entrypoint volume add copy workdir label healthcheck shell\",starts:{e:/[^\\\\]$/,sL:\"bash\"}}],i:\"</\"}});hljs.registerLanguage(\"python\",function(e){var r={keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10\",built_in:\"Ellipsis NotImplemented\",literal:\"False None True\"},b={cN:\"meta\",b:/^(>>>|\\.\\.\\.) /},c={cN:\"subst\",b:/\\{/,e:/\\}/,k:r,i:/#/},a={b:/\\{\\{/,relevance:0},l={cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[e.BE,b],relevance:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[e.BE,b],relevance:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[e.BE,b,a,c]},{b:/(fr|rf|f)\"\"\"/,e:/\"\"\"/,c:[e.BE,b,a,c]},{b:/(u|r|ur)'/,e:/'/,relevance:10},{b:/(u|r|ur)\"/,e:/\"/,relevance:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},{b:/(fr|rf|f)'/,e:/'/,c:[e.BE,a,c]},{b:/(fr|rf|f)\"/,e:/\"/,c:[e.BE,a,c]},e.ASM,e.QSM]},n={cN:\"number\",relevance:0,v:[{b:e.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:e.CNR+\"[lLjJ]?\"}]},i={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",b,n,l,e.HCM]};return c.c=[l,n,b],{aliases:[\"py\",\"gyp\",\"ipython\"],k:r,i:/(<\\/|->|\\?)|=>/,c:[b,n,{bK:\"if\",relevance:0},l,e.HCM,{v:[{cN:\"function\",bK:\"def\"},{cN:\"class\",bK:\"class\"}],e:/:/,i:/[${=;\\n,]/,c:[e.UTM,i,{b:/->/,eW:!0,k:\"None\"}]},{cN:\"meta\",b:/^[\\t ]*@/,e:/$/},{b:/\\b(print|exec)\\(/}]}});hljs.registerLanguage(\"ini\",function(e){var b={cN:\"number\",relevance:0,v:[{b:/([\\+\\-]+)?[\\d]+_[\\d_]+/},{b:e.NR}]},a=e.C();a.v=[{b:/;/,e:/$/},{b:/#/,e:/$/}];var c={cN:\"variable\",v:[{b:/\\$[\\w\\d\"][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},r={cN:\"literal\",b:/\\bon|off|true|false|yes|no\\b/},n={cN:\"string\",c:[e.BE],v:[{b:\"'''\",e:\"'''\",relevance:10},{b:'\"\"\"',e:'\"\"\"',relevance:10},{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]};return{aliases:[\"toml\"],cI:!0,i:/\\S/,c:[a,{cN:\"section\",b:/\\[+/,e:/\\]+/},{b:/^[a-z0-9\\[\\]_\\.-]+(?=\\s*=\\s*)/,cN:\"attr\",starts:{e:/$/,c:[a,{b:/\\[/,e:/\\]/,c:[a,r,c,n,b,\"self\"],relevance:0},r,c,n,b]}}]}});hljs.registerLanguage(\"diff\",function(e){return{aliases:[\"patch\"],c:[{cN:\"meta\",relevance:10,v:[{b:/^@@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +@@$/},{b:/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},{b:/^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}]},{cN:\"comment\",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\\-{3}/,e:/$/},{b:/^\\*{3} /,e:/$/},{b:/^\\+{3}/,e:/$/},{b:/^\\*{15}$/}]},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"addition\",b:\"^\\\\!\",e:\"$\"}]}});hljs.registerLanguage(\"http\",function(e){var t=\"HTTP/[0-9\\\\.]+\";return{aliases:[\"https\"],i:\"\\\\S\",c:[{b:\"^\"+t,e:\"$\",c:[{cN:\"number\",b:\"\\\\b\\\\d{3}\\\\b\"}]},{b:\"^[A-Z]+ (.*?) \"+t+\"$\",rB:!0,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:!0,eE:!0},{b:t},{cN:\"keyword\",b:\"[A-Z]+\"}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:!0,i:\"\\\\n|\\\\s|=\",starts:{e:\"$\",relevance:0}},{b:\"\\\\n\\\\n\",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage(\"sql\",function(e){var t=e.C(\"--\",\"$\");return{cI:!0,i:/[<>{}*]/,c:[{bK:\"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with\",e:/;/,eW:!0,l:/[\\w\\.]+/,k:{keyword:\"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek\",literal:\"true false null unknown\",built_in:\"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\"},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage(\"vala\",function(e){return{k:{keyword:\"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override virtual delegate if while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var\",built_in:\"DBus GLib CCode Gee Object Gtk Posix\",literal:\"false true null\"},c:[{cN:\"class\",bK:\"class interface namespace\",e:\"{\",eE:!0,i:\"[^,:\\\\n\\\\s\\\\.]\",c:[e.UTM]},e.CLCM,e.CBCM,{cN:\"string\",b:'\"\"\"',e:'\"\"\"',relevance:5},e.ASM,e.QSM,e.CNM,{cN:\"meta\",b:\"^#\",e:\"$\",relevance:2}]}});hljs.registerLanguage(\"asciidoc\",function(e){return{aliases:[\"adoc\"],c:[e.C(\"^/{4,}\\\\n\",\"\\\\n/{4,}$\",{relevance:10}),e.C(\"^//\",\"$\",{relevance:0}),{cN:\"title\",b:\"^\\\\.\\\\w.*$\"},{b:\"^[=\\\\*]{4,}\\\\n\",e:\"\\\\n^[=\\\\*]{4,}$\",relevance:10},{cN:\"section\",relevance:10,v:[{b:\"^(={1,5}) .+?( \\\\1)?$\"},{b:\"^[^\\\\[\\\\]\\\\n]+?\\\\n[=\\\\-~\\\\^\\\\+]{2,}$\"}]},{cN:\"meta\",b:\"^:.+?:\",e:\"\\\\s\",eE:!0,relevance:10},{cN:\"meta\",b:\"^\\\\[.+?\\\\]$\",relevance:0},{cN:\"quote\",b:\"^_{4,}\\\\n\",e:\"\\\\n_{4,}$\",relevance:10},{cN:\"code\",b:\"^[\\\\-\\\\.]{4,}\\\\n\",e:\"\\\\n[\\\\-\\\\.]{4,}$\",relevance:10},{b:\"^\\\\+{4,}\\\\n\",e:\"\\\\n\\\\+{4,}$\",c:[{b:\"<\",e:\">\",sL:\"xml\",relevance:0}],relevance:10},{cN:\"bullet\",b:\"^(\\\\*+|\\\\-+|\\\\.+|[^\\\\n]+?::)\\\\s+\"},{cN:\"symbol\",b:\"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\\\s+\",relevance:10},{cN:\"strong\",b:\"\\\\B\\\\*(?![\\\\*\\\\s])\",e:\"(\\\\n{2}|\\\\*)\",c:[{b:\"\\\\\\\\*\\\\w\",relevance:0}]},{cN:\"emphasis\",b:\"\\\\B'(?!['\\\\s])\",e:\"(\\\\n{2}|')\",c:[{b:\"\\\\\\\\'\\\\w\",relevance:0}],relevance:0},{cN:\"emphasis\",b:\"_(?![_\\\\s])\",e:\"(\\\\n{2}|_)\",relevance:0},{cN:\"string\",v:[{b:\"``.+?''\"},{b:\"`.+?'\"}]},{cN:\"code\",b:\"(`.+?`|\\\\+.+?\\\\+)\",relevance:0},{cN:\"code\",b:\"^[ \\\\t]\",e:\"$\",relevance:0},{b:\"^'{3,}[ \\\\t]*$\",relevance:10},{b:\"(link:)?(http|https|ftp|file|irc|image:?):\\\\S+\\\\[.*?\\\\]\",rB:!0,c:[{b:\"(link|image:?):\",relevance:0},{cN:\"link\",b:\"\\\\w\",e:\"[^\\\\[]+\",relevance:0},{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,eE:!0,relevance:0}],relevance:10}]}});hljs.registerLanguage(\"json\",function(e){var i={literal:\"true false null\"},n=[e.CLCM,e.CBCM],c=[e.QSM,e.CNM],r={e:\",\",eW:!0,eE:!0,c:c,k:i},t={b:\"{\",e:\"}\",c:[{cN:\"attr\",b:/\"/,e:/\"/,c:[e.BE],i:\"\\\\n\"},e.inherit(r,{b:/:/})].concat(n),i:\"\\\\S\"},a={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(r)],i:\"\\\\S\"};return c.push(t,a),n.forEach(function(e){c.push(e)}),{c:c,k:i,i:\"\\\\S\"}});hljs.registerLanguage(\"rust\",function(e){var t=\"([ui](8|16|32|64|128|size)|f(32|64))?\",r=\"drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!\";return{aliases:[\"rs\"],k:{keyword:\"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield\",literal:\"true false Some None Ok Err\",built_in:r},l:e.IR+\"!?\",i:\"</\",c:[e.CLCM,e.C(\"/\\\\*\",\"\\\\*/\",{c:[\"self\"]}),e.inherit(e.QSM,{b:/b?\"/,i:null}),{cN:\"string\",v:[{b:/r(#*)\"(.|\\n)*?\"\\1(?!#)/},{b:/b?'\\\\?(x\\w{2}|u\\w{4}|U\\w{8}|.)'/}]},{cN:\"symbol\",b:/'[a-zA-Z_][a-zA-Z0-9_]*/},{cN:\"number\",v:[{b:\"\\\\b0b([01_]+)\"+t},{b:\"\\\\b0o([0-7_]+)\"+t},{b:\"\\\\b0x([A-Fa-f0-9_]+)\"+t},{b:\"\\\\b(\\\\d[\\\\d_]*(\\\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)\"+t}],relevance:0},{cN:\"function\",bK:\"fn\",e:\"(\\\\(|<)\",eE:!0,c:[e.UTM]},{cN:\"meta\",b:\"#\\\\!?\\\\[\",e:\"\\\\]\",c:[{cN:\"meta-string\",b:/\"/,e:/\"/}]},{cN:\"class\",bK:\"type\",e:\";\",c:[e.inherit(e.UTM,{endsParent:!0})],i:\"\\\\S\"},{cN:\"class\",bK:\"trait enum struct union\",e:\"{\",c:[e.inherit(e.UTM,{endsParent:!0})],i:\"[\\\\w\\\\d]\"},{b:e.IR+\"::\",k:{built_in:r}},{b:\"->\"}]}});hljs.registerLanguage(\"awk\",function(e){return{k:{keyword:\"BEGIN END if else while do for in break continue delete next nextfile function func exit|10\"},c:[{cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},{cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,relevance:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,relevance:10},{b:/(u|r|ur)'/,e:/'/,relevance:10},{b:/(u|r|ur)\"/,e:/\"/,relevance:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},e.ASM,e.QSM]},e.RM,e.HCM,e.NM]}});hljs.registerLanguage(\"java\",function(e){var a=\"false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do\",t={cN:\"number\",b:\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",relevance:0};return{aliases:[\"jsp\"],k:a,i:/<\\/|#/,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{b:/\\w+@/,relevance:0},{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:\"class\",bK:\"class interface\",e:/[{;=]/,eE:!0,k:\"class interface\",i:/[:\"\\[\\]]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"new throw return else\",relevance:0},{cN:\"function\",b:\"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\\\s*,\\\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\\\s+)+\"+e.UIR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,relevance:0,c:[e.UTM]},{cN:\"params\",b:/\\(/,e:/\\)/,k:a,relevance:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},t,{cN:\"meta\",b:\"@[A-Za-z]+\"}]}});hljs.registerLanguage(\"cs\",function(e){var a={keyword:\"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield\",literal:\"null false true\"},i={cN:\"number\",v:[{b:\"\\\\b(0b[01']+)\"},{b:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)(u|U|l|L|ul|UL|f|F|b|B)\"},{b:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"}],relevance:0},c={cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},r=e.inherit(c,{i:/\\n/}),n={cN:\"subst\",b:\"{\",e:\"}\",k:a},t=e.inherit(n,{i:/\\n/}),s={cN:\"string\",b:/\\$\"/,e:'\"',i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},e.BE,t]},l={cN:\"string\",b:/\\$@\"/,e:'\"',c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},n]},b=e.inherit(l,{i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},t]});n.c=[l,s,c,e.ASM,e.QSM,i,e.CBCM],t.c=[b,s,r,e.ASM,e.QSM,i,e.inherit(e.CBCM,{i:/\\n/})];var o={v:[l,s,c,e.ASM,e.QSM]},d=e.IR+\"(<\"+e.IR+\"(\\\\s*,\\\\s*\"+e.IR+\")*>)?(\\\\[\\\\])?\";return{aliases:[\"csharp\",\"c#\"],k:a,i:/::/,c:[e.C(\"///\",\"$\",{rB:!0,c:[{cN:\"doctag\",v:[{b:\"///\",relevance:0},{b:\"\\x3c!--|--\\x3e\"},{b:\"</?\",e:\">\"}]}]}),e.CLCM,e.CBCM,{cN:\"meta\",b:\"#\",e:\"$\",k:{\"meta-keyword\":\"if else elif endif define undef warning error line region endregion pragma checksum\"}},o,i,{bK:\"class interface\",e:/[{;=]/,i:/[^\\s:,]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:\"namespace\",e:/[{;=]/,i:/[^\\s:]/,c:[e.inherit(e.TM,{b:\"[a-zA-Z](\\\\.?\\\\w)*\"}),e.CLCM,e.CBCM]},{cN:\"meta\",b:\"^\\\\s*\\\\[\",eB:!0,e:\"\\\\]\",eE:!0,c:[{cN:\"meta-string\",b:/\"/,e:/\"/}]},{bK:\"new return throw await else\",relevance:0},{cN:\"function\",b:\"(\"+d+\"\\\\s+)+\"+e.IR+\"\\\\s*\\\\(\",rB:!0,e:/\\s*[{;=]/,eE:!0,k:a,c:[{b:e.IR+\"\\\\s*\\\\(\",rB:!0,c:[e.TM],relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:a,relevance:0,c:[o,i,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage(\"mathematica\",function(e){return{aliases:[\"mma\",\"wl\"],l:\"(\\\\$|\\\\b)\"+e.IR+\"\\\\b\",k:\"AASTriangle AbelianGroup Abort AbortKernels AbortProtect AbortScheduledTask Above Abs AbsArg AbsArgPlot Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AcceptanceThreshold AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Activate Active ActiveClassification ActiveClassificationObject ActiveItem ActivePrediction ActivePredictionObject ActiveStyle AcyclicGraphQ AddOnHelpPath AddSides AddTo AddToSearchIndex AddUsers AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AdministrativeDivisionData AffineHalfSpace AffineSpace AffineStateSpaceModel AffineTransform After AggregatedEntityClass AggregationLayer AircraftData AirportData AirPressureData AirTemperatureData AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowAdultContent AllowedCloudExtraParameters AllowedCloudParameterExtensions AllowedDimensions AllowedFrequencyRange AllowedHeads AllowGroupClose AllowIncomplete AllowInlineCells AllowKernelInitialization AllowLooseGrammar AllowReverseGroupClose AllowScriptLevelChange AllTrue Alphabet AlphabeticOrder AlphabeticSort AlphaChannel AlternateImage AlternatingFactorial AlternatingGroup AlternativeHypothesis Alternatives AltitudeMethod AmbientLight AmbiguityFunction AmbiguityList Analytic AnatomyData AnatomyForm AnatomyPlot3D AnatomySkinStyle AnatomyStyling AnchoredSearch And AndersonDarlingTest AngerJ AngleBisector AngleBracket AnglePath AnglePath3D AngleVector AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning AnimationRunTime AnimationTimeIndex Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotate Annotation AnnotationDelete AnnotationNames AnnotationRules AnnotationValue Annuity AnnuityDue Annulus AnomalyDetection AnomalyDetectorFunction Anonymous Antialiasing AntihermitianMatrixQ Antisymmetric AntisymmetricMatrixQ Antonyms AnyOrder AnySubset AnyTrue Apart ApartSquareFree APIFunction Appearance AppearanceElements AppearanceRules AppellF1 Append AppendCheck AppendLayer AppendTo ApplicationIdentificationKey Apply ApplySides ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcCurvature ARCHProcess ArcLength ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Area Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess Around AroundReplace ARProcess Array ArrayComponents ArrayDepth ArrayFilter ArrayFlatten ArrayMesh ArrayPad ArrayPlot ArrayQ ArrayResample ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads ASATriangle Ask AskAppend AskConfirm AskDisplay AskedQ AskedValue AskFunction AskState AskTemplateDisplay AspectRatio AspectRatioFixed Assert AssociateTo Association AssociationFormat AssociationMap AssociationQ AssociationThread AssumeDeterministic Assuming Assumptions AstronomicalData AsymptoticDSolveValue AsymptoticEqual AsymptoticEquivalent AsymptoticGreater AsymptoticGreaterEqual AsymptoticIntegrate AsymptoticLess AsymptoticLessEqual AsymptoticOutputTracker AsymptoticRSolveValue AsymptoticSolve AsymptoticSum Asynchronous AsynchronousTaskObject AsynchronousTasks Atom AtomCoordinates AtomCount AtomDiagramCoordinates AtomList AtomQ AttentionLayer Attributes Audio AudioAmplify AudioAnnotate AudioAnnotationLookup AudioBlockMap AudioCapture AudioChannelAssignment AudioChannelCombine AudioChannelMix AudioChannels AudioChannelSeparate AudioData AudioDelay AudioDelete AudioDevice AudioDistance AudioFade AudioFrequencyShift AudioGenerator AudioIdentify AudioInputDevice AudioInsert AudioIntervals AudioJoin AudioLabel AudioLength AudioLocalMeasurements AudioLooping AudioLoudness AudioMeasurements AudioNormalize AudioOutputDevice AudioOverlay AudioPad AudioPan AudioPartition AudioPause AudioPitchShift AudioPlay AudioPlot AudioQ AudioRecord AudioReplace AudioResample AudioReverb AudioSampleRate AudioSpectralMap AudioSpectralTransformation AudioSplit AudioStop AudioStream AudioStreams AudioTimeStretch AudioTrim AudioType AugmentedPolyhedron AugmentedSymmetricPolynomial Authenticate Authentication AuthenticationDialog AutoAction Autocomplete AutocompletionFunction AutoCopy AutocorrelationTest AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutoQuoteCharacters AutoRefreshed AutoRemove AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords AutoSubmitting Axes AxesEdge AxesLabel AxesOrigin AxesStyle AxiomaticTheory AxisBabyMonsterGroupB Back Background BackgroundAppearance BackgroundTasksSettings Backslash Backsubstitution Backward Ball Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarcodeImage BarcodeRecognize BaringhausHenzeTest BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseDecode BaseEncode BaseForm Baseline BaselinePosition BaseStyle BasicRecurrentLayer BatchNormalizationLayer BatchSize BatesDistribution BattleLemarieWavelet BayesianMaximization BayesianMaximizationObject BayesianMinimization BayesianMinimizationObject Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized Between BetweennessCentrality BeveledPolyhedron BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryDeserialize BinaryDistance BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinarySerialize BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BiquadraticFilterModel BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor BiweightLocation BiweightMidvariance Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockchainAddressData BlockchainBase BlockchainBlockData BlockchainContractValue BlockchainData BlockchainGet BlockchainKeyEncode BlockchainPut BlockchainTokenData BlockchainTransaction BlockchainTransactionData BlockchainTransactionSign BlockchainTransactionSubmit BlockMap BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bond BondCount BondList BondQ Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms BooleanQ BooleanRegion Booleans BooleanStrings BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryDiscretizeGraphics BoundaryDiscretizeRegion BoundaryMesh BoundaryMeshRegion BoundaryMeshRegionQ BoundaryStyle BoundedRegionQ BoundingRegion Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxObject BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break BridgeData BrightnessEqualize BroadcastStationData Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurve3DBoxOptions BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BSplineSurface3DBoxOptions BubbleChart BubbleChart3D BubbleScale BubbleSizes BuildingData BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteArray ByteArrayFormat ByteArrayQ ByteArrayToString ByteCount ByteOrderingC CachedValue CacheGraphics CachePersistence CalendarConvert CalendarData CalendarType Callout CalloutMarker CalloutStyle CallPacket CanberraDistance Cancel CancelButton CandlestickChart CanonicalGraph CanonicalizePolygon CanonicalizePolyhedron CanonicalName CanonicalWarpingCorrespondence CanonicalWarpingDistance CantorMesh CantorStaircase Cap CapForm CapitalDifferentialD Capitalize CapsuleShape CaptureRunning CardinalBSplineBasis CarlemanLinearize CarmichaelLambda CaseOrdering Cases CaseSensitive Cashflow Casoratian Catalan CatalanNumber Catch Catenate CatenateLayer CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling CelestialSystem Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEvaluationLanguage CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellLabelStyle CellLabelTemplate CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterArray CenterDot CentralFeature CentralMoment CentralMomentGeneratingFunction Cepstrogram CepstrogramArray CepstrumArray CForm ChampernowneNumber ChangeOptions ChannelBase ChannelBrokerAction ChannelDatabin ChannelHistoryLength ChannelListen ChannelListener ChannelListeners ChannelListenerWait ChannelObject ChannelPreSendFunction ChannelReceiverFunction ChannelSend ChannelSubscribers ChanVeseBinarize Character CharacterCounts CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterName CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop ChromaticityPlot ChromaticityPlot3D ChromaticPolynomial Circle CircleBox CircleDot CircleMinus CirclePlus CirclePoints CircleThrough CircleTimes CirculantGraph CircularOrthogonalMatrixDistribution CircularQuaternionMatrixDistribution CircularRealMatrixDistribution CircularSymplecticMatrixDistribution CircularUnitaryMatrixDistribution Circumsphere CityData ClassifierFunction ClassifierInformation ClassifierMeasurements ClassifierMeasurementsObject Classify ClassPriors Clear ClearAll ClearAttributes ClearCookies ClearPermissions ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipPlanesStyle ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent CloudAccountData CloudBase CloudConnect CloudDeploy CloudDirectory CloudDisconnect CloudEvaluate CloudExport CloudExpression CloudExpressions CloudFunction CloudGet CloudImport CloudLoggingData CloudObject CloudObjectInformation CloudObjectInformationData CloudObjectNameFormat CloudObjects CloudObjectURLType CloudPublish CloudPut CloudRenderingMethod CloudSave CloudShare CloudSubmit CloudSymbol CloudUnshare ClusterClassify ClusterDissimilarityFunction ClusteringComponents ClusteringTree CMYKColor Coarse CodeAssistOptions Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorBalance ColorCombine ColorConvert ColorCoverage ColorData ColorDataFunction ColorDetect ColorDistance ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQ ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorsNear ColorSpace ColorToneMapping Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CombinedEntityClass CombinerFunction CometData CommonDefaultFormatTypes Commonest CommonestFilter CommonName CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompanyData CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledCodeFunction CompiledFunction CompilerOptions Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComplexListPlot ComplexPlot ComplexPlot3D ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries CompositeQ Composition CompoundElement CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData ComputeUncertainty Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath ConformAudio ConformImages Congruent ConicHullRegion ConicHullRegion3DBox ConicHullRegionBox ConicOptimization Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphComponents ConnectedGraphQ ConnectedMeshComponents ConnectedMoleculeComponents ConnectedMoleculeQ ConnectionSettings ConnectLibraryCallbackFunction ConnectSystemModelComponents ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray ConstantArrayLayer ConstantImage ConstantPlusLayer ConstantRegionQ Constants ConstantTimesLayer ConstellationData ConstrainedMax ConstrainedMin Construct Containing ContainsAll ContainsAny ContainsExactly ContainsNone ContainsOnly ContentFieldOptions ContentLocationFunction ContentObject ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTask ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean ContrastiveLossLayer Control ControlActive ControlAlignment ControlGroupContentsBox ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket ConvexHullMesh ConvexPolygonQ ConvexPolyhedronQ ConvolutionLayer Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CookieFunction Cookies CoordinateBoundingBox CoordinateBoundingBoxArray CoordinateBounds CoordinateBoundsArray CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDatabin CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CountDistinct CountDistinctBy CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Counts CountsBy Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateCellID CreateChannel CreateCloudExpression CreateDatabin CreateDataSystemModel CreateDialog CreateDirectory CreateDocument CreateFile CreateIntermediateDirectories CreateManagedLibraryExpression CreateNotebook CreatePalette CreatePalettePacket CreatePermissionsGroup CreateScheduledTask CreateSearchIndex CreateSystemModel CreateTemporary CreateUUID CreateWindow CriterionFunction CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossEntropyLossLayer CrossingCount CrossingDetect CrossingPolygon CrossMatrix Csc Csch CTCLossLayer Cube CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrencyConvert CurrentDate CurrentImage CurrentlySpeakingPacket CurrentNotebookImage CurrentScreenImage CurrentValue Curry CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecompositionD DagumDistribution DamData DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DatabaseConnect DatabaseDisconnect DatabaseReference Databin DatabinAdd DatabinRemove Databins DatabinUpload DataCompression DataDistribution DataRange DataReversed Dataset Date DateBounds Dated DateDelimiters DateDifference DatedUnit DateFormat DateFunction DateHistogram DateList DateListLogPlot DateListPlot DateListStepPlot DateObject DateObjectQ DateOverlapsQ DatePattern DatePlus DateRange DateReduction DateString DateTicksFormat DateValue DateWithinQ DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayHemisphere DaylightQ DayMatchQ DayName DayNightTerminator DayPlus DayRange DayRound DeBruijnGraph DeBruijnSequence Debug DebugTag Decapitalize Decimal DecimalForm DeclareKnownSymbols DeclarePackage Decompose DeconvolutionLayer Decrement Decrypt DecryptFile DedekindEta DeepSpaceProbeData Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultPrintPrecision DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValue DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod DefineResourceFunction Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic DEigensystem DEigenvalues Deinitialization Del DelaunayMesh Delayed Deletable Delete DeleteAnomalies DeleteBorderComponents DeleteCases DeleteChannel DeleteCloudExpression DeleteContents DeleteDirectory DeleteDuplicates DeleteDuplicatesBy DeleteFile DeleteMissing DeleteObject DeletePermissionsKey DeleteSearchIndex DeleteSmallComponents DeleteStopwords DeleteWithContents DeletionWarning DelimitedArray DelimitedSequence Delimiter DelimiterFlashTime DelimiterMatching Delimiters DeliveryFunction Dendrogram Denominator DensityGraphics DensityHistogram DensityPlot DensityPlot3D DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DerivedKey DescriptorStateSpace DesignMatrix DestroyAfterEvaluation Det DeviceClose DeviceConfigure DeviceExecute DeviceExecuteAsynchronous DeviceObject DeviceOpen DeviceOpenQ DeviceRead DeviceReadBuffer DeviceReadLatest DeviceReadList DeviceReadTimeSeries Devices DeviceStreams DeviceWrite DeviceWriteBuffer DGaussianWavelet DiacriticalPositioning Diagonal DiagonalizableMatrixQ DiagonalMatrix DiagonalMatrixQ Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DictionaryWordQ DifferenceDelta DifferenceOrder DifferenceQuotient DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitalSignature DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralAngle DihedralGroup Dilation DimensionalCombinations DimensionalMeshComponents DimensionReduce DimensionReducerFunction DimensionReduction Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletBeta DirichletCharacter DirichletCondition DirichletConvolve DirichletDistribution DirichletEta DirichletL DirichletLambda DirichletTransform DirichletWindow DisableConsolePrintPacket DisableFormatting DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLimit DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscreteMaxLimit DiscreteMinLimit DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform DiscretizeGraphics DiscretizeRegion Discriminant DisjointQ Disjunction Disk DiskBox DiskMatrix DiskSegment Dispatch DispatchQ DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceMatrix DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers DivideSides Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentGenerator DocumentGeneratorInformation DocumentGeneratorInformationData DocumentGenerators DocumentNotebook DocumentWeightingRules Dodecahedron DomainRegistrationInformation DominantColors DOSTextFormat Dot DotDashed DotEqual DotLayer DotPlusLayer Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DropoutLayer DSolve DSolveValue Dt DualLinearProgramming DualPolyhedron DualSystemsModel DumpGet DumpSave DuplicateFreeQ Duration Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicGeoGraphics DynamicImage DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptionsE EarthImpactData EarthquakeData EccentricityCentrality Echo EchoFunction EclipseType EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeContract EdgeCost EdgeCount EdgeCoverQ EdgeCycleMatrix EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight EdgeWeightedGraphQ Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData ElementwiseLayer ElidedForms Eliminate EliminationOrder Ellipsoid EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmbedCode EmbeddedHTML EmbeddedService EmbeddingLayer EmbeddingObject EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EmptyRegion EnableConsolePrintPacket Enabled Encode Encrypt EncryptedObject EncryptFile End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfBuffer EndOfFile EndOfLine EndOfString EndPackage EngineEnvironment EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entity EntityClass EntityClassList EntityCopies EntityFunction EntityGroup EntityInstance EntityList EntityPrefetch EntityProperties EntityProperty EntityPropertyClass EntityRegister EntityStore EntityStores EntityTypeName EntityUnregister EntityValue Entropy EntropyFilter Environment Epilog EpilogFunction Equal EqualColumns EqualRows EqualTilde EqualTo EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EscapeRadius EstimatedBackground EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerAngles EulerCharacteristic EulerE EulerGamma EulerianGraphQ EulerMatrix EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluateScheduledTask EvaluationBox EvaluationCell EvaluationCompletionAction EvaluationData EvaluationElements EvaluationEnvironment EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels EventSeries ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludedLines ExcludedPhysicalQuantities ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog ExoplanetData Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi ExpirationDate Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportByteArray ExportForm ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpressionUUID ExpToTrig ExtendedEntityClass ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalBundle ExternalCall ExternalDataCharacterEncoding ExternalEvaluate ExternalFunction ExternalFunctionName ExternalObject ExternalOptions ExternalSessionObject ExternalSessions ExternalTypeSignature ExternalValue Extract ExtractArchive ExtractLayer ExtremeValueDistributionFaceForm FaceGrids FaceGridsStyle FacialFeatures Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail Failure FailureAction FailureDistribution FailureQ False FareySequence FARIMAProcess FeatureDistance FeatureExtract FeatureExtraction FeatureExtractor FeatureExtractorFunction FeatureNames FeatureNearest FeatureSpacePlot FeatureSpacePlot3D FeatureTypes FEDisableConsolePrintPacket FeedbackLinearize FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket FetalGrowthData Fibonacci Fibonorial FieldCompletionFunction FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileConvert FileDate FileExistsQ FileExtension FileFormat FileHandler FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameForms FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileSize FileSystemMap FileSystemScan FileTemplate FileTemplateApply FileType FilledCurve FilledCurveBox FilledCurveBoxOptions Filling FillingStyle FillingTransform FilteredEntityClass FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindAnomalies FindArgMax FindArgMin FindChannels FindClique FindClusters FindCookies FindCurvePath FindCycle FindDevices FindDistribution FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEdgeIndependentPaths FindEquationalProof FindEulerianCycle FindExternalEvaluators FindFaces FindFile FindFit FindFormula FindFundamentalCycles FindGeneratingFunction FindGeoLocation FindGeometricConjectures FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindHamiltonianPath FindHiddenMarkovStates FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMatchingColor FindMaximum FindMaximumFlow FindMaxValue FindMeshDefects FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindMoleculeSubstructure FindPath FindPeaks FindPermutation FindPostmanTour FindProcessParameters FindRepeat FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindSpanningTree FindSystemModelEquilibrium FindTextualAnswer FindThreshold FindTransientRepeat FindVertexCover FindVertexCut FindVertexIndependentPaths Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstCase FirstPassageTimeDistribution FirstPosition FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FitRegularization FittedModel FixedOrder FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlattenLayer FlatTopWindow FlipView Floor FlowPolynomial FlushPrintOutputPacket Fold FoldList FoldPair FoldPairList FollowRedirects Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FormControl FormFunction FormLayoutFunction FormObject FormPage FormTheme FormulaData FormulaLookup FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalGaussianNoiseProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameRate FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrenetSerretSystem FrequencySamplingFilterKernel FresnelC FresnelF FresnelG FresnelS Friday FrobeniusNumber FrobeniusSolve FromAbsoluteTime FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS FromEntity FromJulianDate FromLetterNumber FromPolarCoordinates FromRomanNumeral FromSphericalCoordinates FromUnixTime Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullInformationOutputRegulator FullOptions FullRegion FullSimplify Function FunctionCompile FunctionCompileExport FunctionCompileExportByteArray FunctionCompileExportLibrary FunctionCompileExportString FunctionDomain FunctionExpand FunctionInterpolation FunctionPeriod FunctionRange FunctionSpace FussellVeselyImportanceGaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins GalaxyData GalleryView Gamma GammaDistribution GammaRegularized GapPenalty GARCHProcess GatedRecurrentLayer Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianOrthogonalMatrixDistribution GaussianSymplecticMatrixDistribution GaussianUnitaryMatrixDistribution GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateAsymmetricKeyPair GenerateConditions GeneratedCell GeneratedDocumentBinding GenerateDerivedKey GenerateDigitalSignature GenerateDocument GeneratedParameters GeneratedQuantityMagnitudes GenerateHTTPResponse GenerateSecuredAuthenticationKey GenerateSymmetricKey GeneratingFunction GeneratorDescription GeneratorHistoryLength GeneratorOutputType Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeoAntipode GeoArea GeoArraySize GeoBackground GeoBoundingBox GeoBounds GeoBoundsRegion GeoBubbleChart GeoCenter GeoCircle GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDisk GeoDisplacement GeoDistance GeoDistanceList GeoElevationData GeoEntities GeoGraphics GeogravityModelData GeoGridDirectionDifference GeoGridLines GeoGridLinesStyle GeoGridPosition GeoGridRange GeoGridRangePadding GeoGridUnitArea GeoGridUnitDistance GeoGridVector GeoGroup GeoHemisphere GeoHemisphereBoundary GeoHistogram GeoIdentify GeoImage GeoLabels GeoLength GeoListPlot GeoLocation GeologicalPeriodData GeomagneticModelData GeoMarker GeometricAssertion GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricScene GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoModel GeoNearest GeoPath GeoPosition GeoPositionENU GeoPositionXYZ GeoProjection GeoProjectionData GeoRange GeoRangePadding GeoRegionValuePlot GeoResolution GeoScaleBar GeoServer GeoSmoothHistogram GeoStreamPlot GeoStyling GeoStylingImageFunction GeoVariant GeoVector GeoVectorENU GeoVectorPlot GeoVectorXYZ GeoVisibleRegion GeoVisibleRegionBoundary GeoWithinQ GeoZoomLevel GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenAngle GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter GrammarApply GrammarRules GrammarToken Graph Graph3D GraphAssortativity GraphAutomorphismGroup GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel Greater GreaterEqual GreaterEqualLess GreaterEqualThan GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterThan GreaterTilde Green GreenFunction Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupBy GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators Groupings GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain GroupTogetherGrouping GroupTogetherNestedGrouping GrowCutComponents Gudermannian GuidedFilter GumbelDistributionHaarWavelet HadamardMatrix HalfLine HalfNormalDistribution HalfPlane HalfSpace HamiltonianGraphQ HammingDistance HammingWindow HandlerFunctions HandlerFunctionsKeys HankelH1 HankelH2 HankelMatrix HankelTransform HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash Haversine HazardFunction Head HeadCompose HeaderLines Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings Here HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenMarkovProcess HiddenSurface Highlighted HighlightGraph HighlightImage HighlightMesh HighpassFilter HigmanSimsGroupHS HilbertCurve HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HistoricalPeriodData HitMissTransform HITSCentrality HjorthDistribution HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HostLookup HotellingTSquareDistribution HoytDistribution HTMLSave HTTPErrorResponse HTTPRedirect HTTPRequest HTTPRequestData HTTPResponse Hue HumanGrowthData HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyperplane Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestDataI IconData Iconize IconizedObject IconRules Icosahedron Identity IdentityMatrix If IgnoreCase IgnoreDiacritics IgnorePunctuation IgnoreSpellCheck IgnoringInactive Im Image Image3D Image3DProjection Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageApplyIndexed ImageAspectRatio ImageAssemble ImageAugmentationLayer ImageBoundingBoxes ImageCache ImageCacheValid ImageCapture ImageCaptureFunction ImageCases ImageChannels ImageClip ImageCollage ImageColorSpace ImageCompose ImageContainsQ ImageContents ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDisplacements ImageDistance ImageEffect ImageExposureCombine ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageFocusCombine ImageForestingComponents ImageFormattingWidth ImageForwardTransformation ImageGraphics ImageHistogram ImageIdentify ImageInstanceQ ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarker ImageMarkers ImageMeasurements ImageMesh ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImagePosition ImagePreviewFunction ImagePyramid ImagePyramidApply ImageQ ImageRangeCache ImageRecolor ImageReflect ImageRegion ImageResize ImageResolution ImageRestyle ImageRotate ImageRotated ImageSaliencyFilter ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions ImagingDevice ImplicitRegion Implies Import ImportAutoReplacements ImportByteArray ImportOptions ImportString ImprovementImportance In Inactivate Inactive IncidenceGraph IncidenceList IncidenceMatrix IncludeAromaticBonds IncludeConstantBasis IncludeDefinitions IncludeDirectories IncludeFileExtension IncludeGeneratorTasks IncludeHydrogens IncludeInflections IncludeMetaInformation IncludePods IncludeQuantities IncludeRelatedTables IncludeSingularTerm IncludeWindowTimes Increment IndefiniteMatrixQ Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentPhysicalQuantity IndependentUnit IndependentUnitDimension IndependentVertexSetQ Indeterminate IndeterminateThreshold IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers InfiniteLine InfinitePlane Infinity Infix InflationAdjust InflationMethod Information InformationData InformationDataGrid Inherited InheritScope InhomogeneousPoissonProcess InitialEvaluationHistory Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InitializationObjects InitializationValue Initialize InitialSeeding InlineCounterAssignments InlineCounterIncrements InlineRules Inner InnerPolygon InnerPolyhedron Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionFunction InsertionPointObject InsertLinebreaks InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Insphere Install InstallService InstanceNormalizationLayer InString Integer IntegerDigits IntegerExponent IntegerLength IntegerName IntegerPart IntegerPartitions IntegerQ IntegerReverse Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction Interpreter InterpretTemplate InterquartileRange Interrupt InterruptSettings IntersectingQ Intersection Interval IntervalIntersection IntervalMarkers IntervalMarkersStyle IntervalMemberQ IntervalSlider IntervalUnion Into Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHankelTransform InverseHaversine InverseImagePyramid InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InverseMellinTransform InversePermutation InverseRadon InverseRadonTransform InverseSeries InverseShortTimeFourier InverseSpectrogram InverseSurvivalFunction InverseTransformedRegion InverseWaveletTransform InverseWeierstrassP InverseWishartMatrixDistribution InverseZTransform Invisible InvisibleApplication InvisibleTimes IPAddress IrreduciblePolynomialQ IslandData IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemAspectRatio ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcessJaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join JoinAcross Joined JoinedCurve JoinedCurveBox JoinedCurveBoxOptions JoinForm JordanDecomposition JordanModelDecomposition JulianDate JuliaSetBoettcher JuliaSetIterationCount JuliaSetPlot JuliaSetPointsK KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KEdgeConnectedComponents KEdgeConnectedGraphQ KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelFunction KernelMixtureDistribution Kernels Ket Key KeyCollisionFunction KeyComplement KeyDrop KeyDropFrom KeyExistsQ KeyFreeQ KeyIntersection KeyMap KeyMemberQ KeypointStrength Keys KeySelect KeySort KeySortBy KeyTake KeyUnion KeyValueMap KeyValuePattern Khinchin KillProcess KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnapsackSolve KnightTourGraph KnotData KnownUnitQ KochCurve KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter KVertexConnectedComponents KVertexConnectedGraphQLABColor Label Labeled LabeledSlider LabelingFunction LabelingSize LabelStyle LabelVisibility LaguerreL LakeData LambdaComponents LambertW LaminaData LanczosWindow LandauDistribution Language LanguageCategory LanguageData LanguageIdentify LanguageOptions LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCHColor LCM LeaderSize LeafCount LeapYearQ LearnDistribution LearnedDistribution LearningRate LearningRateMultipliers LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessEqualThan LessFullEqual LessGreater LessLess LessSlantEqual LessThan LessTilde LetterCharacter LetterCounts LetterNumber LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryDataType LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox Line3DBoxOptions LinearFilter LinearFractionalOptimization LinearFractionalTransform LinearGradientImage LinearizingTransformationData LinearLayer LinearModelFit LinearOffsetFunction LinearOptimization LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBoxOptions LineBreak LinebreakAdjustments LineBreakChart LinebreakSemicolonWeighting LineBreakWithin LineColor LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRankCentrality LinkRead LinkReadHeld LinkReadyQ Links LinkService LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot ListDensityPlot3D Listen ListFormat ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListSliceContourPlot3D ListSliceDensityPlot3D ListSliceVectorPlot3D ListStepPlot ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalAdaptiveBinarize LocalCache LocalClusteringCoefficient LocalizeDefinitions LocalizeVariables LocalObject LocalObjects LocalResponseNormalizationLayer LocalSubmit LocalSymbol LocalTime LocalTimeZone LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogisticSigmoid LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongestOrderedSequence LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow LongShortTermMemoryLayer Lookup Loopback LoopFreeGraphQ LossFunction LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowerTriangularMatrixQ LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LunarEclipse LUVColor LyapunovSolve LyonsGroupLyMachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MailAddressValidation MailExecute MailFolder MailItem MailReceiverFunction MailResponseFunction MailSearch MailServerConnect MailServerConnection MailSettings MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules ManagedLibraryExpressionID ManagedLibraryExpressionQ MandelbrotSetBoettcher MandelbrotSetDistance MandelbrotSetIterationCount MandelbrotSetMemberQ MandelbrotSetPlot MangoldtLambda ManhattanDistance Manipulate Manipulator MannedSpaceMissionData MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarchenkoPasturDistribution MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicalFunctionData MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixNormalDistribution MatrixPlot MatrixPower MatrixPropertyDistribution MatrixQ MatrixRank MatrixTDistribution Max MaxBend MaxCellMeasure MaxColorDistance MaxDetect MaxDuration MaxExtraBandwidths MaxExtraConditions MaxFeatureDisplacement MaxFeatures MaxFilter MaximalBy Maximize MaxItems MaxIterations MaxLimit MaxMemoryUsed MaxMixtureKernels MaxOverlapFraction MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxTrainingRounds MaxValue MaxwellDistribution MaxWordGap McLaughlinGroupMcL Mean MeanAbsoluteLossLayer MeanAround MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter MeanSquaredLossLayer Median MedianDeviation MedianFilter MedicalTestData Medium MeijerG MeijerGReduce MeixnerDistribution MellinConvolve MellinTransform MemberQ MemoryAvailable MemoryConstrained MemoryConstraint MemoryInUse MengerMesh Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuList MenuPacket MenuSortingValue MenuStyle MenuView Merge MergeDifferences MergingFunction MersennePrimeExponent MersennePrimeExponentQ Mesh MeshCellCentroid MeshCellCount MeshCellHighlight MeshCellIndex MeshCellLabel MeshCellMarker MeshCellMeasure MeshCellQuality MeshCells MeshCellShapeFunction MeshCellStyle MeshCoordinates MeshFunctions MeshPrimitives MeshQualityGoal MeshRange MeshRefinementFunction MeshRegion MeshRegionQ MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageObject MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation MeteorShowerData Method MethodOptions MexicanHatWavelet MeyerWavelet Midpoint Min MinColorDistance MinDetect MineralData MinFilter MinimalBy MinimalPolynomial MinimalStateSpaceModel Minimize MinimumTimeIncrement MinIntervalSize MinkowskiQuestionMark MinLimit MinMax MinorPlanetData Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingBehavior MissingDataMethod MissingDataRules MissingQ MissingString MissingStyle MissingValuePattern MittagLefflerE MixedFractionParts MixedGraphQ MixedMagnitude MixedRadix MixedRadixQuantity MixedUnit MixtureDistribution Mod Modal Mode Modular ModularInverse ModularLambda Module Modulus MoebiusMu Molecule MoleculeContainsQ MoleculeEquivalentQ MoleculeGraph MoleculeModify MoleculePattern MoleculePlot MoleculePlot3D MoleculeProperty MoleculeQ MoleculeValue Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction MomentOfInertia Monday Monitor MonomialList MonomialOrder MonsterGroupM MoonPhase MoonPosition MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform MortalityData Most MountainData MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovieData MovingAverage MovingMap MovingMedian MoyalDistribution Multicolumn MultiedgeStyle MultigraphQ MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity MultiplySides Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistributionN NakagamiDistribution NameQ Names NamespaceBox NamespaceBoxOptions Nand NArgMax NArgMin NBernoulliB NBodySimulation NBodySimulationData NCache NDEigensystem NDEigenvalues NDSolve NDSolveValue Nearest NearestFunction NearestNeighborGraph NearestTo NebulaData NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeDefiniteMatrixQ NegativeIntegers NegativeMultinomialDistribution NegativeRationals NegativeReals NegativeSemidefiniteMatrixQ NeighborhoodData NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestGraph NestList NestWhile NestWhileList NetAppend NetBidirectionalOperator NetChain NetDecoder NetDelete NetDrop NetEncoder NetEvaluationMode NetExtract NetFlatten NetFoldOperator NetGraph NetInformation NetInitialize NetInsert NetInsertSharedArrays NetJoin NetMapOperator NetMapThreadOperator NetMeasurements NetModel NetNestOperator NetPairEmbeddingOperator NetPort NetPortGradient NetPrepend NetRename NetReplace NetReplacePart NetSharedArray NetStateObject NetTake NetTrain NetTrainResultsObject NetworkPacketCapture NetworkPacketRecording NetworkPacketRecordingDuring NetworkPacketTrace NeumannValue NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextCell NextDate NextPrime NextScheduledTaskTime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NightHemisphere NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants NondimensionalizationTransform None NoneTrue NonlinearModelFit NonlinearStateSpaceModel NonlocalMeansFilter NonNegative NonNegativeIntegers NonNegativeRationals NonNegativeReals NonPositive NonPositiveIntegers NonPositiveRationals NonPositiveReals Nor NorlundB Norm Normal NormalDistribution NormalGrouping NormalizationLayer Normalize Normalized NormalizedSquaredEuclideanDistance NormalMatrixQ NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookImport NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookTemplate NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde Nothing NotHumpDownHump NotHumpEqual NotificationFunction NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar Now NoWhitespace NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms NuclearExplosionData NuclearReactorData Null NullRecords NullSpace NullWords Number NumberCompose NumberDecompose NumberExpand NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberLinePlot NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumeratorDenominator NumericalOrder NumericalSort NumericArray NumericArrayQ NumericArrayType NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlotO ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OceanData Octahedron OddQ Off Offset OLEData On ONanGroupON Once OneIdentity Opacity OpacityFunction OpacityFunctionScaling Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionalElement OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering OrderingBy OrderingLayer Orderless OrderlessPatternSequence OrnsteinUhlenbeckProcess Orthogonalize OrthogonalMatrixQ Out Outer OuterPolygon OuterPolyhedron OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OverwriteTarget OwenT OwnValuesPackage PackingMethod PaddedForm Padding PaddingLayer PaddingSize PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageTheme PageWidth Pagination PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath PalindromeQ Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo Parallelepiped ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds Parallelogram ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParametricRegion ParentBox ParentCell ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParentNotebook ParetoDistribution ParetoPickandsDistribution ParkData Part PartBehavior PartialCorrelationFunction PartialD ParticleAcceleratorData ParticleData Partition PartitionGranularity PartitionsP PartitionsQ PartLayer PartOfSpeech PartProtection ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteAutoQuoteCharacters PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PeakDetect PeanoCurve PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PercentForm PerfectNumber PerfectNumberQ PerformanceGoal Perimeter PeriodicBoundaryCondition PeriodicInterpolation Periodogram PeriodogramArray Permanent Permissions PermissionsGroup PermissionsGroupMemberQ PermissionsGroups PermissionsKey PermissionsKeys PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PerpendicularBisector PersistenceLocation PersistenceTime PersistentObject PersistentObjects PersistentValue PersonData PERTDistribution PetersenGraph PhaseMargins PhaseRange PhysicalSystemData Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest PingTime Pink PitchRecognize Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarAngle PlanarGraph PlanarGraphQ PlanckRadiationLaw PlaneCurveData PlanetaryMoonData PlanetData PlantData Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLabels PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangeClipPlanesStyle PlotRangePadding PlotRegion PlotStyle PlotTheme Pluralize Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox Point3DBoxOptions PointBox PointBoxOptions PointFigureChart PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonalNumber PolygonAngle PolygonBox PolygonBoxOptions PolygonCoordinates PolygonDecomposition PolygonHoleScale PolygonIntersections PolygonScale Polyhedron PolyhedronAngle PolyhedronCoordinates PolyhedronData PolyhedronDecomposition PolyhedronGenus PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PoolingLayer PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position PositionIndex Positive PositiveDefiniteMatrixQ PositiveIntegers PositiveRationals PositiveReals PositiveSemidefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerRange PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement Predict PredictionRoot PredictorFunction PredictorInformation PredictorMeasurements PredictorMeasurementsObject PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependLayer PrependTo PreprocessingRules PreserveColor PreserveImageOptions Previous PreviousCell PreviousDate PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitivePolynomialQ PrimitiveRoot PrimitiveRootList PrincipalComponents PrincipalValue Print PrintableASCIIQ PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment Printout3D Printout3DPreviewer PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateKey PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessConnection ProcessDirectory ProcessEnvironment Processes ProcessEstimator ProcessInformation ProcessObject ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessStatus ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm ProofObject Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse PsychrometricPropertyData PublicKey PublisherID PulsarData PunctuationCharacter Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptionsQBinomial QFactorial QGamma QHypergeometricPFQ QnDispersion QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ QuadraticOptimization Quantile QuantilePlot Quantity QuantityArray QuantityDistribution QuantityForm QuantityMagnitude QuantityQ QuantityUnit QuantityVariable QuantityVariableCanonicalUnit QuantityVariableDimensions QuantityVariableIdentifier QuantityVariablePhysicalQuantity Quartics QuartileDeviation Quartiles QuartileSkewness Query QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainderRadialGradientImage RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RadonTransform RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Ramp Random RandomChoice RandomColor RandomComplex RandomEntity RandomFunction RandomGeoPosition RandomGraph RandomImage RandomInstance RandomInteger RandomPermutation RandomPoint RandomPolygon RandomPolyhedron RandomPrime RandomReal RandomSample RandomSeed RandomSeeding RandomVariate RandomWalkProcess RandomWord Range RangeFilter RangeSpecification RankedMax RankedMin RarerProbability Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadByteArray ReadLine ReadList ReadProtected ReadString Real RealAbs RealBlockDiagonalForm RealDigits RealExponent Reals RealSign Reap RecognitionPrior RecognitionThreshold Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RectangularRepeatingElement RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate Region RegionBinarize RegionBoundary RegionBounds RegionCentroid RegionDifference RegionDimension RegionDisjoint RegionDistance RegionDistanceFunction RegionEmbeddingDimension RegionEqual RegionFunction RegionImage RegionIntersection RegionMeasure RegionMember RegionMemberFunction RegionMoment RegionNearest RegionNearestFunction RegionPlot RegionPlot3D RegionProduct RegionQ RegionResize RegionSize RegionSymmetricDifference RegionUnion RegionWithin RegisterExternalEvaluator RegularExpression Regularization RegularlySampledQ RegularPolygon ReIm ReImLabels ReImPlot ReImStyle Reinstall RelationalDatabase RelationGraph Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot RemoteAuthorizationCaching RemoteConnect RemoteConnectionObject RemoteFile RemoteRun RemoteRunProcess Remove RemoveAlphaChannel RemoveAsynchronousTask RemoveAudioStream RemoveBackground RemoveChannelListener RemoveChannelSubscribers Removed RemoveDiacritics RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RemoveUsers RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart RepairMesh Repeated RepeatedNull RepeatedString RepeatedTiming RepeatingElement Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated ReplicateLayer RequiredPhysicalQuantities Resampling ResamplingAlgorithmData ResamplingMethod Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask ReshapeLayer Residue ResizeLayer Resolve ResourceAcquire ResourceData ResourceFunction ResourceObject ResourceRegister ResourceRemove ResourceSearch ResourceSubmissionObject ResourceSubmit ResourceSystemBase ResourceUpdate ResponseForm Rest RestartInterval Restricted Resultant ResumePacket Return ReturnEntersInput ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnReceiptFunction ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseSort ReverseSortBy ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ RiemannXi Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightComposition RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity RollPitchYawAngles RollPitchYawMatrix RomanNumeral Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RSolveValue RudinShapiro RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulePlot RulerUnits Run RunProcess RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilaritySameQ SameTest SampledEntityClass SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SASTriangle SatelliteData SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveConnection SaveDefinitions SavitzkyGolayMatrix SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTask ScheduledTaskActiveQ ScheduledTaskInformation ScheduledTaskInformationData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScientificNotationThreshold ScorerGi ScorerGiPrime ScorerHi ScorerHiPrime ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptForm ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition SearchAdjustment SearchIndexObject SearchIndices SearchQueryString SearchResultObject Sec Sech SechDistribution SecondOrderConeOptimization SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SecuredAuthenticationKey SecuredAuthenticationKeys SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook SelectFirst Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemanticImport SemanticImportString SemanticInterpretation SemialgebraicComponentInstances SemidefiniteOptimization SendMail SendMessage Sequence SequenceAlignment SequenceAttentionLayer SequenceCases SequenceCount SequenceFold SequenceFoldList SequenceForm SequenceHold SequenceLastLayer SequenceMostLayer SequencePosition SequencePredict SequencePredictorFunction SequenceReplace SequenceRestLayer SequenceReverseLayer SequenceSplit Series SeriesCoefficient SeriesData ServiceConnect ServiceDisconnect ServiceExecute ServiceObject ServiceRequest ServiceResponse ServiceSubmit SessionSubmit SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetCloudDirectory SetCookies SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPermissions SetPrecision SetProperty SetSecuredAuthenticationKey SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemModel SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetUsers SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share SharingList Sharpen ShearingMatrix ShearingTransform ShellRegion ShenCastanMatrix ShiftedGompertzDistribution ShiftRegisterSequence Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortTimeFourier ShortTimeFourierData ShortUpArrow Show ShowAutoConvert ShowAutoSpellCheck ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowCodeAssist ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiderealTime SiegelTheta SiegelTukeyTest SierpinskiCurve SierpinskiMesh Sign Signature SignedRankTest SignedRegionDistance SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ SimplePolygonQ SimplePolyhedronQ Simplex Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution SkinStyle Skip SliceContourPlot3D SliceDensityPlot3D SliceDistribution SliceVectorPlot3D Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDecomposition SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SnDispersion Snippet SnubPolyhedron SocialMediaData Socket SocketConnect SocketListen SocketListener SocketObject SocketOpen SocketReadMessage SocketReadyQ Sockets SocketWaitAll SocketWaitNext SoftmaxLayer SokalSneathDissimilarity SolarEclipse SolarSystemFeatureData SolidAngle SolidData SolidRegionQ Solve SolveAlways SolveDelayed Sort SortBy SortedBy SortedEntityClass Sound SoundAndGraphics SoundNote SoundVolume SourceLink Sow Space SpaceCurveData SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution SpatialMedian SpatialTransformationLayer Speak SpeakTextPacket SpearmanRankTest SpearmanRho SpeciesData SpecificityGoal SpectralLineData Spectrogram SpectrogramArray Specularity SpeechRecognize SpeechSynthesize SpellingCorrection SpellingCorrectionList SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SpherePoints SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SphericalShell SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquareMatrixQ SquareRepeatingElement SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave SSSTriangle StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackedDateListPlot StackedListPlot StackInhibit StadiumShape StandardAtmosphereData StandardDeviation StandardDeviationFilter StandardForm Standardize Standardized StandardOceanData StandbyDistribution Star StarClusterData StarData StarGraph StartAsynchronousTask StartExternalSession StartingStepSize StartOfLine StartOfString StartProcess StartScheduledTask StartupSound StartWebSession StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StateTransformationLinearize StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StereochemistryElements StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StoppingPowerData StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamMarkers StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringContainsQ StringCount StringDelete StringDrop StringEndsQ StringExpression StringExtract StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPadLeft StringPadRight StringPart StringPartition StringPosition StringQ StringRepeat StringReplace StringReplaceList StringReplacePart StringReverse StringRiffle StringRotateLeft StringRotateRight StringSkeleton StringSplit StringStartsQ StringTake StringTemplate StringToByteArray StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleData StyleDefinitions StyleForm StyleHints StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subdivide Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subsequences Subset SubsetEqual SubsetMap SubsetQ Subsets SubStar SubstitutionSystem Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubtractSides SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde Success SuchThat Sum SumConvergence SummationLayer Sunday SunPosition Sunrise Sunset SuperDagger SuperMinus SupernovaData SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceArea SurfaceColor SurfaceData SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricKey SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Synonyms Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SynthesizeMissingValues SystemDialogInput SystemException SystemGet SystemHelpPath SystemInformation SystemInformationData SystemInstall SystemModel SystemModeler SystemModelExamples SystemModelLinearize SystemModelParametricSimulate SystemModelPlot SystemModelProgressReporting SystemModelReliability SystemModels SystemModelSimulate SystemModelSimulateSensitivity SystemModelSimulationData SystemOpen SystemOptions SystemProcessData SystemProcesses SystemsConnectionsModel SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelLinearity SystemsModelMerge SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemsModelVectorRelativeOrders SystemStub SystemTestTab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TableViewBoxBackground TableViewBoxOptions TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeDrop TakeLargest TakeLargestBy TakeList TakeSmallest TakeSmallestBy TakeWhile Tally Tan Tanh TargetDevice TargetFunctions TargetSystem TargetUnits TaskAbort TaskExecute TaskObject TaskRemove TaskResume Tasks TaskSuspend TaskWait TautologyQ TelegraphProcess TemplateApply TemplateArgBox TemplateBox TemplateBoxOptions TemplateEvaluate TemplateExpression TemplateIf TemplateObject TemplateSequence TemplateSlot TemplateSlotSequence TemplateUnevaluated TemplateVerbatim TemplateWith TemporalData TemporalRegularity Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge TestID TestReport TestReportObject TestResultObject Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCases TextCell TextClipboardType TextContents TextData TextElement TextForm TextGrid TextJustification TextLine TextPacket TextParagraph TextPosition TextRecognize TextSearch TextSearchReport TextSentences TextString TextStructure TextStyle TextTranslation Texture TextureCoordinateFunction TextureCoordinateScaling TextWords Therefore ThermodynamicData ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreadingLayer ThreeJSymbol Threshold Through Throw ThueMorse Thumbnail Thursday Ticks TicksStyle TideData Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint TimeDirection TimeFormat TimeGoal TimelinePlot TimeObject TimeObjectQ Times TimesBy TimeSeries TimeSeriesAggregate TimeSeriesForecast TimeSeriesInsert TimeSeriesInvertibility TimeSeriesMap TimeSeriesMapThread TimeSeriesModel TimeSeriesModelFit TimeSeriesResample TimeSeriesRescale TimeSeriesShift TimeSeriesThread TimeSeriesWindow TimeUsed TimeValue TimeWarpingCorrespondence TimeWarpingDistance TimeZone TimeZoneConvert TimeZoneOffset Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate Today ToDiscreteTimeModel ToEntity ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase Tomorrow ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform ToPolarCoordinates TopologicalSort ToRadicals ToRules ToSphericalCoordinates ToString Total TotalHeight TotalLayer TotalVariationFilter TotalWidth TouchPosition TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TrackingFunction TracyWidomDistribution TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TrainingProgressCheckpointing TrainingProgressFunction TrainingProgressMeasurements TrainingProgressReporting TrainingStoppingCriterion TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationClass TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField TransformedProcess TransformedRegion TransitionDirection TransitionDuration TransitionEffect TransitiveClosureGraph TransitiveReductionGraph Translate TranslationOptions TranslationTransform Transliterate Transparent TransparentColor Transpose TransposeLayer TrapSelection TravelDirections TravelDirectionsData TravelDistance TravelDistanceList TravelMethod TravelTime TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle Triangle TriangleCenter TriangleConstruct TriangleMeasurement TriangleWave TriangularDistribution TriangulateMesh Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean TrimmedVariance TropicalStormData True TrueQ TruncatedDistribution TruncatedPolyhedron TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBoxOptions TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow TunnelData Tuples TuranGraph TuringMachine TuttePolynomial TwoWayRule Typed TypeSpecifierUnateQ Uncompress UnconstrainedParameters Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UnderseaFeatureData UndirectedEdge UndirectedGraph UndirectedGraphQ UndoOptions UndoTrackedVariables Unequal UnequalTo Unevaluated UniformDistribution UniformGraphDistribution UniformPolyhedron UniformSumDistribution Uninstall Union UnionPlus Unique UnitaryMatrixQ UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitSystem UnitTriangle UnitVector UnitVectorLayer UnityDimensions UniverseModelData UniversityData UnixTime Unprotect UnregisterExternalEvaluator UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpdateSearchIndex UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize UpperTriangularMatrixQ Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpTo UpValues URL URLBuild URLDecode URLDispatcher URLDownload URLDownloadSubmit URLEncode URLExecute URLExpand URLFetch URLFetchAsynchronous URLParse URLQueryDecode URLQueryEncode URLRead URLResponseTime URLSave URLSaveAsynchronous URLShorten URLSubmit UseGraphicsRange UserDefinedWavelet Using UsingFrontEnd UtilityFunctionV2Get ValenceErrorHandling ValidationLength ValidationSet Value ValueBox ValueBoxOptions ValueDimensions ValueForm ValuePreprocessingFunction ValueQ Values ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorAround VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorGreater VectorGreaterEqual VectorLess VectorLessEqual VectorMarkers VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerificationTest VerifyConvergence VerifyDerivedKey VerifyDigitalSignature VerifyInterpretation VerifySecurityCertificates VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexContract VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight VertexWeightedGraphQ Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewProjection ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoiceStyleData VoigtDistribution VolcanoData Volume VonMisesDistribution VoronoiMeshWaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WarpingCorrespondence WarpingDistance WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeatherForecastData WebAudioSearch WebElementObject WeberE WebExecute WebImage WebImageSearch WebSearch WebSessionObject WebSessions WebWindowObject Wedge Wednesday WeibullDistribution WeierstrassE1 WeierstrassE2 WeierstrassE3 WeierstrassEta1 WeierstrassEta2 WeierstrassEta3 WeierstrassHalfPeriods WeierstrassHalfPeriodW1 WeierstrassHalfPeriodW2 WeierstrassHalfPeriodW3 WeierstrassInvariantG2 WeierstrassInvariantG3 WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White WhiteNoiseProcess WhitePoint Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WikipediaData WikipediaSearch WilksW WilksWTest WindDirectionData WindingCount WindingPolygon WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowPersistentStyles WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth WindSpeedData WindVectorData WinsorizedMean WinsorizedVariance WishartMatrixDistribution With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult WolframLanguageData Word WordBoundary WordCharacter WordCloud WordCount WordCounts WordData WordDefinition WordFrequency WordFrequencyData WordList WordOrientation WordSearch WordSelectionFunction WordSeparators WordSpacings WordStem WordTranslation WorkingPrecision WrapAround Write WriteLine WriteString WronskianXMLElement XMLObject XMLTemplate Xnor Xor XYZColorYellow Yesterday YuleDissimilarityZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZIPCodeData ZipfDistribution ZoomCenter ZoomFactor ZTest ZTransform$Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AllowExternalChannelFunctions $AssertFunction $Assumptions $AsynchronousTask $AudioInputDevices $AudioOutputDevices $BaseDirectory $BatchInput $BatchOutput $BlockchainBase $BoxForms $ByteOrdering $CacheBaseDirectory $Canceled $ChannelBase $CharacterEncoding $CharacterEncodings $CloudBase $CloudConnected $CloudCreditsAvailable $CloudEvaluation $CloudExpressionBase $CloudObjectNameFormat $CloudObjectURLType $CloudRootDirectory $CloudSymbolBase $CloudUserID $CloudUserUUID $CloudVersion $CloudVersionNumber $CloudWolframEngineVersionNumber $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $Cookies $CookieStore $CreationDate $CurrentLink $CurrentTask $CurrentWebSession $DateStringFormat $DefaultAudioInputDevice $DefaultAudioOutputDevice $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultLocalBase $DefaultMailbox $DefaultNetworkInterface $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $EmbedCodeEnvironments $EmbeddableServices $EntityStores $Epilog $EvaluationCloudBase $EvaluationCloudObject $EvaluationEnvironment $ExportFormats $Failed $FinancialDataSource $FontFamilies $FormatType $FrontEnd $FrontEndSession $GeoEntityTypes $GeoLocation $GeoLocationCity $GeoLocationCountry $GeoLocationPrecision $GeoLocationSource $HistoryLength $HomeDirectory $HTMLExportRules $HTTPCookies $HTTPRequest $IgnoreEOF $ImageFormattingWidth $ImagingDevice $ImagingDevices $ImportFormats $IncomingMailSettings $InitialDirectory $Initialization $InitializationContexts $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $InterpreterTypes $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $LocalBase $LocalSymbolBase $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $MobilePhone $ModuleNumber $NetworkConnected $NetworkInterfaces $NetworkLicense $NewMessage $NewSymbol $Notebooks $NoValue $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $Permissions $PermissionsGroupBase $PersistenceBase $PersistencePath $PipeSupported $PlotTheme $Post $Pre $PreferencesDirectory $PreInitialization $PrePrint $PreRead $PrintForms $PrintLiteral $Printout3DPreviewer $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $PublisherID $RandomState $RecursionLimit $RegisteredDeviceClasses $RegisteredUserName $ReleaseNumber $RequesterAddress $RequesterWolframID $RequesterWolframUUID $ResourceSystemBase $RootDirectory $ScheduledTask $ScriptCommandLine $ScriptInputString $SecuredAuthenticationKeyTokens $ServiceCreditsAvailable $Services $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SourceLink $SSHAuthentication $SummaryBoxDataSizeLimit $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemMemory $SystemShell $SystemTimeZone $SystemWordLength $TemplatePath $TemporaryDirectory $TemporaryPrefix $TestFileName $TextStyle $TimedOut $TimeUnit $TimeZone $TimeZoneEntity $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $UnitSystem $Urgent $UserAddOnsDirectory $UserAgentLanguages $UserAgentMachine $UserAgentName $UserAgentOperatingSystem $UserAgentString $UserAgentVersion $UserBaseDirectory $UserDocumentsDirectory $Username $UserName $UserURLBase $Version $VersionNumber $VoiceStyles $WolframID $WolframUUID\",c:[e.C(\"\\\\(\\\\*\",\"\\\\*\\\\)\",{c:[\"self\"]}),e.QSM,e.CNM]}});hljs.registerLanguage(\"vim\",function(e){return{l:/[!#@\\w]+/,k:{keyword:\"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank\",built_in:\"synIDtrans atan2 range matcharg did_filetype asin feedkeys xor argv complete_check add getwinposx getqflist getwinposy screencol clearmatches empty extend getcmdpos mzeval garbagecollect setreg ceil sqrt diff_hlID inputsecret get getfperm getpid filewritable shiftwidth max sinh isdirectory synID system inputrestore winline atan visualmode inputlist tabpagewinnr round getregtype mapcheck hasmapto histdel argidx findfile sha256 exists toupper getcmdline taglist string getmatches bufnr strftime winwidth bufexists strtrans tabpagebuflist setcmdpos remote_read printf setloclist getpos getline bufwinnr float2nr len getcmdtype diff_filler luaeval resolve libcallnr foldclosedend reverse filter has_key bufname str2float strlen setline getcharmod setbufvar index searchpos shellescape undofile foldclosed setqflist buflisted strchars str2nr virtcol floor remove undotree remote_expr winheight gettabwinvar reltime cursor tabpagenr finddir localtime acos getloclist search tanh matchend rename gettabvar strdisplaywidth type abs py3eval setwinvar tolower wildmenumode log10 spellsuggest bufloaded synconcealed nextnonblank server2client complete settabwinvar executable input wincol setmatches getftype hlID inputsave searchpair or screenrow line settabvar histadd deepcopy strpart remote_peek and eval getftime submatch screenchar winsaveview matchadd mkdir screenattr getfontname libcall reltimestr getfsize winnr invert pow getbufline byte2line soundfold repeat fnameescape tagfiles sin strwidth spellbadword trunc maparg log lispindent hostname setpos globpath remote_foreground getchar synIDattr fnamemodify cscope_connection stridx winbufnr indent min complete_add nr2char searchpairpos inputdialog values matchlist items hlexists strridx browsedir expand fmod pathshorten line2byte argc count getwinvar glob foldtextresult getreg foreground cosh matchdelete has char2nr simplify histget searchdecl iconv winrestcmd pumvisible writefile foldlevel haslocaldir keys cos matchstr foldtext histnr tan tempname getcwd byteidx getbufvar islocked escape eventhandler remote_send serverlist winrestview synstack pyeval prevnonblank readfile cindent filereadable changenr exp\"},i:/;/,c:[e.NM,{cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\"},{cN:\"string\",b:/\"(\\\\\"|\\n\\\\|[^\"\\n])*\"/},e.C('\"',\"$\"),{cN:\"variable\",b:/[bwtglsav]:[\\w\\d_]*/},{cN:\"function\",bK:\"function function!\",e:\"$\",relevance:0,c:[e.TM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]},{cN:\"symbol\",b:/<[\\w-]+>/}]}});hljs.registerLanguage(\"makefile\",function(e){var i={cN:\"variable\",v:[{b:\"\\\\$\\\\(\"+e.UIR+\"\\\\)\",c:[e.BE]},{b:/\\$[@%<?\\^\\+\\*]/}]},r={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,i]},a={cN:\"variable\",b:/\\$\\([\\w-]+\\s/,e:/\\)/,k:{built_in:\"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value\"},c:[i]},n={b:\"^\"+e.UIR+\"\\\\s*(?=[:+?]?=)\"},t={cN:\"section\",b:/^[^\\s]+:/,e:/$/,c:[i]};return{aliases:[\"mk\",\"mak\"],k:\"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath\",l:/[\\w-]+/,c:[e.HCM,i,r,a,n,{cN:\"meta\",b:/^\\.PHONY:/,e:/$/,k:{\"meta-keyword\":\".PHONY\"},l:/[\\.\\w]+/},t]}});hljs.registerLanguage(\"objectivec\",function(e){var t=/[a-zA-Z@][a-zA-Z0-9_]*/,i=\"@interface @class @protocol @implementation\";return{aliases:[\"mm\",\"objc\",\"obj-c\"],k:{keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"},l:t,i:\"</\",c:[{cN:\"built_in\",b:\"\\\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\\\w+\"},e.CLCM,e.CBCM,e.CNM,e.QSM,e.ASM,{cN:\"string\",v:[{b:'@\"',e:'\"',i:\"\\\\n\",c:[e.BE]}]},{cN:\"meta\",b:/#\\s*[a-z]+\\b/,e:/$/,k:{\"meta-keyword\":\"if else elif endif define undef warning error line pragma ifdef ifndef include\"},c:[{b:/\\\\\\n/,relevance:0},e.inherit(e.QSM,{cN:\"meta-string\"}),{cN:\"meta-string\",b:/<.*?>/,e:/$/,i:\"\\\\n\"},e.CLCM,e.CBCM]},{cN:\"class\",b:\"(\"+i.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",eE:!0,k:i,l:t,c:[e.UTM]},{b:\"\\\\.\"+e.UIR,relevance:0}]}});hljs.registerLanguage(\"shell\",function(s){return{aliases:[\"console\"],c:[{cN:\"meta\",b:\"^\\\\s{0,3}[/\\\\w\\\\d\\\\[\\\\]()@-]*[>%$#]\",starts:{e:\"$\",sL:\"bash\"}}]}});hljs.registerLanguage(\"erlang\",function(e){var r=\"[a-z'][a-zA-Z0-9_']*\",c=\"(\"+r+\":\"+r+\"|\"+r+\")\",n={keyword:\"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor\",literal:\"false true\"},a=e.C(\"%\",\"$\"),b={cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",relevance:0},i={b:\"fun\\\\s+\"+r+\"/\\\\d+\"},l={b:c+\"\\\\(\",e:\"\\\\)\",rB:!0,relevance:0,c:[{b:c,relevance:0},{b:\"\\\\(\",e:\"\\\\)\",eW:!0,rE:!0,relevance:0}]},d={b:\"{\",e:\"}\",relevance:0},o={b:\"\\\\b_([A-Z][A-Za-z0-9_]*)?\",relevance:0},t={b:\"[A-Z][a-zA-Z0-9_]*\",relevance:0},v={b:\"#\"+e.UIR,relevance:0,rB:!0,c:[{b:\"#\"+e.UIR,relevance:0},{b:\"{\",e:\"}\",relevance:0}]},f={bK:\"fun receive if try case\",e:\"end\",k:n};f.c=[a,i,e.inherit(e.ASM,{cN:\"\"}),f,l,e.QSM,b,d,o,t,v];var s=[a,i,f,l,e.QSM,b,d,o,t,v];l.c[1].c=s,d.c=s;var u={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:v.c[1].c=s};return{aliases:[\"erl\"],k:n,i:\"(</|\\\\*=|\\\\+=|-=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))\",c:[{cN:\"function\",b:\"^\"+r+\"\\\\s*\\\\(\",e:\"->\",rB:!0,i:\"\\\\(|#|//|/\\\\*|\\\\\\\\|:|;\",c:[u,e.inherit(e.TM,{b:r})],starts:{e:\";|\\\\.\",k:n,c:s}},a,{b:\"^-\",e:\"\\\\.\",relevance:0,eE:!0,rB:!0,l:\"-\"+e.IR,k:\"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec\",c:[u]},b,e.QSM,v,o,t,d,{b:/\\.$/}]}});hljs.registerLanguage(\"powershell\",function(e){var t={keyword:\"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter\"},n={b:\"`[\\\\s\\\\S]\",relevance:0},c={cN:\"variable\",v:[{b:/\\$\\B/},{cN:\"keyword\",b:/\\$this/},{b:/\\$[\\w\\d][\\w\\d_:]*/}]},i={cN:\"string\",v:[{b:/\"/,e:/\"/},{b:/@\"/,e:/^\"@/}],c:[n,c,{cN:\"variable\",b:/\\$[A-z]/,e:/[^A-z]/}]},a={cN:\"string\",v:[{b:/'/,e:/'/},{b:/@'/,e:/^'@/}]},r=e.inherit(e.C(null,null),{v:[{b:/#/,e:/$/},{b:/<#/,e:/#>/}],c:[{cN:\"doctag\",v:[{b:/\\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{b:/\\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\\s+\\S+/}]}]}),o={cN:\"built_in\",v:[{b:\"(\".concat(\"Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|New|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Complete|Confirm|Deny|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where\",\")+(-)[\\\\w\\\\d]+\")}]},l={cN:\"class\",bK:\"class enum\",e:/\\s*[{]/,eE:!0,relevance:0,c:[e.TM]},s={cN:\"function\",b:/function\\s+/,e:/\\s*\\{|$/,eE:!0,rB:!0,relevance:0,c:[{b:\"function\",relevance:0,cN:\"keyword\"},{cN:\"title\",b:/\\w[\\w\\d]*((-)[\\w\\d]+)*/,relevance:0},{b:/\\(/,e:/\\)/,cN:\"params\",relevance:0,c:[c]}]},p={b:/using\\s/,e:/$/,rB:!0,c:[i,a,{cN:\"keyword\",b:/(using|assembly|command|module|namespace|type)/}]},b={v:[{cN:\"operator\",b:\"(\".concat(\"-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor\",\")\\\\b\")},{cN:\"literal\",b:/(-)[\\w\\d]+/,relevance:0}]},d={cN:\"function\",b:/\\[.*\\]\\s*[\\w]+[ ]??\\(/,e:/$/,rB:!0,relevance:0,c:[{cN:\"keyword\",b:\"(\".concat(t.keyword.toString().replace(/\\s/g,\"|\"),\")\\\\b\"),endsParent:!0,relevance:0},e.inherit(e.TM,{endsParent:!0})]},u=[d,r,n,e.NM,i,a,o,c,{cN:\"literal\",b:/\\$(null|true|false)\\b/},{cN:\"selector-tag\",b:/\\@\\B/,relevance:0}],m={b:/\\[/,e:/\\]/,eB:!0,eE:!0,relevance:0,c:[].concat(\"self\",u,{b:\"(\"+[\"string\",\"char\",\"byte\",\"int\",\"long\",\"bool\",\"decimal\",\"single\",\"double\",\"DateTime\",\"xml\",\"array\",\"hashtable\",\"void\"].join(\"|\")+\")\",cN:\"built_in\",relevance:0},{cN:\"type\",b:/[\\.\\w\\d]+/,relevance:0})};return d.c.unshift(m),{aliases:[\"ps\",\"ps1\"],l:/-?[A-z\\.\\-]+/,cI:!0,k:t,c:u.concat(l,s,p,b,m)}});hljs.registerLanguage(\"typescript\",function(e){var r=\"[A-Za-z$_][0-9A-Za-z$_]*\",t={keyword:\"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract as from extends async await\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void Promise\"},n={cN:\"meta\",b:\"@\"+r},a={b:\"\\\\(\",e:/\\)/,k:t,c:[\"self\",e.QSM,e.ASM,e.NM]},c={cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,c:[e.CLCM,e.CBCM,n,a]},s={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)n?\"},{b:\"\\\\b(0[oO][0-7]+)n?\"},{b:e.CNR+\"n?\"}],relevance:0},o={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:t,c:[]},i={b:\"html`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"xml\"}},l={b:\"css`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"css\"}},b={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,o]};return o.c=[e.ASM,e.QSM,i,l,b,s,e.RM],{aliases:[\"ts\"],k:t,c:[{cN:\"meta\",b:/^\\s*['\"]use strict['\"]/},e.ASM,e.QSM,i,l,b,e.CLCM,e.CBCM,s,{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+e.IR+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:e.IR},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,c:[\"self\",e.CLCM,e.CBCM]}]}]}],relevance:0},{cN:\"function\",bK:\"function\",e:/[\\{;]/,eE:!0,k:t,c:[\"self\",e.inherit(e.TM,{b:r}),c],i:/%/,relevance:0},{bK:\"constructor\",e:/[\\{;]/,eE:!0,c:[\"self\",c]},{b:/module\\./,k:{built_in:\"module\"},relevance:0},{bK:\"module\",e:/\\{/,eE:!0},{bK:\"interface\",e:/\\{/,eE:!0,k:\"interface extends\"},{b:/\\$[(.]/},{b:\"\\\\.\"+e.IR,relevance:0},n,a]}});hljs.registerLanguage(\"fortran\",function(e){return{cI:!0,aliases:[\"f90\",\"f95\"],k:{literal:\".False. .True.\",keyword:\"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then block endblock public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated  c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data\",built_in:\"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image\"},i:/\\/\\*/,c:[e.inherit(e.ASM,{cN:\"string\",relevance:0}),e.inherit(e.QSM,{cN:\"string\",relevance:0}),{cN:\"function\",bK:\"subroutine function program\",i:\"[${=\\\\n]\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]},e.C(\"!\",\"$\",{relevance:0}),{cN:\"number\",b:\"(?=\\\\b|\\\\+|\\\\-|\\\\.)(?=\\\\.\\\\d|\\\\d)(?:\\\\d+)?(?:\\\\.?\\\\d*)(?:[de][+-]?\\\\d+)?\\\\b\\\\.?\",relevance:0}]}});hljs.registerLanguage(\"php\",function(e){var c={b:\"\\\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*\"},i={cN:\"meta\",b:/<\\?(php)?|\\?>/},t={cN:\"string\",c:[e.BE,i],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:[\"php\",\"php3\",\"php4\",\"php5\",\"php6\",\"php7\"],cI:!0,k:\"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally\",c:[e.HCM,e.C(\"//\",\"$\",{c:[i]}),e.C(\"/\\\\*\",\"\\\\*/\",{c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.C(\"__halt_compiler.+?;\",!1,{eW:!0,k:\"__halt_compiler\",l:e.UIR}),{cN:\"string\",b:/<<<['\"]?\\w+['\"]?$/,e:/^\\w+;?$/,c:[e.BE,{cN:\"subst\",v:[{b:/\\$\\w+/},{b:/\\{\\$/,e:/\\}/}]}]},i,{cN:\"keyword\",b:/\\$this\\b/},c,{b:/(::|->)+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*/},{cN:\"function\",bK:\"function\",e:/[;{]/,eE:!0,i:\"\\\\$|\\\\[|%\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",c,e.CBCM,t,a]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",eE:!0,i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[e.UTM]},{bK:\"use\",e:\";\",c:[e.UTM]},{b:\"=>\"},t,a]}});hljs.registerLanguage(\"haskell\",function(e){var i={v:[e.C(\"--\",\"$\"),e.C(\"{-\",\"-}\",{c:[\"self\"]})]},a={cN:\"meta\",b:\"{-#\",e:\"#-}\"},l={cN:\"meta\",b:\"^#\",e:\"$\"},c={cN:\"type\",b:\"\\\\b[A-Z][\\\\w']*\",relevance:0},n={b:\"\\\\(\",e:\"\\\\)\",i:'\"',c:[a,l,{cN:\"type\",b:\"\\\\b[A-Z][\\\\w]*(\\\\((\\\\.\\\\.|,|\\\\w+)\\\\))?\"},e.inherit(e.TM,{b:\"[_a-z][\\\\w']*\"}),i]};return{aliases:[\"hs\"],k:\"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec\",c:[{bK:\"module\",e:\"where\",k:\"module where\",c:[n,i],i:\"\\\\W\\\\.|;\"},{b:\"\\\\bimport\\\\b\",e:\"$\",k:\"import qualified as hiding\",c:[n,i],i:\"\\\\W\\\\.|;\"},{cN:\"class\",b:\"^(\\\\s*)?(class|instance)\\\\b\",e:\"where\",k:\"class family instance where\",c:[c,n,i]},{cN:\"class\",b:\"\\\\b(data|(new)?type)\\\\b\",e:\"$\",k:\"data family type newtype deriving\",c:[a,c,n,{b:\"{\",e:\"}\",c:n.c},i]},{bK:\"default\",e:\"$\",c:[c,n,i]},{bK:\"infix infixl infixr\",e:\"$\",c:[e.CNM,i]},{b:\"\\\\bforeign\\\\b\",e:\"$\",k:\"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe\",c:[c,e.QSM,i]},{cN:\"meta\",b:\"#!\\\\/usr\\\\/bin\\\\/env runhaskell\",e:\"$\"},a,l,e.QSM,e.CNM,c,e.inherit(e.TM,{b:\"^[_a-z][\\\\w']*\"}),i,{b:\"->|<-\"}]}});hljs.registerLanguage(\"coffeescript\",function(e){var c={keyword:\"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not\",literal:\"true false null undefined yes no on off\",built_in:\"npm require console print module global window document\"},n=\"[A-Za-z$_][0-9A-Za-z$_]*\",r={cN:\"subst\",b:/#\\{/,e:/}/,k:c},i=[e.BNM,e.inherit(e.CNM,{starts:{e:\"(\\\\s*/)?\",relevance:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[e.BE,r]},{b:/\"/,e:/\"/,c:[e.BE,r]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[r,e.HCM]},{b:\"//[gim]{0,3}(?=\\\\W)\",relevance:0},{b:/\\/(?![ *]).*?(?![\\\\]).\\/[gim]{0,3}(?=\\W)/}]},{b:\"@\"+n},{sL:\"javascript\",eB:!0,eE:!0,v:[{b:\"```\",e:\"```\"},{b:\"`\",e:\"`\"}]}];r.c=i;var s=e.inherit(e.TM,{b:n}),t=\"(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",a={cN:\"params\",b:\"\\\\([^\\\\(]\",rB:!0,c:[{b:/\\(/,e:/\\)/,k:c,c:[\"self\"].concat(i)}]};return{aliases:[\"coffee\",\"cson\",\"iced\"],k:c,i:/\\/\\*/,c:i.concat([e.C(\"###\",\"###\"),e.HCM,{cN:\"function\",b:\"^\\\\s*\"+n+\"\\\\s*=\\\\s*\"+t,e:\"[-=]>\",rB:!0,c:[s,a]},{b:/[:\\(,=]\\s*/,relevance:0,c:[{cN:\"function\",b:t,e:\"[-=]>\",rB:!0,c:[a]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:!0,i:/[:=\"\\[\\]]/,c:[s]},s]},{b:n+\":\",e:\":\",rB:!0,rE:!0,relevance:0}])}});hljs.registerLanguage(\"r\",function(e){var r=\"([a-zA-Z]|\\\\.[a-zA-Z.])[a-zA-Z0-9._]*\";return{c:[e.HCM,{b:r,l:r,k:{keyword:\"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...\",literal:\"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10\"},relevance:0},{cN:\"number\",b:\"0[xX][0-9a-fA-F]+[Li]?\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\d+(?:[eE][+\\\\-]?\\\\d*)?L\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\d+\\\\.(?!\\\\d)(?:i\\\\b)?\",relevance:0},{cN:\"number\",b:\"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",relevance:0},{b:\"`\",e:\"`\",relevance:0},{cN:\"string\",c:[e.BE],v:[{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]}]}});hljs.registerLanguage(\"autohotkey\",function(e){var a={b:\"`[\\\\s\\\\S]\"};return{cI:!0,aliases:[\"ahk\"],k:{keyword:\"Break Continue Critical Exit ExitApp Gosub Goto New OnExit Pause return SetBatchLines SetTimer Suspend Thread Throw Until ahk_id ahk_class ahk_pid ahk_exe ahk_group\",literal:\"true false NOT AND OR\",built_in:\"ComSpec Clipboard ClipboardAll ErrorLevel\"},c:[a,e.inherit(e.QSM,{c:[a]}),e.C(\";\",\"$\",{relevance:0}),e.CBCM,{cN:\"number\",b:e.NR,relevance:0},{cN:\"variable\",b:\"%[a-zA-Z0-9#_$@]+%\"},{cN:\"built_in\",b:\"^\\\\s*\\\\w+\\\\s*(,|%)\"},{cN:\"title\",v:[{b:'^[^\\\\n\";]+::(?!=)'},{b:'^[^\\\\n\";]+:(?!=)',relevance:0}]},{cN:\"meta\",b:\"^\\\\s*#\\\\w+\",e:\"$\",relevance:0},{cN:\"built_in\",b:\"A_[a-zA-Z0-9]+\"},{b:\",\\\\s*,\"}]}});hljs.registerLanguage(\"elixir\",function(e){var b=\"[a-zA-Z_][a-zA-Z0-9_.]*(\\\\!|\\\\?)?\",c=\"and false then defined module in return redo retry end for true self when next until do begin unless nil break not case cond alias while ensure or include use alias fn quote require import with|0\",n={cN:\"subst\",b:\"#\\\\{\",e:\"}\",l:b,k:c},r=\"[/|([{<\\\"']\",a={cN:\"string\",b:\"~[a-z](?=\"+r+\")\",c:[{endsParent:!0,c:[{c:[e.BE,n],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/\\//,e:/\\//},{b:/\\|/,e:/\\|/},{b:/\\(/,e:/\\)/},{b:/\\[/,e:/\\]/},{b:/\\{/,e:/\\}/},{b:/</,e:/>/}]}]}]},i={cN:\"string\",b:\"~[A-Z](?=\"+r+\")\",c:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/\\//,e:/\\//},{b:/\\|/,e:/\\|/},{b:/\\(/,e:/\\)/},{b:/\\[/,e:/\\]/},{b:/\\{/,e:/\\}/},{b:/\\</,e:/\\>/}]},l={cN:\"string\",c:[e.BE,n],v:[{b:/\"\"\"/,e:/\"\"\"/},{b:/'''/,e:/'''/},{b:/~S\"\"\"/,e:/\"\"\"/,c:[]},{b:/~S\"/,e:/\"/,c:[]},{b:/~S'''/,e:/'''/,c:[]},{b:/~S'/,e:/'/,c:[]},{b:/'/,e:/'/},{b:/\"/,e:/\"/}]},s={cN:\"function\",bK:\"def defp defmacro\",e:/\\B\\b/,c:[e.inherit(e.TM,{b:b,endsParent:!0})]},t=e.inherit(s,{cN:\"class\",bK:\"defimpl defmodule defprotocol defrecord\",e:/\\bdo\\b|$|;/}),d=[l,i,a,e.HCM,t,s,{b:\"::\"},{cN:\"symbol\",b:\":(?![\\\\s:])\",c:[l,{b:\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\"}],relevance:0},{cN:\"symbol\",b:b+\":(?!:)\",relevance:0},{cN:\"number\",b:\"(\\\\b0o[0-7_]+)|(\\\\b0b[01_]+)|(\\\\b0x[0-9a-fA-F_]+)|(-?\\\\b[1-9][0-9_]*(.[0-9_]+([eE][-+]?[0-9]+)?)?)\",relevance:0},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{b:\"->\"},{b:\"(\"+e.RSR+\")\\\\s*\",c:[e.HCM,{cN:\"regexp\",i:\"\\\\n\",c:[e.BE,n],v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}],relevance:0}];return{l:b,k:c,c:n.c=d}});hljs.registerLanguage(\"gradle\",function(e){return{cI:!0,k:{keyword:\"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine\"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage(\"css\",function(e){var c={b:/(?:[A-Z\\_\\.\\-]+|--[a-zA-Z0-9_-]+)\\s*:/,rB:!0,e:\";\",eW:!0,c:[{cN:\"attribute\",b:/\\S/,e:\":\",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\\w-]+\\(/,rB:!0,c:[{cN:\"built_in\",b:/[\\w-]+/},{b:/\\(/,e:/\\)/,c:[e.ASM,e.QSM,e.CSSNM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:\"number\",b:\"#[0-9A-Fa-f]+\"},{cN:\"meta\",b:\"!important\"}]}}]};return{cI:!0,i:/[=\\/|'\\$]/,c:[e.CBCM,{cN:\"selector-id\",b:/#[A-Za-z0-9_-]+/},{cN:\"selector-class\",b:/\\.[A-Za-z0-9_-]+/},{cN:\"selector-attr\",b:/\\[/,e:/\\]/,i:\"$\",c:[e.ASM,e.QSM]},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"@(page|font-face)\",l:\"@[a-z-]+\",k:\"@page @font-face\"},{b:\"@\",e:\"[{;]\",i:/:/,rB:!0,c:[{cN:\"keyword\",b:/@\\-?\\w[\\w]*(\\-\\w+)*/},{b:/\\s/,eW:!0,eE:!0,relevance:0,k:\"and or not only\",c:[{b:/[a-z-]+:/,cN:\"attribute\"},e.ASM,e.QSM,e.CSSNM]}]},{cN:\"selector-tag\",b:\"[a-zA-Z-][a-zA-Z0-9_-]*\",relevance:0},{b:\"{\",e:\"}\",i:/\\S/,c:[e.CBCM,c]}]}});\n\nexports.hljs = hljs;\n",
            "type": "application/javascript",
            "title": "$:/plugins/tiddlywiki/highlight/highlight.js",
            "module-type": "library"
        },
        "$:/plugins/tiddlywiki/highlight/highlight.css": {
            "text": "/*\n\nOriginal highlight.js style (c) Ivan Sagalaev <maniac@softwaremaniacs.org>\n\n*/\n\n.hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: #F0F0F0;\n}\n\n\n/* Base color: saturation 0; */\n\n.hljs,\n.hljs-subst {\n  color: #444;\n}\n\n.hljs-comment {\n  color: #888888;\n}\n\n.hljs-keyword,\n.hljs-attribute,\n.hljs-selector-tag,\n.hljs-meta-keyword,\n.hljs-doctag,\n.hljs-name {\n  font-weight: bold;\n}\n\n\n/* User color: hue: 0 */\n\n.hljs-type,\n.hljs-string,\n.hljs-number,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-quote,\n.hljs-template-tag,\n.hljs-deletion {\n  color: #880000;\n}\n\n.hljs-title,\n.hljs-section {\n  color: #880000;\n  font-weight: bold;\n}\n\n.hljs-regexp,\n.hljs-symbol,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-link,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n  color: #BC6060;\n}\n\n\n/* Language color: hue: 90; */\n\n.hljs-literal {\n  color: #78A960;\n}\n\n.hljs-built_in,\n.hljs-bullet,\n.hljs-code,\n.hljs-addition {\n  color: #397300;\n}\n\n\n/* Meta color: hue: 200 */\n\n.hljs-meta {\n  color: #1f7199;\n}\n\n.hljs-meta-string {\n  color: #4d99bf;\n}\n\n\n/* Misc effects */\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n",
            "type": "text/css",
            "title": "$:/plugins/tiddlywiki/highlight/highlight.css",
            "tags": "[[$:/tags/Stylesheet]]"
        },
        "$:/plugins/tiddlywiki/highlight/highlightblock.js": {
            "title": "$:/plugins/tiddlywiki/highlight/highlightblock.js",
            "text": "/*\\\ntitle: $:/plugins/tiddlywiki/highlight/highlightblock.js\ntype: application/javascript\nmodule-type: widget\n\nWraps up the fenced code blocks parser for highlight and use in TiddlyWiki5\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TYPE_MAPPINGS_BASE = \"$:/config/HighlightPlugin/TypeMappings/\";\n\nvar CodeBlockWidget = require(\"$:/core/modules/widgets/codeblock.js\").codeblock;\n\nvar hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\n\nhljs.configure({tabReplace: \"    \"});\t\n\nCodeBlockWidget.prototype.postRender = function() {\n\tvar domNode = this.domNodes[0],\n\t\tlanguage = this.language,\n\t\ttiddler = this.wiki.getTiddler(TYPE_MAPPINGS_BASE + language);\n\tif(tiddler) {\n\t\tlanguage = tiddler.fields.text || \"\";\n\t}\n\tif(language && hljs.getLanguage(language)) {\n\t\tdomNode.className = language.toLowerCase() + \" hljs\";\n\t\tif($tw.browser && !domNode.isTiddlyWikiFakeDom) {\n\t\t\thljs.highlightBlock(domNode);\t\t\t\n\t\t} else {\n\t\t\tvar text = domNode.textContent;\n\t\t\tdomNode.children[0].innerHTML = hljs.fixMarkup(hljs.highlight(language,text).value);\n\t\t\t// If we're using the fakedom then specially save the original raw text\n\t\t\tif(domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tdomNode.children[0].textInnerHTML = text;\n\t\t\t}\n\t\t}\n\t}\t\n};\n\n})();\n",
            "type": "application/javascript",
            "module-type": "widget"
        },
        "$:/plugins/tiddlywiki/highlight/howto": {
            "title": "$:/plugins/tiddlywiki/highlight/howto",
            "text": "! Supporting Additional Languages\n \nThe [[highlight.js|https://github.com/highlightjs/highlight.js]] project supports many languages. Only a subset of these languages are supported by the plugin. It is possible for users to change the set of languages supported by the plugin by following these steps:\n \n# Go to the highlight.js project [[download page|https://highlightjs.org/download/]], select the language definitions to include, and press the Download button to download a zip archive containing customised support files for a highlight.js syntax highlighting server.\n# Locate the `highlight.pack.js` file in the highlight plugin -- on a stock Debian 8 system running Tiddlywiki5 under node-js it is located at `/usr/local/lib/node_modules/tiddlywiki/plugins/tiddlywiki/highlight/files/highlight.pack.js`.\n# Replace the plugin `highlight.pack.js` file located in step 2 with the one from the downloaded archive obtained in step 1.\n# Restart the Tiddlywiki server.\n"
        },
        "$:/plugins/tiddlywiki/highlight/license": {
            "title": "$:/plugins/tiddlywiki/highlight/license",
            "type": "text/plain",
            "text": "Copyright (c) 2006, Ivan Sagalaev\nAll rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of highlight.js nor the names of its contributors\n      may be used to endorse or promote products derived from this software\n      without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
        },
        "$:/plugins/tiddlywiki/highlight/readme": {
            "title": "$:/plugins/tiddlywiki/highlight/readme",
            "text": "This plugin provides syntax highlighting of code blocks using v9.18.1 of [[highlight.js|https://github.com/isagalaev/highlight.js]] from Ivan Sagalaev.\n\n! Usage\n\nWhen the plugin is installed it automatically applies highlighting to all codeblocks defined with triple backticks or with the CodeBlockWidget.\n\nThe language can optionally be specified after the opening triple braces:\n\n<$codeblock code=\"\"\"```css\n * { margin: 0; padding: 0; } /* micro reset */\n\nhtml { font-size: 62.5%; }\nbody { font-size: 14px; font-size: 1.4rem; } /* =14px */\nh1   { font-size: 24px; font-size: 2.4rem; } /* =24px */\n```\"\"\"/>\n\nIf no language is specified highlight.js will attempt to automatically detect the language.\n\n! Built-in Language Brushes\n\nThe plugin includes support for the following languages (referred to as \"brushes\" by highlight.js):\n\n* apache\n* arduino\n* arm assembly\n* asciidoc\n* autohotkey\n* awk\n* bash\n* cmake\n* coffeescript\n* cpp\n* cs\n* css\n* diff\n* dockerfile\n* erlang\n* elixir\n* fortran\n* go\n* gradle\n* haskell\n* html\n* http\n* ini\n* intel x86 assembly\n* java\n* javascript\n* json\n* kotlin\n* less\n* lua\n* makefile\n* markdown\n* mathematica\n* matlab\n* nginx\n* objectivec\n* perl\n* php\n* plaintext\n* powershell\n* properties\n* python\n* R\n* ruby\n* rust\n* scss\n* shell session\n* sql\n* swift\n* toml\n* typescript\n* vala\n* vim script\n* xml\n* yaml\n\nYou can also specify the language as a MIME content type (eg `text/html` or `text/css`). The mapping is accomplished via mapping tiddlers whose titles start with `$:/config/HighlightPlugin/TypeMappings/`.\n"
        },
        "$:/plugins/tiddlywiki/highlight/styles": {
            "title": "$:/plugins/tiddlywiki/highlight/styles",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": ".hljs {\n  display: block;\n  overflow-x: auto;\n  padding: 0.5em;\n  background: <<colour tiddler-editor-background>>;\n  color: <<colour foreground>>;\n  -webkit-text-size-adjust:none\n}\n\n.hljs-comment,\n.hljs-quote {\n  color: #93a1a1;\n}\n\n/* Solarized Green */\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-addition {\n  color: #859900;\n}\n\n/* Solarized Cyan */\n.hljs-number,\n.hljs-string,\n.hljs-meta .hljs-meta-string,\n.hljs-literal,\n.hljs-doctag,\n.hljs-regexp {\n  color: #2aa198;\n}\n\n/* Solarized Blue */\n.hljs-title,\n.hljs-section,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n  color: #268bd2;\n}\n\n/* Solarized Yellow */\n.hljs-attribute,\n.hljs-attr,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-class .hljs-title,\n.hljs-type {\n  color: #b58900;\n}\n\n/* Solarized Orange */\n.hljs-symbol,\n.hljs-bullet,\n.hljs-subst,\n.hljs-meta,\n.hljs-meta .hljs-keyword,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-link {\n  color: #cb4b16;\n}\n\n/* Solarized Red */\n.hljs-built_in,\n.hljs-deletion {\n  color: #dc322f;\n}\n\n.hljs-formula {\n  background: #eee8d5;\n}\n\n.hljs-emphasis {\n  font-style: italic;\n}\n\n.hljs-strong {\n  font-weight: bold;\n}\n"
        },
        "$:/plugins/tiddlywiki/highlight/usage": {
            "title": "$:/plugins/tiddlywiki/highlight/usage",
            "text": "! Usage\n\nFenced code blocks can have a language specifier added to trigger highlighting in a specific language. Otherwise heuristics are used to detect the language.\n\n```\n ```js\n var a = b + c; // Highlighted as JavaScript\n ```\n```\n! Adding Themes\n\nYou can add themes from highlight.js by copying the CSS to a new tiddler and tagging it with [[$:/tags/Stylesheet]]. The available themes can be found on GitHub:\n\nhttps://github.com/isagalaev/highlight.js/tree/master/src/styles\n"
        }
    }
}
pshiue-lamrim2
no
<pre>/* Tweak headings h2, h3, 4h / !!, !!!, !!!! */
.tc-tiddler-body h2 {margin-bottom:-.2em; margin-top:1.2em;}
.tc-tiddler-body h3 {margin-bottom:-.4em; margin-top:1.4em;}
.tc-tiddler-body h4 {margin-bottom:-.6em; margin-top:1.6em; font-weight:bold;}

/* Editor preview remove top spacing */
.tc-tiddler-preview-preview p { margin-top:0; }

/* Navigate bottom tiddler to viewport top */
.tc-story-river { margin-bottom:60vh; }

/* Enable [[|link for inappropriate title]] */
.tc-tiddlylink:empty:after {
  content:"🡕";
  font-style:normal;
  margin-left:-2px;
}

/* TW-version added to site title */
.tc-site-title:before {
  content:"TW <<version>>";
  position:absolute;
  margin-top:-1.9em;
  color:silver;
  font-size:13px;
}
</pre>
學習筆記
竹19增283班
yes
$:/core/ui/SideBar/Recent
yes
yes
no
no


$:/themes/nico/notebook
{
    "tiddlers": {
        "$:/themes/nico/notebook/LICENSE": {
            "title": "$:/themes/nico/notebook/LICENSE",
            "created": "20200419141443144",
            "modified": "20210118213330307",
            "tags": "",
            "type": "text/vnd.tiddlywiki",
            "text": "\nMIT License Copyright (c) 2020 [[Nicolas Petton|https://nicolas.petton.fr]] nicolas@petton.fr\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice (including the next\nparagraph) shall be included in all copies or substantial portions of the\nSoftware.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS\nOR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF\nOR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
        },
        "$:/themes/nico/notebook/themetweaks": {
            "title": "$:/themes/nico/notebook/themetweaks",
            "created": "20201217172915960",
            "modified": "20210123211851680",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ThemeTweaks/ThemeTweaks}}",
            "text": "\\define lingo-base() $:/language/ThemeTweaks/\n\nYou can tweak certain aspects of the ''Notebook'' theme.\n\n! <<lingo Options>>\n\n|<$link to=\"$:/themes/nico/notebook/options/stickytitles\"><<lingo Options/StickyTitles>></$link><br>//<<lingo Options/StickyTitles/Hint>>// |<$select tiddler=\"$:/themes/nico/notebook/options/stickytitles\"><option value=\"no\">{{$:/language/No}}</option><option value=\"yes\">{{$:/language/Yes}}</option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><<lingo Options/CodeWrapping>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><option value=\"pre\">{{$:/language/No}}</option><option value=\"pre-wrap\">{{$:/language/Yes}}</option></$select> |\n|<$link to=\"$:/themes/nico/notebook/options/reveal-tiddler-controls-on-hover\">Reveal tiddler controls on mouseover</$link> |<$select tiddler=\"$:/themes/nico/notebook/options/reveal-tiddler-controls-on-hover\"><option value=\"no\">{{$:/language/No}}</option><option value=\"yes\">{{$:/language/Yes}}</option></$select> |\n\n! <<lingo Settings>>\n\n|<$link to=\"$:/themes/nico/notebook/settings/fontfamily\"><<lingo Settings/FontFamily>></$link> |<$edit-text tiddler=\"$:/themes/nico/notebook/settings/fontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/nico/notebook/settings/codefontfamily\"><<lingo Settings/CodeFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/nico/notebook/settings/codefontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/nico/notebook/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/nico/notebook/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n\n! <<lingo Metrics>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\"><<lingo Metrics/FontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\"><<lingo Metrics/LineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\"><<lingo Metrics/BodyFontSize>></$link> |<$edit-text tiddler=\"$:/themes/nico/notebook/metrics/bodyfontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\"><<lingo Metrics/BodyLineHeight>></$link> |<$edit-text tiddler=\"$:/themes/nico/notebook/metrics/bodylineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\"><<lingo Metrics/SidebarBreakpoint>></$link><br>//<<lingo Metrics/SidebarBreakpoint/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/nico/notebook/metrics/sidebar-width\"><<lingo Metrics/SidebarWidth>></$link><br>//<<lingo Metrics/SidebarWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/nico/notebook/metrics/sidebar-width\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/nico/notebook/metrics/story-width\"><<lingo Metrics/StoryWidth>></$link><br>//<<lingo Metrics/StoryWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/nico/notebook/metrics/story-width\" default=\"\" tag=\"input\"/> |\n\n"
        },
        "$:/themes/nico/notebook/base": {
            "title": "$:/themes/nico/notebook/base",
            "created": "20200419141443144",
            "modified": "20210120224227503",
            "tags": "$:/tags/Stylesheet",
            "type": "text/vnd.tiddlywiki",
            "text": "\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n\\define if-sidebar(text)\n  <$reveal state=\"$:/state/notebook-sidebar\" type=\"match\" text=\"yes\">\n    $text$\n  </$reveal>\n\\end\n\n\\define if-reveal-tiddler-controls-on-hover(text)\n  <$reveal state=\"$:/themes/nico/notebook/options/reveal-tiddler-controls-on-hover\" type=\"match\" text=\"yes\">\n    $text$\n  </$reveal>\n\\end\n  \n/* Top and bottom bars */\n\n/* Hide the top-right bar */\n.tc-topbar.tc-topbar-right {\n  display: none;\n}\n\ndiv.tc-sidebar-header {\n  padding: 0;\n  min-height: 0;\n}\n\n.tc-story-river {\n  padding: 6px 0 !important;\n  width: 100% !important;\n  max-width: {{$:/themes/nico/notebook/metrics/story-width}} !important;\n  margin: 0 auto !important;\n  margin-top: 34px !important;\n}\n\ndiv.tc-tiddler-frame {\n  width: 100%;\n  margin: 20px 0;\n  background: <<colour tiddler-background>>;\n  box-shadow: 0 5px 20px rgba(0,0,0, 0.12);\n  border-radius: 6px;\n  padding: 42px 60px 60px 60px;\n}\n\nh1.tc-site-title {\n  margin-top: 14px;\n  font-size: 1.5em !important;\n}\n\n.nc-bar {\n  padding: 10px;\n  height: {{$:/themes/nico/notebook/metrics/topbar-height}};\n  background: <<colour page-background>>;\n  display: flex;\n  justify-content: space-between;\n}\n\n.nc-topbar-wrapper {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  /* The z-index needs to be above the z-index used in tiddlers in zoomin view */\n  z-index: 501;\n}\n\n.nc-bar.nc-topbar {\n  top: 0;\n  background: <<colour page-background>>ee;\n  max-width: calc({{$:/themes/nico/notebook/metrics/story-width}} + 40px);\n  padding: 10px 20px;\n  margin: 0 auto;\n}\n\n.nc-bar.nc-bottombar {\n  position: fixed;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  /* The z-index needs to be above the z-index used in tiddlers in zoomin view */\n  z-index: 501;\n}\n\n.nc-bar .left svg {\n  fill: <<colour sidebar-controls-foreground>>;\n}\n\n.nc-bar input[type=\"search\"] {\n  width: 200px;\n  padding: .6em 1em;\n  margin-top: -.2em;\n  background: <<colour sidebar-button-foreground>>44;\n  color: <<colour foreground>>cc;\n  transition: all ease-in .2s;\n  border: 1px solid transparent;\n  outline: 0;\n}\n\n.nc-bar input[type=\"search\"]:focus {\n  width: 300px;\n  background: <<colour tiddler-background>>;\n  color: <<colour foreground>>;\n  border: 1px solid <<colour primary>>;\n  box-shadow: 0 0 .2rem 0 <<colour primary>>;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: auto;\n}\n\n.nc-bar .tc-block-dropdown.tc-search-drop-down {\n  margin-left: 0;\n  width: 400px;\n  border: 0;\n  box-shadow: 0 0 6px 0 rgba(0,0,0,.2);\n  border-radius: 6px;\n  padding: 20px 0;\n}\n\n.nc-bar p {\n  margin: 0;\n}\n\n.nc-bar .tc-page-controls {\n  margin-top: 0;\n}\n\n.nc-bar .tc-page-controls button {\n  margin-right: .8em;\n}\n\n.nc-bar .tc-page-controls button .tc-btn-text {\n  font-size: 14px;\n}\n\n.nc-bar .tc-block-dropdown {\n  max-height: 70vh;\n  overflow: auto;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n  .nc-topbar {\n    display: none;\n  }\n\n  .tc-story-river {\n    padding: 0 !important;\n    margin-top: 0 !important;\n    margin-bottom: 60px !important;\n  }\n\n  div.tc-tiddler-frame {\n    margin: 0;\n    box-shadow: none;\n    border-radius: 0;\n    border-top: 0;\n  }\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n  .nc-bottombar {\n    display: none;\n  }\n}\n\n@media(max-width: 1100px) {\n  .nc-bar input[type=\"search\"] {\n    width: 200px;\n  }\n}\n\n/* Sidebar */\n\n@keyframes sidebar-appear {\n  0%   {\n    left: -{{$:/themes/nico/notebook/metrics/sidebar-width}};\n  }\n  100% {\n    left: 0;\n  }\n}\n\n<<if-sidebar \"\"\"\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n  .nc-sidebar {\n    animation: sidebar-appear .14s;\n    padding-top: 10px;\n  }\n}\n\"\"\">>\n\n.nc-sidebar {\n  background: <<colour tiddler-background>>;\n  border-right: 1px solid <<colour tiddler-border>>;\n  width: {{$:/themes/nico/notebook/metrics/sidebar-width}};\n  overflow-y: auto;\n  overflow-x: hidden;\n  z-index: 500;\n}\n\n.nc-sidebar .segment {\n  border-bottom: 1px solid rgba(0,0,0,.1);\n}\n\n.nc-sidebar ol {\n  margin: 0;\n  padding: 0;\n  list-style: none;\n  line-height: 1.8em;\n}\n\n.nc-sidebar ol ol {\n  padding-left: 18px;\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n  .mobile-only {\n    display: none;\n  }\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n  .desktop-only {\n    display: none;\n  }\n}\n\n.nc-sidebar h1.tc-site-title {\n  margin: 0;\n}\n\n.nc-sidebar p {\n  margin: 6px 0;\n}\n\n.nc-sidebar .tc-site-subtitle {\n  color: <<colour site-title-foreground>>;\n}\n\n.nc-sidebar .section .label {\n  padding: 2px 0;\n  color: <<colour site-title-foreground>>;\n  fill: <<colour site-title-foreground>>;\n  font-weight: bold;\n  line-height: 1.6em;\n  display: block;\n  width: 100%;\n  text-align: left;\n  padding: 8px 15px;\n  border-radius: 0;\n}\n\n.nc-sidebar .section:not(.open) .label:hover {\n  background: rgba(0,0,0,.06);\n}\n\n.nc-sidebar .section.open .label {\n  color: <<colour tiddler-background>>;\n  fill: <<colour tiddler-background>>;\n  background: <<colour primary>>;\n  border-bottom: 1px solid rgba(0,0,0,.1);\n}\n\n.nc-sidebar .section .label .caret {\n  display: inline-block;\n  width: 15px;\n  float: right;\n}\n\n.nc-sidebar .content {\n  padding: 6px 15px;\n  font-size: 1em;\n}\n\n.nc-sidebar .tc-tiddlylink {\n  color: <<colour primary>>;\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n  .nc-sidebar {\n    position: fixed;\n    left: 0;\n    top:  0;\n    bottom: 0;\n  }\n}\n\n<<if-sidebar \"\"\"\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n  @keyframes sidebar-slide {\n    0%   {\n      left: -100vw;\n    }\n    100% {\n      left: 0;\n    }\n  }\n  .nc-sidebar {\n    overflow: auto;\n    position: fixed;\n    width: 100%;\n    left: 0;\n    top: 0;\n    bottom: 48px;\n    z-index: 3000;\n    animation: sidebar-slide ease-in .2s;\n    animation-fill-mode: forwards;\n  }\n}\n\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n  .tc-page-container {\n    margin-left: {{$:/themes/nico/notebook/metrics/sidebar-width}} !important;\n  }\n\n  .nc-topbar-wrapper {\n    left: {{$:/themes/nico/notebook/metrics/sidebar-width}};\n  }\n}\n\"\"\">>\n\n/* Animate the hamburger button */\n\n@keyframes menu-bars-1 {\n  0%   {}\n  100% {\n    transform: rotate(-45deg) translateY(-10px) translateX(-6px);\n    fill: <<colour foreground>>;\n  }\n}\n\n@keyframes menu-bars-2 {\n  0%   {}\n  100% { opacity: 0; }\n}\n\n@keyframes menu-bars-3 {\n  0%   {}\n  100% {\n    transform: rotate(45deg) translateY(6px) translateX(2px);\n    fill: <<colour foreground>>;\n  }\n}\n\n.sidebar-toggle {\n  /* position: fixed; */\n  /* top: 6px; */\n  /* left: 6px; */\n  /* z-index: 600; */\n  /* padding: 4px; */\n  /* border-radius: 8px; */\n  margin-right: 10px;\n  transition: all ease-in-out .2s;\n  fill: <<colour sidebar-controls-foreground>>;\n}\n\n.sidebar-toggle:hover,\n.sidebar-toggle.open {\n  fill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n/* @media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) { */\n/*   .sidebar-toggle { */\n/*     top: auto; */\n/*     bottom: 10px; */\n/*     left: 10px; */\n/*   } */\n/* } */\n\n.sidebar-toggle .bars .bar {\n    transform: rotate(0) translateY(0) translateX(0);\n    opacity: 1;\n    transform-origin: 20px 10px;\n    transition: transform 0.4s ease-in-out, opacity 0.2s ease-in-out, fill .4s ease-in-out;\n}\n\n.sidebar-toggle .bars .bar:nth-of-type(3) {\n    transform-origin: 20px 20px;\n}\n\n.sidebar-toggle.open .bars .bar:nth-of-type(1) {\n  animation: menu-bars-1 .6s;\n  animation-fill-mode: forwards;\n}\n.sidebar-toggle.open .bars .bar:nth-of-type(2) {\n  animation: menu-bars-2 .6s;\n  animation-fill-mode: forwards;\n}\n.sidebar-toggle.open .bars .bar:nth-of-type(3) {\n  animation: menu-bars-3 .6s;\n  animation-fill-mode: forwards;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n  div.tc-tiddler-frame {\n    padding: 14px;\n  }\n}\n\n/* Inputs */\n\ninput, textarea {\n  transition: border .14s ease-in-out;\n  background: <<colour tiddler-editor-background>>;\n  border: 1px solid <<colour tiddler-editor-border>>;\n  padding: .5em;\n  border-radius: 4px;\n}\n\ninput:focus, textarea:focus {\n  box-shadow: 0 0 0.2rem 0 <<colour primary>>;\n  outline: 0;\n  border-color: <<colour primary>>;\n}\n\nbutton {\n  border-radius: 1.5em;\n  border: 1px solid #ccc;\n  background: <<colour tiddler-background>>;\n  padding: .3em 1em;\n  cursor: pointer;\n  transition: box-shadow ease-in .1s;\n  color: <<color foreground>>;\n}\n\nbutton:focus, button:active {\n  outline: 0 none;\n}\n\nbutton.tc-btn-invisible {\n  border-radius: 0;\n}\n\n.tc-editor-toolbar button,\n.tc-editor-toolbar button.tc-btn-invisible {\n  border-radius: 3px;\n  background: <<colour tiddler-editor-background>>;\n  color: <<colour foreground>>;\n  fill: <<colour foreground>>;\n  border: 1px solid <<colour tiddler-editor-border>>;\n}\n\n.tc-editor-toolbar button:hover,\n.tc-editor-toolbar button:active {\n  border-color: <<colour primary>>;\n  background: <<colour primary>>;\n  color: <<colour background>>;\n  fill: <<colour background>>;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor,\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n  transition: border .14s ease-in-out;\n  border: 1px solid <<colour tiddler-editor-border>>;\n  background: <<colour tiddler-editor-background>>;\n  padding: 4px;\n  border-radius: 4px;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor:focus,\n.tc-tiddler-frame textarea.tc-edit-texteditor:focus,\n.tc-tiddler-frame iframe.tc-edit-texteditor:focus {\n  box-shadow: 0 0 0.2rem 0 <<colour primary>>;\n  outline: 0;\n  border-color: <<colour primary>>;\n}\n\n.tc-tiddler-controls .tc-btn-text {\n    font-size: 16px;\n}\n\n<<if-reveal-tiddler-controls-on-hover \"\"\"\n@media (min-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n  .tc-tiddler-frame .tc-tiddler-controls svg {\n    opacity: 0;\n    transition: all .2s ease-in;\n  }\n\n  .tc-tiddler-controls svg.tc-image-close-button,\n  .tc-tiddler-controls .py-toggle-todo-button svg,\n  .tc-tiddler-controls svg.tc-image-done-button,\n  .tc-tiddler-frame .tc-tiddler-controls:hover svg {\n    opacity: 1;\n  }\n\n  .tc-tiddler-controls .py-toggle-todo-button .done svg {\n    fill: #2da562;\n  }\n}\n\"\"\">>\n\nbutton.tc-tag-label, span.tc-tag-label {\n  padding: 0.3em 1em !important;\n}\n\n/* Fonts */\n\nhtml, body {\n  font-family: {{$:/themes/nico/notebook/settings/fontfamily}};\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor,\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n  font-family: {{$:/themes/nico/notebook/settings/editorfontfamily}};\n}\n\npre, code {\n  font-family: {{$:/themes/nico/notebook/settings/codefontfamily}};\n}\n\n.tc-titlebar, .tc-site-title {\n  font-size: 28px !important;\n  line-height: 34px !important;\n  font-weight: 600 !important;\n  letter-spacing: -0.5px !important;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  font-weight: 600;\n}\n\n.tc-tiddler-body h1,\n.tc-tiddler-body h2,\n.tc-tiddler-preview-preview h1,\n.tc-tiddler-preview-preview h2 {\n  font-weight: bold;\n}\n\ndiv.tc-tiddler-frame .tc-tiddler-body {\n  font-size: {{$:/themes/nico/notebook/metrics/bodyfontsize}};\n  line-height: {{$:/themes/nico/notebook/metrics/bodylineheight}};\n}\n\n/* Tabs */\n\ndiv.tc-tab-buttons {\n  margin-bottom: -4px;\n}\n\ndiv.tc-tab-buttons button {\n  font-weight: bold;\n  font-size: 1.2em;\n  line-height: 1em;\n  padding: .6em .8em .4em .8em;\n  border: 0;\n  border-radius: 0;\n  background: transparent;\n  cursor: pointer;\n  transition: background ease-in .2s;\n}\n\ndiv.tc-tab-buttons button:hover {\n  background: rgba(0,0,0,.03);\n}\n\ndiv.tc-tab-buttons button.tc-tab-selected {\n  border: 0;\n  background: transparent;\n  border-bottom: 4px solid <<colour primary>>;\n}\n\n/* Dropdowns */\n\n@keyframes pop {\n  0% {\n    transform: scale(0.8);\n    opacity: 0;\n  }\n\n  80% {\n    transform: scale(1.03);\n    opacity: 1;\n  }\n\n  100% {\n    transform: scale(1);\n    opacity: 1;\n  }\n}\n\n.tc-drop-down {\n  box-shadow: 0 0 10px rgba(0,0,0,.2);\n  border-radius: 6px;\n  padding: 10px 0 !important;\n  animation: pop .15s ease-in forwards;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n  padding: 3px 15px !important;\n}\n\n.tc-search-results {\n  line-height: 2em;\n}\n\n.tc-search-results em {\n  font-weight: bold;\n  font-style: normal;\n}\n\n/* Draft list */\n\n.tc-drafts-list {\n  font-size: .9em;\n  left: auto;\n  right: 0;\n}\n\n.tc-drafts-list a {\n  padding: 6px 12px;\n  font-weight: bold;\n  border-top-left-radius: 6px;\n  border-top-right-radius: 6px;\n  display: inline-block;\n}\n\n.nc-refs {\n  color: #888;\n  font-size: .9em;\n}\n\n.nc-refs h4 {\n  margin-bottom: 4px;\n}\n\n.nc-post-created {\n  color: #acacac;\n  font-size: .8em;\n}\n"
        },
        "$:/themes/nico/notebook/changelog": {
            "title": "$:/themes/nico/notebook/changelog",
            "caption": "ChangeLog",
            "created": "20201217180707912",
            "modified": "20210202214001915",
            "tags": "",
            "type": "text/vnd.tiddlywiki",
            "text": "! 1.4.1\n\n!! Fixes\n\n* Fix the transclusion mode of sidebar sections\n* Fix section title rendering for tiddlers without a caption field\n* Fix the colour of links in the sidebar when using Notebook palettes with Vanilla\n\n! 1.4.0\n\n!! Features\n\n* New redesigned topbar layout\n* Add a configuration setting for the story width\n* Add support for keyboard navigation in the search dropdown\n\n! 1.3.6\n\n!! Improvements\n\n* Improve the style of tabs\n* New animation for drop-downs\n* Use a lighter page background colour in the beige palette\n\n!! Fixes\n\n* Fix the default ctrl+shift+F shortcut for focusing the search input\n\n! 1.3.5\n\n!! Features\n\n* Add an option to reveal tiddler controls on mouseover\n\n! 1.3.4\n\n!! Improvements\n\n* Add a keyboard shortcut (alt+shift+s) to toggle Notebook sidebar\n* Add missing colours to tiddler editor fields in the dark palette\n\n!! Fixes\n\n* Fix the size of toolbar button labels when the $:/config/Toolbar/Text is set to yes\n\n! 1.3.3\n\n!! Improvements\n\n* Make the sidebar more generic by using the default sidebar sections\n\n! 1.3.2\n\n!! Improvements\n\n* Add colours for messages in the dark palette\n* Add colours for notification in the dark palette\n* Set colours for messages in the beige palette\n\n! 1.3.1\n\n!! Features\n\n* New font family settings distinct from the Vanilla theme\n\n!! Improvements\n\n* Use a slightly lighter colour as the search input background\n* Improve contrast of sidebar buttons in the dark palette\n\n!! Fixes\n\n* Fix tiddler control button colours in all three palettes\n* Fix tab colours in palette-dark\n\n! 1.3.0\n\n!! Improvements\n\n* New dark colour palette\n* Use a darker color for tiddler subtitles\n* Add back the WebKit search cancel button in search inputs\n\n!! Fixes\n\n* Fix the z-index of the topbar for the zoomin story view\n* Fix the font weight of tiddler titles in edit mode\n\n! 1.2.0\n\n!! Improvements\n\n* Better support for dark colour palettes\n\n!! Fixes\n\n* Fix rendering of overflowing/wrapping text in the sidebar\n\n! 1.1.0\n\n!! Features\n\n* New theme tweaks tab dedicated to Notebook in the control panel\n* Inputs in the edit template are now styled consistently with other inputs\n\n!! Fixes\n\n* Fixes the position of sticky tiddler titles when the option is turned on\n"
        },
        "$:/config/ShortcutInfo/notebook-focus-search": {
            "title": "$:/config/ShortcutInfo/notebook-focus-search",
            "text": "Focus on the topbar search field"
        },
        "$:/config/shortcuts/notebook-focus-search": {
            "title": "$:/config/shortcuts/notebook-focus-search",
            "text": "ctrl+shift+F"
        },
        "$:/config/Search/AutoFocus": {
            "title": "$:/config/Search/AutoFocus",
            "text": "false"
        },
        "$:/config/shortcuts/sidebar-search": {
            "title": "$:/config/shortcuts/sidebar-search",
            "text": ""
        },
        "$:/themes/nico/notebook/images/bars": {
            "title": "$:/themes/nico/notebook/images/bars",
            "created": "20200428212322206",
            "modified": "20201210210231235",
            "type": "text/vnd.tiddlywiki",
            "text": "<svg class=\"bars\" height=\"21pt\" viewBox=\"0 0 42 42\" enable-background=\"new 0 0 32 22.5\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n  <g class=\"svg-menu-toggle\" sketch:type=\"MSLayerGroup\">\n    <rect class=\"bar\" x=\"8\" y=\"28\" width=\"26\" height=\"4\"></rect>\n    <rect class=\"bar\" x=\"8\" y=\"19\" width=\"26\" height=\"4\"></rect>\n    <rect class=\"bar\" x=\"8\" y=\"10\" width=\"26\" height=\"4\"></rect>\n  </g>\n</svg>\n"
        },
        "$:/themes/nico/notebook/images/caret-down": {
            "title": "$:/themes/nico/notebook/images/caret-down",
            "created": "20200429194348688",
            "modified": "20201210210230919",
            "type": "text/vnd.tiddlywiki",
            "text": "<svg width=\"6pt\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\"><path d=\"M31.3 192h257.3c17.8 0 26.7 21.5 14.1 34.1L174.1 354.8c-7.8 7.8-20.5 7.8-28.3 0L17.2 226.1C4.6 213.5 13.5 192 31.3 192z\"/></svg>\n"
        },
        "$:/themes/nico/notebook/images/caret-right": {
            "title": "$:/themes/nico/notebook/images/caret-right",
            "created": "20200429194305719",
            "modified": "20201210210230909",
            "type": "text/vnd.tiddlywiki",
            "text": "<svg width=\"4pt\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 192 512\"><path d=\"M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z\"/></svg>\n"
        },
        "$:/themes/nico/notebook/images/color-switch": {
            "title": "$:/themes/nico/notebook/images/color-switch",
            "created": "20201210170859810",
            "creator": "nico",
            "modified": "20201210205606403",
            "modifier": "nico",
            "tags": "",
            "type": "text/vnd.tiddlywiki",
            "text": "<svg width=\"20px\" height=\"20px\" viewBox=\"0 0 16 16\" class=\"bi bi-circle-half\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n  <path fill-rule=\"evenodd\" d=\"M8 15V1a7 7 0 1 1 0 14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z\"/>\n</svg\n"
        },
        "$:/themes/nico/notebook/metrics/bodyfontsize": {
            "title": "$:/themes/nico/notebook/metrics/bodyfontsize",
            "created": "20200428203454207",
            "modified": "20201210205606363",
            "tags": "",
            "type": "text/vnd.tiddlywiki",
            "text": "15px\n"
        },
        "$:/themes/nico/notebook/metrics/bodylineheight": {
            "title": "$:/themes/nico/notebook/metrics/bodylineheight",
            "created": "20200428203454207",
            "modified": "20201210205606363",
            "tags": "",
            "type": "text/vnd.tiddlywiki",
            "text": "22px"
        },
        "$:/themes/nico/notebook/metrics/sidebar-width": {
            "title": "$:/themes/nico/notebook/metrics/sidebar-width",
            "created": "20200429144554294",
            "modified": "20201210210231246",
            "tags": "",
            "type": "text/vnd.tiddlywiki",
            "text": "350px\n"
        },
        "$:/themes/nico/notebook/metrics/story-width": {
            "title": "$:/themes/nico/notebook/metrics/story-width",
            "created": "20210123210054185",
            "modified": "20210123211911688",
            "tags": "",
            "type": "text/vnd.tiddlywiki",
            "text": "800px\n"
        },
        "$:/themes/nico/notebook/metrics/topbar-height": {
            "title": "$:/themes/nico/notebook/metrics/topbar-height",
            "created": "20200428203454207",
            "modified": "20201210205606363",
            "tags": "",
            "type": "text/vnd.tiddlywiki",
            "text": "52px\n"
        },
        "$:/themes/nico/notebook/options/stickytitles": {
            "title": "$:/themes/nico/notebook/options/stickytitles",
            "text": "no"
        },
        "$:/themes/nico/notebook/options/codewrapping": {
            "title": "$:/themes/nico/notebook/options/codewrapping",
            "text": "pre-wrap"
        },
        "$:/themes/nico/notebook/options/reveal-tiddler-controls-on-hover": {
            "title": "$:/themes/nico/notebook/options/reveal-tiddler-controls-on-hover",
            "text": "no"
        },
        "$:/core/ui/PageTemplate/sidebar": {
            "title": "$:/core/ui/PageTemplate/sidebar",
            "created": "20200430072116835",
            "modified": "20201217174129501",
            "type": "text/vnd.tiddlywiki",
            "text": "\\whitespace trim\n\\define config-title()\n$:/config/SideBarSegments/Visibility/$(listItem)$\n\\end\n\nOverwritten by $:/themes/nico/notebook so that the default sidebar does not get rendered.\n"
        },
        "$:/themes/tiddlywiki/vanilla/themetweaks": {
            "title": "$:/themes/tiddlywiki/vanilla/themetweaks",
            "caption": "{{$:/language/ThemeTweaks/ThemeTweaks}}",
            "created": "20201217163834291",
            "modified": "20201217163914434",
            "type": "text/vnd.tiddlywiki",
            "text": "Overwritten by $:/themes/nico/notebook so that the Vanilla theme tweaks do not appear in the control panel. "
        },
        "$:/themes/nico/notebook/palettes/palette-beige": {
            "title": "$:/themes/nico/notebook/palettes/palette-beige",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #c63636\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: #ddd\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: #da8548\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #3F3B3B\nmessage-background: #e6f5e8\nmessage-border: #2b5532\nmessage-foreground: #2b5532\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f5f5ee\npre-background: #f6f6f6\npre-border: #cccccc\nprimary: #7f4bca\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: #a6a69c\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: <<colour sidebar-button-foreground>>\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour primary>>\nsidebar-tiddler-link-foreground: <<colour tab-foreground>>\nsite-title-foreground: #353748\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: #888888\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #dbdbc7;\ntiddler-controls-foreground-hover: #888888;\ntiddler-controls-foreground-selected: #888888;\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: rgba(0,0,0,.2)\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #aaaaaa\ntiddler-title-foreground: #333\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n",
            "type": "application/x-tiddler-dictionary",
            "description": "A beige colour palette for Notebook",
            "name": "Notebook Beige",
            "tags": "$:/tags/Palette $:/tags/notebook/Palette"
        },
        "$:/themes/nico/notebook/palettes/palette-dark": {
            "title": "$:/themes/nico/notebook/palettes/palette-dark",
            "text": "alert-background: #643b43\nalert-border: #3f181f\nalert-highlight: #881122\nalert-muted-foreground: #bc8b94\nbackground: #383e49\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-border:\nbutton-foreground:\ncode-background: #2c323b\ncode-border: #111\ncode-foreground: #dd1144\ndirty-indicator: #c63636\ndownload-background: #98be65\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: #111\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: #da8548\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #61afef\nexternal-link-foreground: #c678dd\nforeground: #c8ced8\nmessage-background: #2c323e\nmessage-border: #111\nmessage-foreground: #d5e2f1\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #3a5e39\nnotification-border: #192c19\npage-background: #262b33\npre-background: <<colour page-background>>\npre-border: <<colour tiddler-border>>\nprimary: #bf93ff\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: #5e646f\nsidebar-controls-foreground-hover: #cad2e5\nsidebar-controls-foreground: <<colour sidebar-button-foreground>>\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #cad2e5\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour tab-background-selected>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour primary>>\nsidebar-tiddler-link-foreground: <<colour tab-foreground>>\nsite-title-foreground: <<colour foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour page-background>>\ntab-border-selected: <<colour foreground>>\ntab-border: #cad2e5\ntab-divider: #cad2e5\ntab-foreground-selected: #ecf2ff\ntab-foreground: #cad2e5\ntable-border: #aaaaaa\ntable-footer-background: #a8a8a8\ntable-header-background: #262b33\ntag-background: #fcb671\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #111\ntiddler-controls-foreground-hover: #cad2e5\ntiddler-controls-foreground-selected: #cad2e5\ntiddler-controls-foreground: #5e646f\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: rgba(255, 255, 255, 0.3)\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: #2c323b\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #aaaaaa\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-cancel-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-done-button:\ntoolbar-edit-button:\ntoolbar-info-button:\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n",
            "type": "application/x-tiddler-dictionary",
            "description": "A dark colour palette for Notebook",
            "name": "Notebook Dark",
            "tags": "$:/tags/Palette $:/tags/notebook/Palette"
        },
        "$:/themes/nico/notebook/palettes/palette-grey": {
            "title": "$:/themes/nico/notebook/palettes/palette-grey",
            "text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #c63636\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: #ddd\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: #da8548\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #283c46\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f4f4f4\npre-background: #f6f6f6\npre-border: #cccccc\nprimary: #127edd\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: #a6a69c\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: <<colour sidebar-button-foreground>>\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour primary>>\nsidebar-tiddler-link-foreground: <<colour tab-foreground>>\nsite-title-foreground: #353748\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: #888888\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #ddd\ntiddler-controls-foreground-hover: #888888;\ntiddler-controls-foreground-selected: #888888;\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: rgba(0,0,0,.2)\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #aaaaaa\ntiddler-title-foreground: #333\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n",
            "type": "application/x-tiddler-dictionary",
            "description": "A grey color palette for Notebook",
            "name": "Notebook Grey",
            "tags": "$:/tags/Palette $:/tags/notebook/Palette"
        },
        "$:/themes/nico/notebook/settings/codefontfamily": {
            "title": "$:/themes/nico/notebook/settings/codefontfamily",
            "created": "20210101213404232",
            "modified": "20210101214210227",
            "tags": "",
            "type": "text/vnd.tiddlywiki",
            "text": "\"Fira Mono\",\"Liberation Mono\",Menlo,Courier,monospace\n"
        },
        "$:/themes/nico/notebook/settings/fontfamily": {
            "title": "$:/themes/nico/notebook/settings/fontfamily",
            "created": "20210101213404232",
            "modified": "20210101213411800",
            "tags": "",
            "type": "text/vnd.tiddlywiki",
            "text": "\"Segoe UI\",Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",\"Segoe UI Symbol\"\n"
        },
        "$:/themes/nico/notebook/shortcuts/notebook-focus-search": {
            "title": "$:/themes/nico/notebook/shortcuts/notebook-focus-search",
            "created": "20201210122048919",
            "key": "((notebook-focus-search))",
            "modified": "20210115130024907",
            "tags": "$:/tags/KeyboardShortcut",
            "type": "text/vnd.tiddlywiki",
            "text": "<$action-sendmessage $message=\"tm-focus-selector\" $param=\".nc-topbar input\"/>\n"
        },
        "$:/themes/nico/notebook/shortcuts/toggle-sidebar": {
            "title": "$:/themes/nico/notebook/shortcuts/toggle-sidebar",
            "created": "20210115130000707",
            "key": "((toggle-sidebar))",
            "modified": "20210115130021883",
            "tags": "$:/tags/KeyboardShortcut",
            "type": "text/vnd.tiddlywiki",
            "text": "<$list\n  filter=\"[[$:/state/notebook-sidebar]is[missing]] [{$:/state/notebook-sidebar}removeprefix[yes]]\"\n  emptyMessage=\"\"\"<$action-setfield $tiddler=\"$:/state/notebook-sidebar\" text=\"yes\"/>\"\"\"\n>\n  <$action-setfield $tiddler=\"$:/state/notebook-sidebar\" text=\"no\"/>\n</$list>\n"
        },
        "$:/themes/nico/notebook/stickytitles": {
            "title": "$:/themes/nico/notebook/stickytitles",
            "created": "20201217172915960",
            "modified": "20201217180034682",
            "tags": "$:/tags/Stylesheet",
            "text": "<$reveal state=\"$:/themes/nico/notebook/options/stickytitles\" type=\"match\" text=\"yes\">\n\n.tc-tiddler-title {\n  position: -webkit-sticky;\n  position: -moz-sticky;\n  position: -o-sticky;\n  position: -ms-sticky;\n  position: sticky;\n  top: {{$:/themes/nico/notebook/metrics/topbar-height}};\n  background: <<colour tiddler-background>>;\n  z-index: 500;\n}\n\n@media (max-width: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}) {\n  .tc-tiddler-title {\n    top: 0;\n  }\n}\n\n<$list filter=\"[range[100]]\">\n`.tc-story-river .tc-tiddler-frame:nth-child(100n+`<$text text=<<currentTiddler>>/>`) {\nz-index: `<$text text={{{ [[200]subtract<currentTiddler>] }}}/>`;\n}\n`\n</$list>\n</$reveal>\n"
        },
        "$:/themes/nico/notebook/tags/Sidebar": {
            "title": "$:/themes/nico/notebook/tags/Sidebar",
            "created": "20200429164516951",
            "list": "$:/themes/nico/notebook/ui/Buttons/menu $:/themes/nico/notebook/ui/Sidebar/Headings $:/themes/nico/notebook/ui/Sidebar/Search $:/themes/nico/notebook/Sidebar/Sections",
            "modified": "20201210205606504",
            "type": "text/vnd.tiddlywiki"
        },
        "$:/themes/nico/notebook/tags/SidebarSection": {
            "title": "$:/themes/nico/notebook/tags/SidebarSection",
            "created": "20200429201017275",
            "list": "$:/themes/nico/notebook/ui/Sidebar/Open $:/themes/nico/notebook/ui/Sidebar/Recent $:/themes/nico/notebook/ui/Sidebar/Tools $:/themes/nico/notebook/ui/Sidebar/More",
            "modified": "20201210215658901",
            "type": "text/vnd.tiddlywiki"
        },
        "$:/themes/nico/notebook/ui/Bottombar": {
            "title": "$:/themes/nico/notebook/ui/Bottombar",
            "created": "20200429113453340",
            "modified": "20201210210230886",
            "tags": "$:/tags/PageTemplate",
            "type": "text/vnd.tiddlywiki",
            "text": "<$reveal state=\"$:/state/notebook-bottombar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\" animate=\"yes\">\n  <div class=\"nc-bar nc-bottombar\">\n    <$list filter=\"[all[shadows+tiddlers]tag[$:/tags/NotebookTopbar]!has[draft.of]]\" variable=\"listItem\">\n      <$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"  tag=\"div\">\n        <$transclude tiddler=<<listItem>> mode=\"block\"/>\n      </$reveal>\n    </$list>\n    <div class=\"left\">\n      {{$:/themes/nico/notebook/ui/Buttons/menu}}\n    </div>\n    <div class=\"right\">\n      {{$:/core/ui/SideBarSegments/page-controls}}\n    </div>\n  </div>\n</$reveal>\n\n"
        },
        "$:/themes/nico/notebook/ui/Buttons/SwitchPalette": {
            "title": "$:/themes/nico/notebook/ui/Buttons/SwitchPalette",
            "created": "20201210171047824",
            "description": "Toggle between grey/beige colour palette",
            "modified": "20210118213335643",
            "tags": "$:/tags/PageControls",
            "type": "text/vnd.tiddlywiki",
            "text": "<span class=\"desktop-only\">\n  <$vars\n    palettes=\"[all[tiddlers+shadows]tag[$:/tags/notebook/Palette]]\"\n    popupTiddler=<<qualify \"$:/state/notebook/palette-dropdown\">>\n  >\n    <$button\n      popup=<<popupTiddler>>\n      tooltip=\"Switch colours\"\n      aria-label=\"Switch colours\"\n      class=<<tv-config-toolbar-class>>\n    >\n      <$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n\t{{$:/themes/nico/notebook/images/color-switch}}\n      </$list>\n\n      <$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n\t<span class=\"tc-btn-text\">Switch colours</span>\n      </$list>\n\n      <$reveal state=<<popupTiddler>> type=\"popup\" position=\"belowleft\" class=\"tc-drop-down\">\n\t<$list filter=<<palettes>>>\n\t  <$button class=\"tc-btn-invisible\">\n\t    {{!!name}}\n\t    <$action-setfield $tiddler=\"$:/palette\" text={{!!title}}/>\n\t  </$button>\n\t</$list>\n      </$reveal>\n\n    </$button>\n  </$vars>\n</span>\n"
        },
        "$:/themes/nico/notebook/ui/Buttons/menu": {
            "title": "$:/themes/nico/notebook/ui/Buttons/menu",
            "created": "20200429115248943",
            "modified": "20210124211756417",
            "tags": "",
            "type": "text/vnd.tiddlywiki",
            "text": "<$reveal state=\"$:/state/notebook-sidebar\" type=\"match\" text=\"yes\" default=\"no\" retain=\"yes\" animate=\"no\">\n  <$button set=\"$:/state/notebook-sidebar\" setTo=\"no\" tooltip=\"Toggle menu\" class=\"tc-btn-invisible sidebar-toggle open\">\n    {{$:/themes/nico/notebook/images/bars}}\n  </$button>\n</$reveal>\n\n<$reveal type=\"nomatch\" state=\"$:/state/notebook-sidebar\" text=\"yes\">\n  <$button set=\"$:/state/notebook-sidebar\" setTo=\"yes\" tooltip=\"Toggle menu\" class=\"tc-btn-invisible sidebar-toggle\">\n    {{$:/themes/nico/notebook/images/bars}}\n  </$button>\n</$reveal>\n"
        },
        "$:/themes/nico/notebook/ui/Search": {
            "title": "$:/themes/nico/notebook/ui/Search",
            "created": "20200429191943257",
            "modified": "20210126170723413",
            "type": "text/vnd.tiddlywiki",
            "text": "\\define advanced-search-actions()\n<$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/notebook-search}}/>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n\\end\n\n\\define input-accept-actions()\n<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\">\n  <$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/>\n  <$action-deletetiddler $filter=\"[[$:/temp/search]] [<searchTiddler>] [<searchListState>]\"/>\n</$list>\n\\end\n\n\\define cancel-search-actions()\n<$list filter=\"[<searchTiddler>get[text]!match{$:/temp/search}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/search]] [<searchTiddler>] [<searchListState>]\"/>\"\"\">\n  <$action-setfield $tiddler=\"$:/temp/search\" text={{{ [<searchTiddler>get[text]] }}}/>\n  <$action-setfield $tiddler=\"$:/temp/search/refresh\" text=\"yes\"/></$list>\n\\end\n\n<$vars editTiddler=\"$:/temp/search\"\n       searchTiddler=\"$:/temp/search/input\"\n       searchListState=<<qualify \"$:/state/search-list/selected-item\">>>\n  <$macrocall $name=\"keyboard-driven-input\"\n\t      tiddler=<<editTiddler>>\n\t      storeTitle=<<searchTiddler>>\n\t      selectionStateTitle=<<searchListState>>\n\t      refreshTitle=\"$:/temp/search/refresh\"\n\t      type=\"search\"\n\t      tag=\"input\"\n\t      focus={{$:/config/Search/AutoFocus}}\n\t      focusPopup=\"$:/state/popup/notebook-search\"\n\t      class=\"tc-popup-handle\"\n\t      filterMinLength={{$:/config/Search/MinLength}}\n\t      placeholder=\"Search...\"\n\t      inputAcceptActions=<<input-accept-actions>>\n\t      inputCancelActions=<<cancel-search-actions>>\n\t      cancelPopups=\"yes\"\n\t      configTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\"\n\t      />\n  <$button\n    tooltip={{$:/language/Buttons/AdvancedSearch/Hint}}\n    aria-label={{$:/language/Buttons/AdvancedSearch/Caption}}\n    class=\"tc-btn-invisible tc-page-controls\"\n    >\n    {{$:/core/images/advanced-search-button}}\n    <<advanced-search-actions>>\n  </$button>\n  <$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=\"$:/state/popup/notebook-search\" type=\"nomatch\" text=\"\" default=\"\">\n    <$list filter=\"[<searchTiddler>get[text]minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\" variable=\"listItem\">\n      <div class=\"tc-block-dropdown tc-search-drop-down\">\n        <$tiddler tiddler=<<configTiddler>>>\n          {{$:/themes/nico/notebook/ui/Sidebar/SearchResults}}\n        </$tiddler>\n      </div>\n    </$list>\n  </$reveal>\n</$vars>\n"
        },
        "$:/themes/nico/notebook/ui/Sidebar/Headings": {
            "title": "$:/themes/nico/notebook/ui/Sidebar/Headings",
            "created": "20200429160014174",
            "modified": "20201210210231267",
            "tags": "$:/themes/nico/notebook/tags/Sidebar",
            "type": "text/vnd.tiddlywiki",
            "text": "<div class=\"segment\">\n  <div class=\"content\">\n    <h1 class=\"tc-site-title\">\n      {{$:/SiteTitle}}\n    </h1>\n    <div class=\"tc-site-subtitle\">\n      {{$:/SiteSubtitle}}\n    </div>\n  </div>\n</div>\n"
        },
        "$:/themes/nico/notebook/ui/Sidebar/Search": {
            "title": "$:/themes/nico/notebook/ui/Sidebar/Search",
            "created": "20200429191943257",
            "modified": "20210124220152702",
            "tags": "$:/themes/nico/notebook/tags/Sidebar",
            "type": "text/vnd.tiddlywiki",
            "text": "<div class=\"mobile-only\">\n  <div class=\"segment\">\n    <div class=\"content search\">\n      {{$:/themes/nico/notebook/ui/Search}}\n    </div>\n  </div>\n</div>\n"
        },
        "$:/themes/nico/notebook/ui/Sidebar/SearchResults": {
            "title": "$:/themes/nico/notebook/ui/Sidebar/SearchResults",
            "created": "20200429191943257",
            "modified": "20210126164631418",
            "tags": "",
            "type": "text/vnd.tiddlywiki",
            "text": "\\define searchResultList()\n  <small>{{$:/language/Search/Matches/Title}}</small>\n\n  <$list filter=\"[!is[system]search:title{$(searchTiddler)$}sort[title]limit[250]]\">\n    <span class={{{[<currentTiddler>addsuffix[-primaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n      <$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n    </span>\n  </$list>\n\n  <small>{{$:/language/Search/Matches/All}}</small>\n\n  <$list filter=\"[!is[system]search{$(searchTiddler)$}sort[title]limit[250]]\">\n    <span class={{{[<currentTiddler>addsuffix[-secondaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n      <$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n    </span>\n  </$list>\n\\end\n\n<div class=\"tc-search-results\">\n  <<searchResultList>>\n</div>\n"
        },
        "$:/themes/nico/notebook/ui/Sidebar/SectionTemplate": {
            "title": "$:/themes/nico/notebook/ui/Sidebar/SectionTemplate",
            "created": "20200429161226897",
            "modified": "20210202213859460",
            "type": "text/vnd.tiddlywiki",
            "text": "\\define sidebarHeading()\n<$vars tv-wikilinks=\"no\">\n  <$transclude field=\"caption\">\n    <$view field=\"title\"/>\n  </$transclude>\n</$vars>\n\\end\n\n<$reveal state=\"$:/state/notebook-sidebar-section\" type=\"match\" text=<<currentTiddler>> default=\"no\" animate=\"no\">\n  <div class=\"segment section open\">\n    <$button set=\"$:/state/notebook-sidebar-section\" setTo=\"\" class=\"tc-btn-invisible label\">\n      <<sidebarHeading>>\n      <span class=\"caret\">{{$:/themes/nico/notebook/images/caret-down}}</span>\n    </$button>\n    <div class=\"content\">\n      <$transclude $tiddler=<<currentTiddler>> mode=\"block\"/>\n    </div>\n  </div>\n</$reveal>\n<$reveal state=\"$:/state/notebook-sidebar-section\" type=\"nomatch\" text=<<currentTiddler>> default=\"yes\" animate=\"no\">\n  <div class=\"segment section\">\n    <$button set=\"$:/state/notebook-sidebar-section\" setTo=<<currentTiddler>> class=\"tc-btn-invisible label\">\n      <<sidebarHeading>>\n      <span class=\"caret\">{{$:/themes/nico/notebook/images/caret-right}}</span>\n    </$button>\n  </div>\n</$reveal>\n"
        },
        "$:/themes/nico/notebook/ui/Sidebar/Sections": {
            "title": "$:/themes/nico/notebook/ui/Sidebar/Sections",
            "created": "20200429163239707",
            "modified": "20210112213620486",
            "tags": "$:/themes/nico/notebook/tags/Sidebar",
            "type": "text/vnd.tiddlywiki",
            "text": "<$list filter=\"[all[shadows+tiddlers]!has[draft.of]tag[$:/tags/SideBar]]\">\n  {{||$:/themes/nico/notebook/ui/Sidebar/SectionTemplate}}\n</$list>\n"
        },
        "$:/themes/nico/notebook/ui/Sidebar": {
            "title": "$:/themes/nico/notebook/ui/Sidebar",
            "created": "20200428201218885",
            "modified": "20210112213605486",
            "tags": "$:/tags/PageTemplate",
            "type": "text/vnd.tiddlywiki",
            "text": "\\whitespace trim\n\\define config-title()\n$:/config/SideBarSegments/Visibility/$(listItem)$\n\\end\n\n<$reveal state=\"$:/state/notebook-sidebar\" type=\"match\" text=\"yes\" default=\"no\" retain=\"yes\" animate=\"no\">\n    <$scrollable fallthrough=\"no\">\n    <div class=\"nc-sidebar\">\n      <$list filter=\"[all[shadows+tiddlers]tag[$:/themes/nico/notebook/tags/Sidebar]!has[draft.of]]\" variable=\"listItem\">\n        <$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\" tag=\"div\">\n          <$transclude tiddler=<<listItem>> mode=\"inline\"/>\n        </$reveal>\n      </$list>\n    </div>\n    </$scrollable>\n</$reveal>\n\n"
        },
        "$:/themes/nico/notebook/ui/Topbar": {
            "title": "$:/themes/nico/notebook/ui/Topbar",
            "created": "20200428203101797",
            "modified": "20210124213834458",
            "tags": "$:/tags/PageTemplate",
            "type": "text/vnd.tiddlywiki",
            "text": "<$reveal state=\"$:/state/notebook-topbar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\" animate=\"yes\">\n  <div class=\"nc-topbar-wrapper\">\n    <div class=\"nc-bar nc-topbar tc-adjust-top-of-scroll\">\n      <$list filter=\"[all[shadows+tiddlers]tag[$:/tags/NotebookTopbar]!has[draft.of]]\" variable=\"listItem\">\n        <$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\" tag=\"div\">\n          <$transclude tiddler=<<listItem>> mode=\"block\"/>\n        </$reveal>\n      </$list>\n      <div class=\"left\">\n\t{{$:/themes/nico/notebook/ui/Buttons/menu}}\n        {{$:/themes/nico/notebook/ui/Search}}\n      </div>\n      <div class=\"right\">\n        {{$:/core/ui/SideBarSegments/page-controls}}\n      </div>\n    </div>\n  </div>\n</$reveal>\n\n"
        }
    }
}
{
    "tiddlers": {
        "$:/themes/tiddlywiki/snowwhite/base": {
            "title": "$:/themes/tiddlywiki/snowwhite/base",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": "\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-sidebar-header {\n\ttext-shadow: 0 1px 0 <<colour sidebar-foreground-shadow>>;\n}\n\n.tc-tiddler-info {\n\t<<box-shadow \"inset 1px 2px 3px rgba(0,0,0,0.1)\">>\n}\n\n@media screen {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n\t}\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow none>>\n\t}\n}\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected,\n.tc-page-controls button.tc-selected {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-edit-tags {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\n\t<<box-shadow \"none\">>\n\tborder: none;\n\toutline: none;\n}\n\ntextarea.tc-edit-texteditor {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\ncanvas.tc-edit-bitmapeditor  {\n\t<<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\n\tborder-top: none;\n\theight: 1px;\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%\">>\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n.tc-plugin-info {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n"
        }
    }
}
{
    "tiddlers": {
        "$:/themes/tiddlywiki/vanilla/themetweaks": {
            "title": "$:/themes/tiddlywiki/vanilla/themetweaks",
            "tags": "$:/tags/ControlPanel/Appearance",
            "caption": "{{$:/language/ThemeTweaks/ThemeTweaks}}",
            "text": "\\define lingo-base() $:/language/ThemeTweaks/\n\n\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n\\define backgroundimage-dropdown()\n<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"\n\t$value=<<imageTitle>>\n/>\n\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n\\end\n\n\\define backgroundimageattachment-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\" default=\"scroll\">\n<option value=\"scroll\"><<lingo Settings/BackgroundImageAttachment/Scroll>></option>\n<option value=\"fixed\"><<lingo Settings/BackgroundImageAttachment/Fixed>></option>\n</$select>\n\\end\n\n\\define backgroundimagesize-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\" default=\"scroll\">\n<option value=\"auto\"><<lingo Settings/BackgroundImageSize/Auto>></option>\n<option value=\"cover\"><<lingo Settings/BackgroundImageSize/Cover>></option>\n<option value=\"contain\"><<lingo Settings/BackgroundImageSize/Contain>></option>\n</$select>\n\\end\n\n<<lingo ThemeTweaks/Hint>>\n\n! <<lingo Options>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><<lingo Options/SidebarLayout>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><option value=\"fixed-fluid\"><<lingo Options/SidebarLayout/Fixed-Fluid>></option><option value=\"fluid-fixed\"><<lingo Options/SidebarLayout/Fluid-Fixed>></option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><<lingo Options/StickyTitles>></$link><br>//<<lingo Options/StickyTitles/Hint>>// |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><option value=\"no\">{{$:/language/No}}</option><option value=\"yes\">{{$:/language/Yes}}</option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><<lingo Options/CodeWrapping>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><option value=\"pre\">{{$:/language/No}}</option><option value=\"pre-wrap\">{{$:/language/Yes}}</option></$select> |\n\n! <<lingo Settings>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"><<lingo Settings/FontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\"><<lingo Settings/CodeFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"><<lingo Settings/BackgroundImage>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" default=\"\" tag=\"input\"/> |<<backgroundimage-dropdown>> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\"><<lingo Settings/BackgroundImageAttachment>></$link> |<<backgroundimageattachment-dropdown>> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\"><<lingo Settings/BackgroundImageSize>></$link> |<<backgroundimagesize-dropdown>> | |\n\n! <<lingo Metrics>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\"><<lingo Metrics/FontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\"><<lingo Metrics/LineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\"><<lingo Metrics/BodyFontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\"><<lingo Metrics/BodyLineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\"><<lingo Metrics/StoryLeft>></$link><br>//<<lingo Metrics/StoryLeft/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\"><<lingo Metrics/StoryTop>></$link><br>//<<lingo Metrics/StoryTop/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\"><<lingo Metrics/StoryRight>></$link><br>//<<lingo Metrics/StoryRight/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\"><<lingo Metrics/StoryWidth>></$link><br>//<<lingo Metrics/StoryWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"><<lingo Metrics/TiddlerWidth>></$link><br>//<<lingo Metrics/TiddlerWidth/Hint>>//<br> |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\"><<lingo Metrics/SidebarBreakpoint>></$link><br>//<<lingo Metrics/SidebarBreakpoint/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\"><<lingo Metrics/SidebarWidth>></$link><br>//<<lingo Metrics/SidebarWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\" default=\"\" tag=\"input\"/> |\n"
        },
        "$:/themes/tiddlywiki/vanilla/base": {
            "title": "$:/themes/tiddlywiki/vanilla/base",
            "tags": "[[$:/tags/Stylesheet]]",
            "text": "\\define custom-background-datauri()\n<$set name=\"background\" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>\n<$list filter=\"[<background>is[image]]\">\n`background: url(`\n<$list filter=\"[<background>!has[_canonical_uri]]\">\n`\"`<$macrocall $name=\"datauri\" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>`\"`\n</$list>\n<$list filter=\"[<background>has[_canonical_uri]]\">\n`\"`<$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field=\"_canonical_uri\"/>`\"`\n</$list>\n`) center center;`\n`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;\n-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\nbackground-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`\n</$list>\n</$set>\n\\end\n\n\\define sidebarbreakpoint()\n<$text text={{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}/>\n\\end\n\n\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\n\\end\n\n\\define if-fluid-fixed(text,hiddenSidebarText)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$hiddenSidebarText$\n</$reveal>\n</$reveal>\n\\end\n\n\\define if-editor-height-fixed(then,else)\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n$then$\n</$reveal>\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n$else$\n</$reveal>\n\\end\n\n\\define set-type-selector-min-width()\n<$set name=\"typeLength\" value={{{ [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]get[name]length[]maxall[]] }}}>\n\n\t.tc-type-selector-dropdown-wrapper {\n\t\tmin-width: calc(<<typeLength>>ch + 4em);\n\t}\n\n\t.tc-type-selector-dropdown-wrapper input.tc-edit-typeeditor {\n\t\tmin-width: <<typeLength>>ch;\n\t}\n\n</$set>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\n*, input[type=\"search\"] {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  outline-offset: initial;\n}\n\nhtml button {\n\tline-height: 1.2;\n\tcolor: <<colour button-foreground>>;\n\tfill: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml, body {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\tword-wrap: break-word;\n\t<<custom-background-datauri>>\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tfill: <<colour foreground>>;\n}\n\n<<if-background-attachment \"\"\"\n\nbody.tc-body {\n        background-color: transparent;\n}\n\n\"\"\">>\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n\tfont-size: 2em;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\ncode {\n\tcolor: <<colour code-foreground>>;\n\tbackground-color: <<colour code-background>>;\n\tborder: 1px solid <<colour code-border>>;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\nblockquote {\n\tborder-left: 5px solid <<colour blockquote-bar>>;\n\tmargin-left: 25px;\n\tpadding-left: 10px;\n\tquotes: \"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";\n}\n\nblockquote > div {\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\nblockquote.tc-big-quote {\n\tfont-family: Georgia, serif;\n\tposition: relative;\n\tbackground: <<colour pre-background>>;\n\tborder-left: none;\n\tmargin-left: 50px;\n\tmargin-right: 50px;\n\tpadding: 10px;\n    border-radius: 8px;\n}\n\nblockquote.tc-big-quote cite:before {\n\tcontent: \"\\2014 \\2009\";\n}\n\nblockquote.tc-big-quote:before {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: open-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n    left: -50px;\n    top: 42px;\n}\n\nblockquote.tc-big-quote:after {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: close-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n    right: -80px;\n    bottom: -20px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\nbutton, textarea, input, select {\n\toutline-color: <<colour primary>>;\n}\n\ntextarea,\ninput[type=text],\ninput[type=search],\ninput[type=\"\"],\ninput:not([type]) {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour background>>;\n}\n\ninput[type=\"checkbox\"] {\n  vertical-align: middle;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-results-button,\ninput[type=\"search\"]::-webkit-search-results-decoration {\n\t-webkit-appearance:none;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\nsvg.tc-image-button {\n\tpadding: 0px 1px 1px 0px;\n}\n\n.tc-icon-wrapper > svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\nkbd {\n\tdisplay: inline-block;\n\tpadding: 3px 5px;\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tcolor: <<colour foreground>>;\n\tvertical-align: middle;\n\tbackground-color: <<colour background>>;\n\tborder: solid 1px <<colour muted-foreground>>;\n\tborder-bottom-color: <<colour muted-foreground>>;\n\tborder-radius: 3px;\n\tbox-shadow: inset 0 -1px 0 <<colour muted-foreground>>;\n}\n\n::selection {\n\tbackground-color: Highlight;\n\tcolor: HighlightText;\n\tbackground-color: <<colour selection-background>>;\n\tcolor: <<colour selection-foreground>>;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tpadding: 0;\n\tborder: none;\n\tbackground-color: inherit;\n\tcolor: inherit;\n}\n\ntable {\n\tborder: 1px solid <<colour table-border>>;\n\twidth: auto;\n\tmax-width: 100%;\n\tcaption-side: bottom;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\t/* next 2 elements needed, since normalize 8.0.1 */\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n}\n\ntable th, table td {\n\tpadding: 0 7px 0 7px;\n\tborder-top: 1px solid <<colour table-border>>;\n\tborder-left: 1px solid <<colour table-border>>;\n}\n\ntable thead tr td, table th {\n\tbackground-color: <<colour table-header-background>>;\n\tfont-weight: bold;\n}\n\ntable tfoot tr td {\n\tbackground-color: <<colour table-footer-background>>;\n}\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-tiddler-frame img,\n.tc-tiddler-frame svg,\n.tc-tiddler-frame canvas,\n.tc-tiddler-frame embed,\n.tc-tiddler-frame iframe {\n\tmax-width: 100%;\n}\n\n.tc-tiddler-body > embed,\n.tc-tiddler-body > iframe {\n\twidth: 100%;\n\theight: 600px;\n}\n\n/*\n** Links\n*/\n\nbutton.tc-tiddlylink,\na.tc-tiddlylink {\n\ttext-decoration: none;\n\tfont-weight: 500;\n\tcolor: <<colour tiddler-link-foreground>>;\n\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\n}\n\n.tc-sidebar-lists a.tc-tiddlylink {\n\tcolor: <<colour sidebar-tiddler-link-foreground>>;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink:hover {\n\tcolor: <<colour sidebar-tiddler-link-foreground-hover>>;\n}\n\nbutton.tc-tiddlylink:hover,\na.tc-tiddlylink:hover {\n\ttext-decoration: underline;\n}\n\na.tc-tiddlylink-resolves {\n}\n\na.tc-tiddlylink-shadow {\n\tfont-weight: bold;\n}\n\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\na.tc-tiddlylink-missing {\n\tfont-style: italic;\n}\n\na.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour external-link-foreground>>;\n\tbackground-color: <<colour external-link-background>>;\n}\n\na.tc-tiddlylink-external:visited {\n\tcolor: <<colour external-link-foreground-visited>>;\n\tbackground-color: <<colour external-link-background-visited>>;\n}\n\na.tc-tiddlylink-external:hover {\n\tcolor: <<colour external-link-foreground-hover>>;\n\tbackground-color: <<colour external-link-background-hover>>;\n}\n\n.tc-drop-down a.tc-tiddlylink:hover {\n\tcolor: <<colour tiddler-link-background>>;\n}\n\n/*\n** Drag and drop styles\n*/\n\n.tc-tiddler-dragger {\n\tposition: relative;\n\tz-index: -10000;\n}\n\n.tc-tiddler-dragger-inner {\n\tposition: absolute;\n\ttop: -1000px;\n\tleft: -1000px;\n\tdisplay: inline-block;\n\tpadding: 8px 20px;\n\tfont-size: 16.9px;\n\tfont-weight: bold;\n\tline-height: 20px;\n\tcolor: <<colour dragger-foreground>>;\n\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour dragger-background>>;\n\tborder-radius: 20px;\n}\n\n.tc-tiddler-dragger-cover {\n\tposition: absolute;\n\tbackground-color: <<colour page-background>>;\n}\n\n.tc-dropzone {\n\tposition: relative;\n}\n\n.tc-dropzone.tc-dragover:before {\n\tz-index: 10000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour dropzone-background>>;\n\ttext-align: center;\n\tcontent: \"<<lingo DropMessage>>\";\n}\n\n.tc-droppable > .tc-droppable-placeholder {\n\tdisplay: none;\n}\n\n.tc-droppable.tc-dragover > .tc-droppable-placeholder {\n\tdisplay: block;\n\tborder: 2px dashed <<colour dropzone-background>>;\n}\n\n.tc-draggable {\n\tcursor: move;\n}\n\n.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder,\n.tc-links-draggable-list .tc-droppable-placeholder {\n\tline-height: 2em;\n\theight: 2em;\n}\n\n.tc-sidebar-tab-open-item {\n\tposition: relative;\n}\n\n.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg {\n\tfont-size: 0.7em;\n\tfill: <<colour muted-foreground>>;\n}\n\n/*\n** Plugin reload warning\n*/\n\n.tc-plugin-reload-warning {\n\tz-index: 1000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour alert-background>>;\n\ttext-align: center;\n}\n\n/*\n** Buttons\n*/\n\nbutton svg, button img, label svg, label img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n\tcolor: <<colour foreground>>;\n\tfill: <<colour foreground>>;\n}\n\n.tc-btn-boxed {\n\tfont-size: 0.6em;\n\tpadding: 0.2em;\n\tmargin: 1px;\n\tbackground: none;\n\tborder: 1px solid <<colour tiddler-controls-foreground>>;\n\tborder-radius: 0.25em;\n}\n\nhtml body.tc-body .tc-btn-boxed svg {\n\tfont-size: 1.6666em;\n}\n\n.tc-btn-boxed:hover {\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n}\n\nhtml body.tc-body .tc-btn-boxed:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded {\n\tfont-size: 0.5em;\n\tline-height: 2;\n\tpadding: 0em 0.3em 0.2em 0.4em;\n\tmargin: 1px;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n\tborder-radius: 2em;\n}\n\nhtml body.tc-body .tc-btn-rounded svg {\n\tfont-size: 1.6666em;\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded:hover {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tcolor: <<colour muted-foreground>>;\n}\n\nhtml body.tc-body .tc-btn-rounded:hover svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-icon svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-text {\n\tpadding: 0;\n\tmargin: 0;\n}\n\n/* used for documentation \"fake\" buttons */\n.tc-btn-standard {\n\tline-height: 1.8;\n\tcolor: #667;\n\tbackground-color: #e0e0e0;\n\tborder: 1px solid #888;\n\tpadding: 2px 1px 2px 1px;\n\tmargin: 1px 4px 1px 4px;\n}\n\n.tc-btn-big-green {\n\tdisplay: inline-block;\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: <<colour download-background>>;\n\tcolor: <<colour download-foreground>>;\n\tfill: <<colour download-foreground>>;\n\tborder: none;\n\tborder-radius: 2px;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n\ttext-decoration: none;\n}\n\n.tc-btn-big-green svg,\n.tc-btn-big-green img {\n\theight: 2em;\n\twidth: 2em;\n\tvertical-align: middle;\n\tfill: <<colour download-foreground>>;\n}\n\n.tc-primary-btn {\n \tbackground: <<colour primary>>;\n}\n\n.tc-sidebar-lists input {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-sidebar-lists button {\n\tcolor: <<colour sidebar-button-foreground>>;\n\tfill: <<colour sidebar-button-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini {\n\tcolor: <<colour sidebar-muted-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini:hover {\n\tcolor: <<colour sidebar-muted-foreground-hover>>;\n}\n\n.tc-sidebar-lists button small {\n\tcolor: <<colour foreground>>;\n}\n\nbutton svg.tc-image-button, button .tc-image-button img {\n\theight: 1em;\n\twidth: 1em;\n}\n\n.tc-unfold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 100%;\n\twidth: calc(100% + 2px);\n\tmargin-left: -43px;\n\ttext-align: center;\n\tborder-top: 2px solid <<colour tiddler-info-background>>;\n\tmargin-top: 4px;\n}\n\n.tc-unfold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n\tborder-top: 2px solid <<colour tiddler-info-border>>;\n}\n\n.tc-unfold-banner svg, .tc-fold-banner svg {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n.tc-fold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 23px;\n\ttext-align: center;\n\tmargin-left: -35px;\n\ttop: 6px;\n\tbottom: 6px;\n}\n\n.tc-fold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-unfold-banner {\n\t\tposition: static;\n\t\twidth: calc(100% + 59px);\n\t}\n\n\t.tc-fold-banner {\n\t\twidth: 16px;\n\t\tmargin-left: -16px;\n\t\tfont-size: 0.75em;\n\t}\n\n}\n\n/*\n** Tags and missing tiddlers\n*/\n\n.tc-tag-list-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\n.tc-block-tags-dropdown > .tc-btn-invisible:hover {\n\tbackground-color: <<colour primary>>;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: 400;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour tag-background>>;\n\tborder-radius: 1em;\n}\n\n.tc-sidebar-scrollable .tc-tag-label {\n\ttext-shadow: none;\n}\n\n.tc-untagged-separator {\n\twidth: 10em;\n\tleft: 0;\n\tmargin-left: 0;\n\tborder: 0;\n\theight: 1px;\n\tbackground: <<colour tab-divider>>;\n}\n\nbutton.tc-untagged-label {\n\tbackground-color: <<colour untagged-background>>;\n}\n\n.tc-tag-label svg, .tc-tag-label img {\n\theight: 1em;\n\twidth: 1em;\n\tmargin-right: 3px; \n\tmargin-bottom: 1px;\n\tvertical-align: bottom;\n}\n\n.tc-edit-tags button.tc-remove-tag-button svg {\n\tfont-size: 0.7em;\n\tvertical-align: middle;\n}\n\n.tc-tag-manager-table .tc-tag-label {\n\twhite-space: normal;\n}\n\n.tc-tag-manager-tag {\n\twidth: 100%;\n}\n\nbutton.tc-btn-invisible.tc-remove-tag-button {\n\toutline: none;\n}\n\n.tc-tag-button-selected,\n.tc-list-item-selected a.tc-tiddlylink, a.tc-list-item-selected {\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour tiddler-background>>;\n}\n\n/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-topbar-right {\n\t\tright: 10px;\n\t}\n\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-show-sidebar-btn svg.tc-image-chevron-left, .tc-hide-sidebar-btn svg.tc-image-chevron-right {\n\t\ttransform: rotate(-90deg);\n\t}\n\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: 300;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls .tc-drop-down {\n  font-size: 1rem;\n}\n\n.tc-page-controls button {\n\tmargin-right: 0.5em;\n}\n\n.tc-page-controls a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-page-controls img {\n\twidth: 1em;\n}\n\n.tc-page-controls svg {\n\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg {\n\tfill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.tc-sidebar-lists .tc-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\ttransition:  min-height {{$:/config/AnimationDuration}}ms ease-in-out, padding-top {{$:/config/AnimationDuration}}ms ease-in-out, padding-bottom {{$:/config/AnimationDuration}}ms ease-in-out;\n\t}\n\t\n\t<<if-no-sidebar \"\"\"\n\n\t\t.tc-sidebar-header {\n\t\t\tmin-height: 0;\n\t\t\tpadding-top: 0;\n\t\t\tpadding-bottom: 0;\n\t\t}\n\n\t\"\"\">>\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\thtml[dir=\"rtl\"] .tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tright: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\n\t\tpadding: 42px 42px 42px 42px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-story-river {\n\t\twidth: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});\n\t}\n\n\">>\n\n\t.tc-story-river.tc-static-story-river {\n\t\tmargin-right: 0;\n\t\tpadding-right: 42px;\n\t}\n\n}\n\n@media print {\n\n\tbody.tc-body {\n\t\tbackground-color: transparent;\n\t}\n\n\t.tc-sidebar-header, .tc-topbar {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.tc-story-river .tc-tiddler-frame {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tpadding: 0;\n\t}\n}\n\n/*\n** Tiddler styles\n*/\n\n.tc-tiddler-frame {\n\tposition: relative;\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n{{$:/themes/tiddlywiki/vanilla/sticky}}\n\n.tc-tiddler-info {\n\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-tiddler-info {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: 200;\n}\n\n.tc-view-field-value {\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t\tmargin-bottom: .5em;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: 300;\n\tfont-size: 2.35em;\n\tline-height: 1.35em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-site-title {\n\tcolor: <<colour site-title-foreground>>;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n\tmargin-right: .1em;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-titlebar h2 {\n\tfont-size: 1em;\n\tdisplay: inline;\n}\n\n.tc-titlebar img {\n\theight: 1em;\n}\n\n.tc-subtitle {\n\tfont-size: 0.9em;\n\tcolor: <<colour tiddler-subtitle-foreground>>;\n\tfont-weight: 300;\n}\n\n.tc-subtitle .tc-tiddlylink {\n\tmargin-right: .3em;\n}\n\n.tc-tiddler-missing .tc-title {\n  font-style: italic;\n  font-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n}\n\n.tc-tiddler-controls .tc-drop-down {\n\tfont-size: 0.6em;\n}\n\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\n\tfont-size: 1em;\n}\n\n.tc-tiddler-controls > span > button,\n.tc-tiddler-controls > span > span > button,\n.tc-tiddler-controls > span > span > span > button {\n\tvertical-align: baseline;\n\tmargin-left:5px;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img,\n.tc-search button svg, .tc-search a svg {\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n}\n\n.tc-search button svg, .tc-search a svg {\n    height: 1.2em;\n    width: 1.2em;\n    margin: 0 0.25em;\n}\n\n.tc-tiddler-controls button.tc-selected svg,\n.tc-page-controls button.tc-selected svg  {\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n}\n\n.tc-tiddler-controls button.tc-btn-invisible:hover svg,\n.tc-search button:hover svg, .tc-search a:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n@media print {\n\t.tc-tiddler-controls {\n\t\tdisplay: none;\n\t}\n}\n\n.tc-tiddler-help { /* Help prompts within tiddler template */\n\tcolor: <<colour muted-foreground>>;\n\tmargin-top: 14px;\n}\n\n.tc-tiddler-help a.tc-tiddlylink {\n\tcolor: <<colour very-muted-foreground>>;\n}\n\n.tc-tiddler-frame .tc-edit-texteditor {\n\twidth: 100%;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor,\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tline-height: 1.3em;\n\t-webkit-appearance: none;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-editor-background>>;\n}\n\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-background>>;\n}\n\n.tc-tiddler-frame .tc-binary-warning {\n\twidth: 100%;\n\theight: 5em;\n\ttext-align: center;\n\tpadding: 3em 3em 6em 3em;\n\tbackground: <<colour alert-background>>;\n\tborder: 1px solid <<colour alert-border>>;\n}\n\ncanvas.tc-edit-bitmapeditor  {\n\tborder: 6px solid <<colour tiddler-editor-border-image>>;\n\tcursor: crosshair;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n}\n\n.tc-edit-bitmapeditor-width {\n\tdisplay: block;\n}\n\n.tc-edit-bitmapeditor-height {\n\tdisplay: block;\n}\n\n.tc-tiddler-body {\n\tclear: both;\n}\n\n.tc-tiddler-frame .tc-tiddler-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\n}\n\n.tc-titlebar, .tc-tiddler-edit-title {\n\toverflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */\n}\n\nhtml body.tc-body.tc-single-tiddler-window {\n\tmargin: 1em;\n\tbackground: <<colour tiddler-background>>;\n}\n\n.tc-single-tiddler-window img,\n.tc-single-tiddler-window svg,\n.tc-single-tiddler-window canvas,\n.tc-single-tiddler-window embed,\n.tc-single-tiddler-window iframe {\n\tmax-width: 100%;\n}\n\n/*\n** Editor\n*/\n\n.tc-editor-toolbar {\n\tmargin-top: 8px;\n}\n\n.tc-editor-toolbar button {\n\tvertical-align: middle;\n\tbackground-color: <<colour tiddler-controls-foreground>>;\n\tcolor: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n\tborder-radius: 4px;\n\tpadding: 3px;\n\tmargin: 2px 0 2px 4px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {\n\tmargin-left: 1px;\n\twidth: 1em;\n\tborder-radius: 8px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {\n\tmargin-left: 11px;\n}\n\n.tc-editor-toolbar button.tc-selected {\n\tbackground-color: <<colour primary>>;\n}\n\n.tc-editor-toolbar button svg {\n\twidth: 1.6em;\n\theight: 1.2em;\n}\n\n.tc-editor-toolbar button:hover {\n\tbackground-color: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour background>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more {\n\twhite-space: normal;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more button {\n\tdisplay: inline-block;\n\tpadding: 3px;\n\twidth: auto;\n}\n\n.tc-editor-toolbar .tc-search-results {\n\tpadding: 0;\n}\n\n/*\n** Adjustments for fluid-fixed mode\n*/\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n<<if-fluid-fixed text:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 0;\n\t\tposition: relative;\n\t\twidth: auto;\n\t\tleft: 0;\n\t\tmargin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 42px);\n\t}\n\n\"\"\" hiddenSidebarText:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 3em;\n\t\tmargin-right: 0;\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 84px);\n\t}\n\n\"\"\">>\n\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n  fill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n  fill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n  fill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n  fill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n  fill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n  fill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n  fill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n  fill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n  fill: <<colour toolbar-done-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-type-selector .tc-edit-typeeditor {\n\twidth: auto;\n}\n\n.tc-type-selector-dropdown-wrapper {\n\tdisplay: inline-block;\n}\n\n<<set-type-selector-min-width>>\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-add-tag .tc-keyboard {\n\tdisplay:inline;\n}\n\n.tc-edit-tags .tc-tag-label {\n\tdisplay: inline-block;\n}\n\n.tc-edit-tags-list {\n\tmargin: 14px 0 14px 0;\n}\n\n.tc-remove-tag-button {\n\tpadding-left: 4px;\n}\n\n.tc-tiddler-preview {\n\toverflow: auto;\n}\n\n.tc-tiddler-preview-preview {\n\tfloat: right;\n\twidth: 49%;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 0 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n<<if-editor-height-fixed then:\"\"\"\n\n.tc-tiddler-preview-preview {\n\toverflow-y: scroll;\n\theight: {{$:/config/TextEditor/EditorHeight/Height}};\n}\n\n\"\"\">>\n\n.tc-tiddler-frame .tc-tiddler-preview .tc-edit-texteditor {\n\twidth: 49%;\n}\n\n.tc-tiddler-frame .tc-tiddler-preview canvas.tc-edit-bitmapeditor {\n\tmax-width: 49%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n.tc-edit-fields.tc-edit-fields-small {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n}\n\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name-wrapper input.tc-edit-texteditor {\n\twidth: auto;\n}\n\n.tc-edit-field-add-name-wrapper {\n\tdisplay: inline-block;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-edit-field-add-value {\n\t\twidth: 35%;\n\t}\n\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-viewswitcher .tc-image-button {\n\tmargin-right: .3em;\n}\n\n.tc-storyview-zoomin-tiddler {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-storyview-zoomin-tiddler {\n\t\twidth: calc(100% - 84px);\n\t}\n\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg  {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-drop-down .tc-drop-down-info {\n\tpadding-left: 14px;\n}\n\n.tc-drop-down p {\n\tpadding: 0 14px 0 14px;\n}\n\n.tc-drop-down svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-drop-down img {\n\twidth: 1em;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n\tdisplay: block;\n\tpadding: 0 14px 0 14px;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: <<colour foreground>>;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-tab-set .tc-tab-buttons button {\n\tdisplay: inline-block;\n    width: auto;\n    margin-bottom: 0px;\n    border-bottom-left-radius: 0;\n    border-bottom-right-radius: 0;\n}\n\n.tc-drop-down .tc-prompt {\n\tpadding: 0 14px;\n}\n\n.tc-drop-down .tc-chooser {\n\tborder: none;\n}\n\n.tc-drop-down .tc-chooser .tc-swatches-horiz {\n\tfont-size: 0.4em;\n\tpadding-left: 1.2em;\n}\n\n.tc-drop-down .tc-file-input-wrapper {\n\twidth: 100%;\n}\n\n.tc-drop-down .tc-file-input-wrapper button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-tab-buttons button {\n\tbackground-color: <<colour dropdown-tab-background>>;\n}\n\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour dropdown-tab-background-selected>>;\n\tborder-bottom: 1px solid <<colour dropdown-tab-background-selected>>;\n}\n\n.tc-drop-down-bullet {\n\tdisplay: inline-block;\n\twidth: 0.5em;\n}\n\n.tc-drop-down .tc-tab-contents a {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-block-dropdown-wrapper {\n\tposition: relative;\n}\n\n.tc-block-dropdown {\n\tposition: absolute;\n\tmin-width: 220px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\tz-index: 1000;\n\ttext-shadow: none;\n}\n\n.tc-block-dropdown.tc-search-drop-down {\n\tmargin-left: -12px;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-block-dropdown.tc-search-drop-down a {\n\tdisplay: block;\n\tpadding: 0px 10px 0px 10px;\n}\n\n.tc-drop-down .tc-dropdown-item-plain,\n.tc-block-dropdown .tc-dropdown-item-plain {\n\tpadding: 4px 14px 4px 7px;\n}\n\n.tc-drop-down .tc-dropdown-item,\n.tc-block-dropdown .tc-dropdown-item {\n\tpadding: 4px 14px 4px 7px;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-block-dropdown a.tc-tiddlylink:hover {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-search-results {\n\tpadding: 0 7px 0 7px;\n}\n\n.tc-image-chooser, .tc-colour-chooser {\n\twhite-space: normal;\n}\n\n.tc-image-chooser a,\n.tc-colour-chooser a {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\ttext-align: center;\n\tposition: relative;\n}\n\n.tc-image-chooser a {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 2px;\n\tmargin: 2px;\n\twidth: 4em;\n\theight: 4em;\n}\n\n.tc-colour-chooser a {\n\tpadding: 3px;\n\twidth: 2em;\n\theight: 2em;\n\tvertical-align: middle;\n}\n\n.tc-image-chooser a:hover,\n.tc-colour-chooser a:hover {\n\tbackground: <<colour primary>>;\n\tpadding: 0px;\n\tborder: 3px solid <<colour primary>>;\n}\n\n.tc-image-chooser a svg,\n.tc-image-chooser a img {\n\tdisplay: inline-block;\n\twidth: auto;\n\theight: auto;\n\tmax-width: 3.5em;\n\tmax-height: 3.5em;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tmargin: auto;\n}\n\n/*\n** Modals\n*/\n\n.tc-modal-wrapper {\n\tposition: fixed;\n\toverflow: auto;\n\toverflow-y: scroll;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 900;\n}\n\n.tc-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 1000;\n\tbackground-color: <<colour modal-backdrop>>;\n}\n\n.tc-modal {\n\tz-index: 1100;\n\tbackground-color: <<colour modal-background>>;\n\tborder: 1px solid <<colour modal-border>>;\n}\n\n@media (max-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 1em;\n\t\tleft: 1em;\n\t\tright: 1em;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 2em;\n\t\tleft: 25%;\n\t\twidth: 50%;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n.tc-modal-header {\n\tpadding: 9px 15px;\n\tborder-bottom: 1px solid <<colour modal-header-border>>;\n}\n\n.tc-modal-header h3 {\n\tmargin: 0;\n\tline-height: 30px;\n}\n\n.tc-modal-header img, .tc-modal-header svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-modal-body {\n\tpadding: 15px;\n}\n\n.tc-modal-footer {\n\tpadding: 14px 15px 15px;\n\tmargin-bottom: 0;\n\ttext-align: right;\n\tbackground-color: <<colour modal-footer-background>>;\n\tborder-top: 1px solid <<colour modal-footer-border>>;\n}\n\n\n/*\n** Centered modals\n*/\n.tc-modal-centered .tc-modal {\n\twidth: auto;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%) !important;\n}\n\n/*\n** Notifications\n*/\n\n.tc-notification {\n\tposition: fixed;\n\ttop: 14px;\n\tright: 42px;\n\tz-index: 1300;\n\tmax-width: 280px;\n\tpadding: 0 14px 0 14px;\n\tbackground-color: <<colour notification-background>>;\n\tborder: 1px solid <<colour notification-border>>;\n}\n\n/*\n** Tabs\n*/\n\n.tc-tab-set.tc-vertical {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tab-buttons {\n\tfont-size: 0.85em;\n\tpadding-top: 1em;\n\tmargin-bottom: -2px;\n}\n\n.tc-tab-buttons.tc-vertical  {\n\tz-index: 100;\n\tdisplay: block;\n\tpadding-top: 14px;\n\tvertical-align: top;\n\ttext-align: right;\n\tmargin-bottom: inherit;\n\tmargin-right: -1px;\n\tmax-width: 33%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n}\n\n.tc-tab-buttons button.tc-tab-selected {\n\tcolor: <<colour tab-foreground-selected>>;\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-left: 1px solid <<colour tab-border-selected>>;\n\tborder-top: 1px solid <<colour tab-border-selected>>;\n\tborder-right: 1px solid <<colour tab-border-selected>>;\n}\n\n.tc-tab-buttons button {\n\tcolor: <<colour tab-foreground>>;\n\tpadding: 3px 5px 3px 5px;\n\tmargin-right: 0.3em;\n\tfont-weight: 300;\n\tborder: none;\n\tbackground: inherit;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-right: 1px solid <<colour tab-border>>;\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin-top: 3px;\n\tmargin-right: 0;\n\ttext-align: right;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tborder-right: none;\n\tborder-top-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-right: 1px solid <<colour tab-background-selected>>;\n}\n\n.tc-tab-divider {\n\tborder-top: 1px solid <<colour tab-divider>>;\n}\n\n.tc-tab-divider.tc-vertical  {\n\tdisplay: none;\n}\n\n.tc-tab-content {\n\tmargin-top: 14px;\n}\n\n.tc-tab-content.tc-vertical  {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-top: 0;\n\tpadding-left: 14px;\n\tborder-left: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 70%;\n\tflex: 1 0 70%;\n\toverflow: auto;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\tdisplay: block;\n\twidth: 100%;\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tborder-top: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tborder-right: 1px solid #ccc;\n\tmargin-bottom: inherit;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Manager\n*/\n\n.tc-manager-wrapper {\n\t\n}\n\n.tc-manager-controls {\n\t\n}\n\n.tc-manager-control {\n\tmargin: 0.5em 0;\n}\n\n.tc-manager-list {\n\twidth: 100%;\n\tborder-top: 1px solid <<colour muted-foreground>>;\n\tborder-left: 1px solid <<colour muted-foreground>>;\n\tborder-right: 1px solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item {\n\n}\n\n.tc-manager-list-item-heading {\n    display: block;\n    width: 100%;\n    text-align: left;\t\n\tborder-bottom: 1px solid <<colour muted-foreground>>;\n\tpadding: 3px;\n}\n\n.tc-manager-list-item-heading-selected {\n\tfont-weight: bold;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n\tbackground-color: <<colour foreground>>;\n}\n\n.tc-manager-list-item-heading:hover {\n\tbackground: <<colour primary>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-manager-list-item-content {\n\tdisplay: flex;\n}\n\n.tc-manager-list-item-content-sidebar {\n    flex: 1 0;\n    background: <<colour tiddler-editor-background>>;\n    border-right: 0.5em solid <<colour muted-foreground>>;\n    border-bottom: 0.5em solid <<colour muted-foreground>>;\n    white-space: nowrap;\n}\n\n.tc-manager-list-item-content-item-heading {\n\tdisplay: block;\n\twidth: 100%;\n\ttext-align: left;\n    background: <<colour muted-foreground>>;\n\ttext-transform: uppercase;\n\tfont-size: 0.6em;\n\tfont-weight: bold;\n    padding: 0.5em 0 0.5em 0;\n}\n\n.tc-manager-list-item-content-item-body {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-manager-list-item-content-item-body > pre {\n\tmargin: 0.5em 0 0.5em 0;\n\tborder: none;\n\tbackground: inherit;\n}\n\n.tc-manager-list-item-content-tiddler {\n    flex: 3 1;\n    border-left: 0.5em solid <<colour muted-foreground>>;\n    border-right: 0.5em solid <<colour muted-foreground>>;\n    border-bottom: 0.5em solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item-content-item-body > table {\n\tborder: none;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-manager-list-item-content-item-body > table td {\n\tborder: none;\n}\n\n.tc-manager-icon-editor > button {\n\twidth: 100%;\n}\n\n.tc-manager-icon-editor > button > svg,\n.tc-manager-icon-editor > button > button {\n\twidth: 100%;\n\theight: auto;\n}\n\n/*\n** Import table\n*/\n\n.tc-import-table {\n\twidth: 100%;\n}\n\n.tc-import-table svg.tc-image-edit-button {\n\tmax-width: unset;\n}\n\n.tc-import-table th:first-of-type {\n\twidth: 10%;\n}\n\n.tc-import-table th:last-of-type {\n\twidth: 30%;\n}\n\n.tc-import-table .tc-row-disabled {\n\tbackground: <<colour very-muted-foreground>>10;\n\topacity: 0.8;\n}\n\n.tc-import-table .tc-row-warning {\n\tbackground: <<colour diff-delete-background>>50;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 28px;\n\tleft: 0;\n\tright: 0;\n\tmax-width: 50%;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 14px;\n\tpadding: 7px;\n\tborder: 1px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 7px;\n\tright: 7px;\n    line-height: 0;\n}\n\n.tc-alert-toolbar svg {\n\tfill: <<colour alert-muted-foreground>>;\n}\n\n.tc-alert-subtitle {\n\tcolor: <<colour alert-muted-foreground>>;\n\tfont-weight: bold;\n    font-size: 0.8em;\n    margin-bottom: 0.5em;\n}\n\n.tc-alert-body > p {\n\tmargin: 0;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-static-alert {\n\t\tposition: relative;\n\t}\n\n\t.tc-static-alert-inner {\n\t\tposition: absolute;\n\t\tz-index: 100;\n\t}\n\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n}\n\n/*\n** Floating drafts list\n*/\n\n.tc-drafts-list {\n\tz-index: 2000;\n\tposition: fixed;\n\tfont-size: 0.8em;\n\tleft: 0;\n\tbottom: 0;\n}\n\n.tc-drafts-list a {\n\tmargin: 0 0.5em;\n\tpadding: 4px 4px;\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n\tborder: 1px solid <<colour background>>;\n\tborder-bottom-none;\n\tbackground: <<colour dirty-indicator>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a:hover {\n\ttext-decoration: none;\n\tbackground: <<colour foreground>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a svg {\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: text-bottom;\n}\n\n/*\n** Control panel\n*/\n\n.tc-control-panel td {\n\tpadding: 4px;\n}\n\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\n\twidth: 100%;\n}\n\n.tc-plugin-info {\n\tdisplay: flex;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tfill: <<colour muted-foreground>>;\n\tbackground-color: <<colour background>>;\n\tmargin: 0.5em 0 0.5em 0;\n\tpadding: 4px;\n    align-items: center;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info {\n    margin: 0.5em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugin-indicator {\n\tmargin: -16px 1em 0 2em;\n}\n\n.tc-plugin-info-sub-plugin-indicator button {\n\tcolor: <<colour background>>;\n\tbackground: <<colour foreground>>;\n\tborder-radius: 8px;\n    padding: 2px 7px;\n    font-size: 0.75em;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info-dropdown {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-plugin-info-disabled {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n}\n\n.tc-plugin-info-disabled:hover {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n}\n\na.tc-tiddlylink.tc-plugin-info:hover {\n\ttext-decoration: none;\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour foreground>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk > svg {\n\tfill: <<colour background>>;\n}\n\n.tc-plugin-info-chunk {\n    margin: 2px;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description {\n\tflex-grow: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-buttons {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tflex-grow: 0;\n\tflex-shrink: 0;\n    text-align: right;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h1 {\n\tfont-size: 1em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h2 {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description div {\n\tfont-size: 0.7em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg {\n\twidth: 2em;\n\theight: 2em;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tmargin-top: -8px;\n}\n\n.tc-plugin-info-dropdown-message {\n\tbackground: <<colour message-background>>;\n\tpadding: 0.5em 1em 0.5em 1em;\n\tfont-weight: bold;\n\tfont-size: 0.8em;\n}\n\n.tc-plugin-info-dropdown-body {\n\tpadding: 1em 1em 0 1em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugins {\n\tpadding: 0.5em;\n    margin: 0 1em 1em 1em;\n\tbackground: <<colour notification-background>>;\n}\n\n.tc-install-plugin {\n\tfont-weight: bold;\n\tbackground: green;\n\tcolor: white;\n\tfill: white;\n\tborder-radius: 4px;\n\tpadding: 3px;\n}\n\n.tc-install-plugin.tc-reinstall-downgrade {\n\tbackground: red;\n}\n\n.tc-install-plugin.tc-reinstall {\n\tbackground: blue;\n}\n\n.tc-install-plugin.tc-reinstall-upgrade {\n\tbackground: orange;\n}\n\n.tc-check-list {\n\tline-height: 2em;\n}\n\n.tc-check-list .tc-image-button {\n\theight: 1.5em;\n}\n\n/*\n** Message boxes\n*/\n\n.tc-message-box {\n\tborder: 1px solid <<colour message-border>>;\n\tbackground: <<colour message-background>>;\n\tpadding: 0px 21px 0px 21px;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: <<colour message-foreground>>;\n}\n\n.tc-message-box svg {\n\twidth: 1em;\n\theight: 1em;\n    vertical-align: text-bottom;\n}\n\n/*\n** Pictures\n*/\n\n.tc-bordered-image {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 5px;\n\tmargin: 5px;\n}\n\n/*\n** Floats\n*/\n\n.tc-float-right {\n\tfloat: right;\n}\n\n/*\n** Chooser\n*/\n\n.tc-chooser {\n\tborder-right: 1px solid <<colour table-header-background>>;\n\tborder-left: 1px solid <<colour table-header-background>>;\n}\n\n\n.tc-chooser-item {\n\tborder-bottom: 1px solid <<colour table-header-background>>;\n\tborder-top: 1px solid <<colour table-header-background>>;\n\tpadding: 2px 4px 2px 14px;\n}\n\n.tc-drop-down .tc-chooser-item {\n\tpadding: 2px;\n}\n\n.tc-chosen,\n.tc-chooser-item:hover {\n\tbackground-color: <<colour table-header-background>>;\n\tborder-color: <<colour table-footer-background>>;\n}\n\n.tc-chosen .tc-tiddlylink {\n\tcursor:default;\n}\n\n.tc-chooser-item .tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tbackground-color: transparent;\n}\n\n.tc-chooser-item:hover .tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-chosen .tc-tiddlylink,\n.tc-drop-down .tc-chooser-item .tc-tiddlylink:hover {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-chosen > .tc-tiddlylink:before {\n\tmargin-left: -10px;\n\tposition: relative;\n\tcontent: \"» \";\n}\n\n.tc-chooser-item svg,\n.tc-chooser-item img{\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: middle;\n}\n\n.tc-language-chooser .tc-image-button img {\n\twidth: 2em;\n\tvertical-align: -0.15em;\n}\n\n/*\n** Palette swatches\n*/\n\n.tc-swatches-horiz {\n}\n\n.tc-swatches-horiz .tc-swatch {\n\tdisplay: inline-block;\n}\n\n.tc-swatch {\n\twidth: 2em;\n\theight: 2em;\n\tmargin: 0.4em;\n\tborder: 1px solid #888;\n}\n\ninput.tc-palette-manager-colour-input {\n\twidth: 100%;\n\tpadding: 0;\n}\n\n/*\n** Table of contents\n*/\n\n.tc-sidebar-lists .tc-table-of-contents {\n\twhite-space: nowrap;\n}\n\n.tc-table-of-contents button {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents svg {\n\twidth: 0.7em;\n\theight: 0.7em;\n\tvertical-align: middle;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n}\n\n.tc-table-of-contents ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-table-of-contents li {\n\tfont-size: 1.0em;\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.4;\n}\n\n.tc-table-of-contents li li a {\n\tfont-weight: normal;\n}\n\n.tc-table-of-contents li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n}\n\n.tc-tabbed-table-of-contents {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents {\n\tz-index: 100;\n\tdisplay: inline-block;\n\tpadding-left: 1em;\n\tmax-width: 50%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n\tbackground: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tdisplay: block;\n\tpadding: 0.12em 1em 0.12em 0.25em;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\n\tborder-top: 1px solid <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-background>>;\n\tborder-bottom: 1px solid <<colour tab-background>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\n\ttext-decoration: none;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour background>>;\n\tmargin-right: -1px;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\n\ttext-decoration: none;\n}\n\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-left: 1.5em;\n\tpadding-right: 1.5em;\n\tborder: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 50%;\n\tflex: 1 0 50%;\n}\n\n/*\n** Dirty indicator\n*/\n\nbody.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {\n\tfill: <<colour dirty-indicator>>;\n\tcolor: <<colour dirty-indicator>>;\n}\n\n/*\n** File inputs\n*/\n\n.tc-file-input-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-file-input-wrapper input[type=file] {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tfont-size: 999px;\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\toutline: none;\n\tbackground: white;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n::-webkit-file-upload-button {\n\tcursor:pointer;\n}\n\n/*\n** Thumbnail macros\n*/\n\n.tc-thumbnail-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin: 6px;\n\tvertical-align: top;\n}\n\n.tc-thumbnail-right-wrapper {\n\tfloat:right;\n\tmargin: 0.5em 0 0.5em 0.5em;\n}\n\n.tc-thumbnail-image {\n\ttext-align: center;\n\toverflow: hidden;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-image svg,\n.tc-thumbnail-image img {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n\tmin-width: 100%;\n\tmin-height: 100%;\n\tmax-width: 100%;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {\n\tfilter: alpha(opacity=0.8);\n\topacity: 0.8;\n}\n\n.tc-thumbnail-background {\n\tposition: absolute;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-icon svg,\n.tc-thumbnail-icon img {\n\twidth: 3em;\n\theight: 3em;\n\t<<filter \"drop-shadow(2px 2px 4px rgba(0,0,0,0.3))\">>\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {\n\tfill: #fff;\n\t<<filter \"drop-shadow(3px 3px 4px rgba(0,0,0,0.6))\">>\n}\n\n.tc-thumbnail-icon {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: -webkit-flex;\n\t-webkit-align-items: center;\n\t-webkit-justify-content: center;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.tc-thumbnail-caption {\n\tposition: absolute;\n\tbackground-color: #777;\n\tcolor: #fff;\n\ttext-align: center;\n\tbottom: 0;\n\twidth: 100%;\n\tfilter: alpha(opacity=0.9);\n\topacity: 0.9;\n\tline-height: 1.4;\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n}\n\n/*\n** Diffs\n*/\n\n.tc-diff-equal {\n\tbackground-color: <<colour diff-equal-background>>;\n\tcolor: <<colour diff-equal-foreground>>;\n}\n\n.tc-diff-insert {\n\tbackground-color: <<colour diff-insert-background>>;\n\tcolor: <<colour diff-insert-foreground>>;\n}\n\n.tc-diff-delete {\n\tbackground-color: <<colour diff-delete-background>>;\n\tcolor: <<colour diff-delete-foreground>>;\n}\n\n.tc-diff-invisible {\n\tbackground-color: <<colour diff-invisible-background>>;\n\tcolor: <<colour diff-invisible-foreground>>;\n}\n\n.tc-diff-tiddlers th {\n\ttext-align: right;\n\tbackground: <<colour background>>;\n\tfont-weight: normal;\n\tfont-style: italic;\n}\n\n.tc-diff-tiddlers pre {\n    margin: 0;\n    padding: 0;\n    border: none;\n    background: none;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n\n/*\n** Tree macro\n*/\n\n.tc-tree div {\n    \tpadding-left: 14px;\n}\n\n.tc-tree ol {\n    \tlist-style-type: none;\n    \tpadding-left: 0;\n    \tmargin-top: 0;\n}\n\n.tc-tree ol ol {\n    \tpadding-left: 1em;    \n}\n\n.tc-tree button { \n    \tcolor: #acacac;\n}\n\n.tc-tree svg {\n     \tfill: #acacac;\n}\n\n.tc-tree span svg {\n    \twidth: 1em;\n    \theight: 1em;\n    \tvertical-align: baseline;\n}\n\n.tc-tree li span {\n    \tcolor: lightgray;\n}\n\nselect {\n        color: <<colour select-tag-foreground>>;\n        background: <<colour select-tag-background>>;\n}\n\n/*\n** Utility classes for SVG icons\n*/\n\n.tc-fill-background {\n\tfill: <<colour background>>;\n}\n\n/*\n** Flexbox utility classes\n*/\n\n.tc-flex {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-flex-column {\n\tflex-direction: column;\n}\n\n.tc-flex-row {\n\tflex-direction: row;\n}\n\n.tc-flex-grow-1 {\n\tflex-grow: 1;\n}\n\n.tc-flex-grow-2 {\n\tflex-grow: 2;\n}\n\n/*\n** Other utility classes\n*/\n\n.tc-small-gap {\n\tmargin-left: .5em;\n\tmargin-right: .5em;\n}\n\n.tc-small-gap-left {\n\tmargin-left: .5em;\n}\n\n.tc-small-gap-right {\n\tmargin-right: .5em;\n}\n\n.tc-big-gap {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-big-gap-left {\n\tmargin-left: 1em;\n}\n\n.tc-big-gap-right {\n\tmargin-right: 1em;\n}\n\n.tc-word-break {\n\tword-break: break-all;\n}\n"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize",
            "text": "15px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight",
            "text": "22px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/fontsize": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/fontsize",
            "text": "14px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/lineheight": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/lineheight",
            "text": "20px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/storyleft": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/storyleft",
            "text": "0px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/storytop": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/storytop",
            "text": "0px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/storyright": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/storyright",
            "text": "770px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/storywidth": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/storywidth",
            "text": "770px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth",
            "text": "686px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint",
            "text": "960px"
        },
        "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth": {
            "title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth",
            "text": "350px"
        },
        "$:/themes/tiddlywiki/vanilla/options/stickytitles": {
            "title": "$:/themes/tiddlywiki/vanilla/options/stickytitles",
            "text": "no"
        },
        "$:/themes/tiddlywiki/vanilla/options/sidebarlayout": {
            "title": "$:/themes/tiddlywiki/vanilla/options/sidebarlayout",
            "text": "fixed-fluid"
        },
        "$:/themes/tiddlywiki/vanilla/options/codewrapping": {
            "title": "$:/themes/tiddlywiki/vanilla/options/codewrapping",
            "text": "pre-wrap"
        },
        "$:/themes/tiddlywiki/vanilla/reset": {
            "title": "$:/themes/tiddlywiki/vanilla/reset",
            "type": "text/plain",
            "text": "/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\n:root {\n  -moz-tab-size: 4;\n  tab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\nhtml {\n  line-height: 1.15; /* 1 */\n  -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/*\nSections\n========\n*/\n\n/**\nRemove the margin in all browsers.\n*/\n\nbody {\n  margin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\nbody {\n  font-family:\n    system-ui,\n    -apple-system, /* Firefox supports this but not yet `system-ui` */\n    'Segoe UI',\n    Roboto,\n    Helvetica,\n    Arial,\n    sans-serif,\n    'Apple Color Emoji',\n    'Segoe UI Emoji';\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n  height: 0; /* 1 */\n  color: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n  text-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n  font-family:\n    ui-monospace,\n    SFMono-Regular,\n    Consolas,\n    'Liberation Mono',\n    Menlo,\n    monospace; /* 1 */\n  font-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n  font-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n  text-indent: 0; /* 1 */\n  border-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  font-family: inherit; /* 1 */\n  font-size: 100%; /* 1 */\n  line-height: 1.15; /* 1 */\n  margin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\nbutton,\nselect { /* 1 */\n  text-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n  -webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n::-moz-focus-inner {\n  border-style: none;\n  padding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n:-moz-focusring {\n  outline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n:-moz-ui-invalid {\n  box-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n  padding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n  vertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n  height: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n  -webkit-appearance: textfield; /* 1 */\n  outline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n::-webkit-file-upload-button {\n  -webkit-appearance: button; /* 1 */\n  font: inherit; /* 2 */\n}\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n  display: list-item;\n}\n"
        },
        "$:/themes/tiddlywiki/vanilla/settings/fontfamily": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily",
            "text": "system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\""
        },
        "$:/themes/tiddlywiki/vanilla/settings/codefontfamily": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/codefontfamily",
            "text": "\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace"
        },
        "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment",
            "text": "fixed"
        },
        "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize": {
            "title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize",
            "text": "auto"
        },
        "$:/themes/tiddlywiki/vanilla/sticky": {
            "title": "$:/themes/tiddlywiki/vanilla/sticky",
            "text": "<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\" type=\"match\" text=\"yes\">\n``\n.tc-tiddler-title {\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n\ttop: 0px;\n\tbackground: ``<<colour tiddler-background>>``;\n\tz-index: 500;\n}\n\n``\n<$list filter=\"[range[100]]\">\n`.tc-story-river .tc-tiddler-frame:nth-child(100n+`<$text text=<<currentTiddler>>/>`) {\nz-index: `<$text text={{{ [[200]subtract<currentTiddler>] }}}/>`;\n}\n`\n</$list>\n</$reveal>\n"
        }
    }
}
1050px
1040px
906px
pshiue-lamrim2
zoomin
<p style="text-align:justify">大家好!非常開心,第一輪的全廣在所有同學的努力下結束了。我想參加第二輪的全廣,所以自己對研討有一個深深的期待就是:希望不管我們身在何處,到了研討的時刻,我們此刻就都在專心致志地學習《廣論》。這樣的時刻,希望成為我們生命中最最美好的回憶,也是我們隔著千萬里能夠相聚的一個難得的時光,所以我是很開心、很開心的!<span style="color:rgb(42, 100, 150)">&nbsp;[00′51″]</span></p>
<p style="text-align:justify">  我想像著,大家在不同的國家,你們是坐在沙發上嗎?坐在椅子上嗎?你們還是在哪裡呢?你們是聚上一小組、一小組的,當然還有的研討班是隔著國家,他們是每個國家一兩個、一兩個人這樣的一個研討班,都非常非常地不容易。無論如何,我們將開始第二輪了,所以我是非常非常開心地參與這個學習,希望我們能夠共同進步。<span style="color:rgb(42, 100, 150)">&nbsp;[01′22″]</span></p>
<p style="text-align:justify">  那麼一開始就是,今天先聽一小段師父的開示:</p>
<blockquote>
<h4>南無本師釋迦牟尼佛(三遍)</h4>
<h4>無上甚深微妙法,百千萬劫難遭遇,我今見聞得受持,願解如來真實義。</h4>
<h4>  今天我們開始修習《菩提道次第廣論》,這是宗喀巴大師所造的。那麼平常我們前面先要提一個重點,通常我們稱為「玄義」,也就是把我們所要學的這個內容,它主要的綱領、特質,簡單地、扼要地把這個重點說明。不過,對我們現在在座的大部分同修來說,是初機,剛剛進入佛門,所以用平常正規的這種狀態來說的話,大家不一定能夠體會到、領會到它的深入的正確的意義。結果呢,花了很多的時間而得到很小的受益,這個其次。進一步,因為他不了解,剛開始聽了這個不懂的東西,沒有興趣,把他的這個熱忱會減少,這是一種損失。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[04′06″]</span></h4></blockquote>
<p style="text-align:justify">  聽這一小段,大家聽到師父帶我們念「<strong>南無本師釋迦牟尼佛</strong>」的時候,學過《三十五佛懺》的同學都知道,一聲南無釋迦牟尼佛能消萬劫的罪障。那麼剛才是我們隨著師父念了三句「南無本師釋迦牟尼佛」,所以這一刻的時光對你我來說非常地珍貴,因為我們專心地持誦,可以消萬劫的業障。<span style="color:rgb(42, 100, 150)">&nbsp;[04′41″]</span></p>
<p style="text-align:justify">  然後下面「<strong>無上甚深微妙法</strong>」,剛開始學的時候,因為師父的講說,所以我們會覺得《菩提道次第》還是滿親切的,但是它確實是無上、甚深、又微妙的法,又多麼地難遇呢?「<strong>百千萬劫難遭遇</strong>」,這個遇到難遇妙法的時光,和我們難得人身的這樣的一個時間,學過第一輪《廣論》的同學都知道「盲龜遇浮木」這個譬喻,實際上得到人身是很難的、遇到教法是很難的。得到了人身、遇到了教法,又能生起信心還是非常難的。有了信心,又能夠在聞法上——我「今」,現在,「見聞」,然後能夠在心裡邊「受持」。所以我們所有的人一起來發心,非常非常地希願能夠得到佛陀真實的意趣。<span style="color:rgb(42, 100, 150)">&nbsp;[05′44″]</span></p>
<p style="text-align:justify">  師父在這裡邊說:《菩提道次第廣論》是宗喀巴大師造的。然後下面說:如果用一個綱領式、特質式、扼要式地把重點說明——說「<strong>玄義</strong>」,其實一般的初機還不太理解。剛進佛門,用這種方式大家不一定能夠體會到。講到這一點的時候,師父加大了一個用語,說:「<strong>不一定能夠體會到、領會到它深入的正確的意義。</strong>」注意哦!深入的正確的意義,這句話其實對我們的人生有著很大的醒覺作用吧!比如說,我們做哪一件事是對我們的生命有著極其深遠、深入,而又極其正確的意義呢?那麼聞法算不算一個呢?<span style="color:rgb(42, 100, 150)">&nbsp;[06′40″]</span></p>
<p style="text-align:justify">  然後師父非常非常擔心,我們花了很多時間,卻得到很小的受益,因為我們沒有體會到,因為我們是初機。談到這一點,可能一些同學說:「我們不是初機了,我們學了一輪了。」可能還有的同學說學了好幾輪了。那學了好幾輪之後,你的心有沒有隨著一輪又一輪,變得越來越輕巧呢?當我們在這個人世間,遇到種種境界的磨折的時候,自己有沒有越會飛翔?在面對很多困境的時候,會不會保持正念、保持陽光的這樣一個心態?<span style="color:rgb(42, 100, 150)">&nbsp;[07′29″]</span></p>
<p style="text-align:justify">  如果學了好幾輪之後,發現自己有的時候還是心意沉沉,那麼這一輪的學習就很期待我們能再度地注入正法的強大力量,因為我們在一起學。當你覺得感覺麻木,或者注意力不集中,或者你沒有心力,我一直會在這邊提醒你、提醒你,我們一起來學。所以不要花了很多時間,卻得到很少的受益。師父很擔心我們這樣子,所以師父要採用一個下面的講法,他會在下一段講。<span style="color:rgb(42, 100, 150)">&nbsp;[08′10″]</span></p>
<p style="text-align:justify">  師父說「<strong>這是其次</strong>」,進一步師父又幫我們想了。師父說:如果花了很多時間,得到了很小的受益,又沒有體會到、領會到它深入的正確的意義的話,剛開始聽了不懂的東西,沒有興趣,把他的這個熱忱就會減少。聽了一個不懂的東西就沒有熱忱,沒有熱忱的話,師父後面一句話,注意哦!後面那句話,記得!說:「<strong>這是一種損失!</strong>」是一種什麼損失啊?就是我們開始聽佛法的時候沒有聽懂,沒有聽懂的時候產生不了熱忱,有一類人會這樣。但是我也看到還有一類人,他聽不懂他更想聽。當然也有一類人,費了好大力氣聽不懂,他就放棄了。<span style="color:rgb(42, 100, 150)">&nbsp;[08′58″]</span></p>
<p style="text-align:justify">  大家看一看,師父想把這麼美妙的一本無上甚深微妙的法給我們講的時候,他抱持著一個非常非常小心的心,小心地呵護著我們。那些由於慧力不夠啊,由於經驗不足等等產生的不理解,甚至對正法沒有熱忱,師父非常擔心我們錯過這個跟《菩提道次第廣論》,或者說跟教法相遇的時光。所以可以想見,他在給我們講這本論的時候,曾經經歷了多少?多少次站在我們的角度上去考慮,我們學這本論的難點是什麼?那麼他在講的時候,儘量避開我們容易產生困難的那些方式。也可以說,把每一個弟子看得像他的掌上明珠一般,因為進了《廣論》課堂之後,最好能夠了解、深入地了解它正確的意義。<span style="color:rgb(42, 100, 150)">&nbsp;[09′59″]</span></p>
<p style="text-align:justify">  所以讀到這一小段的時候我是很感動的,因為師父非常擔心我們由於聽了不懂、沒有熱忱、沒有興趣,對正法的這個熱忱的興趣減少之後,我們錯失了生命最殊勝的一段因緣。師父說:「這是一種損失!」很顯然他絕對不希望這種損失發生,如果發生了,他不希望繼續。所以一開頭,師父的悲心就躍然紙上,清晰地傳到你我的耳中。要知道師父為了把這部《廣論》講到你我的心中,他曾經用了多大的心血,用了多少在經驗上的摸索,他珍惜地愛護著每一個能夠聽到《廣論》的同學,特別擔心大家沒有興趣。<span style="color:rgb(42, 100, 150)">&nbsp;[10′56″]</span></p>
<p style="text-align:justify">  那麼重點出現了!這一輪的學習,就希望我們能夠提起很強的一個歡喜心。當然說,歡喜心這件事如果沒有、硬提的話,這好像有點困難。關鍵是我希望你是不由自主地深入其中,因為這正是《菩提道次第》的魅力所在,也是師父的善巧和悲心,幾乎洋溢在《廣論》的每一個字裡行間。<span style="color:rgb(42, 100, 150)">&nbsp;[11′28″]</span></p>
<p style="text-align:justify">  所以,提起歡喜心有那麼難嗎?諸位想一想。不管你學幾輪了,希望對於這一輪的研討《廣論》,還是抱著強烈的期待、保持著初心。就像剛上學的小朋友那樣,想要重新再學一遍——這裡邊還有多少多少內涵,是我當初完全忽略的?甚至我自己的聽聞前行也麻木了,甚至對師父的感恩心也慢慢地變淡......如果有上述習慣的話,大家聽了之後,就好自向心內觀察。我也是,我要向心內觀察。<span style="color:rgb(42, 100, 150)">&nbsp;[12′04″]</span></p>
<p style="text-align:justify">  總之,期待這一輪的《廣論》學習,我們要把對正法深沉的熱忱和歡喜心,供養給師父、供養給釋迦牟尼佛,還有千千萬萬為了救度我們努力把自己修成菩薩再成佛的所有善知識。總之很期待跟大家一起隨著師父的講說,在智慧和悲心的虛空中盡情遨遊!<span style="color:rgb(42, 100, 150)">&nbsp;[12′32″]</span></p>
<p style="text-align:justify">  好!今天就先講到這兒,謝謝大家,謝謝! [12′37″]</p>
<p style="text-align:justify">法師、同學們好!今天我們將要一起共學下一節。在學習之前,希望大家能夠策勵自己的發心,不要以一個非常平常的狀態來聽這一節課。我們要有一個大乘的殊勝發心——為了利益無窮無盡的有情,我們必須證得無上正等菩提;證得無上正等菩提必須要聽聞正法,所以我們現在就來聽聞法,以此作為能夠成就無上正等菩提的因。所以不管這一天的生活是如何地忙亂,你有多少心事、有多少委屈、有多少好像還沒有做完的事情,但是當我們打開《廣論》坐在這裡的時候,就請大家把那些忙碌的外緣都止息掉,專注地傾聽師父的法音,我們一起在心靈的深處給自己一個法的饗宴!<span style="color:rgb(42, 100, 150)">&nbsp;[01′14″]</span></p>
<p style="text-align:justify">  好,那麼我們現在就開始一起聽一小段師父的開示:<span style="color:rgb(42, 100, 150)">&nbsp;[01′22″]</span></p>
<blockquote>
<h4>  所以我改變一個方法講,我頭上只是非常簡明地來說,而把這個簡明的理由,就馬上能夠運用在我們身心上頭的,那麼提起我們對本論的一個興趣、好樂,了解了本論的殊勝,產生一個善法欲。換句話說,一種強有力的欲望,本來這個欲望通於世間的,現在我們這個欲望是追求善法的欲望。而這個善法欲,是策發我們精進的必要的基礎,有了這個,那麼才能夠得到佛法的真正的好處。換句話說,真正講修行上去的步驟是這樣的。等到我們把本論順著次第一步一步學下去,有了一個正確的概念,然後我們再提綱挈領,把這樣的一部大論,作一個綜合的結論,那個結論,以後作為我們行持的準則。實際上這個最後的結論,本來就是在最先應該講的玄義,這個首先來說明。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[03′01″]</span></h4></blockquote>
<p style="text-align:justify">  剛才我們就聽了那一小段,不知道大家在聽的時候有沒有走神?有沒有特別專注地聽?那麼我現在來就這一段提幾個問題,大家如果有手抄的話可以看,如果沒有手抄的話,你就想辦法聽,看你剛才聽的,在腦海裡有多少印象。<span style="color:rgb(42, 100, 150)">&nbsp;[03′23″]</span></p>
<p style="text-align:justify">  在這一小段裡,我要提出的第一個問題是:真正修行上去的步驟到底是什麼呢?你們可以想一想喔,在這一段真正修行上去的步驟是怎樣的呢?這是一個問題。應該在最後面講的那個結論,師父說就是在最先講的「玄義」,實際上應該作為我們行持的一個什麼?準則!所以師父作這樣一個很簡明的說法。<span style="color:rgb(42, 100, 150)">&nbsp;[04′00″]</span></p>
<p style="text-align:justify">  我又要提問題了,注意喔!為了了解它深入、正確的意義,花了很多時間我們也沒有得到,只得到很小的受益,師父害怕這樣我們不懂,會減緩善法欲,說這是一種損失。那麼師父把它改變成什麼樣子呢?師父說:「<strong>非常簡明地來說</strong>」,這是第一步。那請問第二步是什麼呀?記得嗎?有誰回答嗎?第二步是什麼?第二步是不是「<strong>把這個簡明的理由,運用在我們的身心上頭</strong>」?是不是?注意喔!把這個簡單的理由用在我們身心上,前面還有兩個字不要忽略掉,就是「<strong>馬上</strong>」!師父說:「就馬上」,下面還有兩個字「<strong>能夠</strong>」,「就馬上能夠運用在我們身心上頭的」。說:「非常簡明地來說」,把這個理由非常簡明地說出來,而且「馬上能夠運用到我們身心上頭的」,因此「<strong>那麼提起我們對本論的一個興趣、好樂</strong>」。<span style="color:rgb(42, 100, 150)">&nbsp;[05′18″]</span></p>
<p style="text-align:justify">  為什麼把一個簡明的道理馬上能夠運用到我們的身心上頭,我們就能夠提起對本論的一個興趣和愛好呢?很顯然,管用嘛!實用,對不對?假如我去買一個想用的東西,拿回家之後......比如最簡單的一個東西吧!吹風機。打開之後,一開電門它不會吹,或者它吹的風是亂風,或者夾頭髮,那麼這種都是不能用的。如果給我們一個非常非常美的真理,馬上能用在身心上,然後能夠解決問題,啊!我們內心裡一定是很興奮的,覺得很期待!<span style="color:rgb(42, 100, 150)">&nbsp;[06′01″]</span></p>
<p style="text-align:justify">  所以師父說:「<strong>了解了本論的殊勝,產生一個善法欲。</strong>」就是你有一個希求心。所謂的希求心,就像吃了一個好吃的,吃完了過一會兒之後你就覺得:「啊!回味起來那個味道真是美呀!下次還要再吃一次。」就是重複地再去、想得到的,對法的一種善法欲。然後師父解釋「善法欲」,說:「<strong>換句話說,一種強有力的欲望。本來這個欲望通於世間的,現在我們這個欲望......</strong>」注意喔!師父用了「強有力的希求善法的欲望」。<span style="color:rgb(42, 100, 150)">&nbsp;[06′41″]</span></p>
<p style="text-align:justify">  那麼我們為什麼對這個善法產生了這樣強烈希求的願望呢?就是因為這麼簡明的道理聽清楚了,又馬上能夠用在身心上面——觀察自己的心。對周圍的環境用一個什麼樣的觀點呢?應該說,去評判也好、念恩也好,應該用什麼樣的正知見去看。一旦我們慢慢地去訓練這個的時候,我們就會在內心深處,生出一種至少是對周圍環境的諒解,有的時候也會發生對自我的諒解。或者比如說,現在你可能很累很累,你的心很想休息一下,那你是否感覺到慢慢地有點恢復氣力,沒那麼累了?因為在聽法的時候,會讓特別特別疲憊的心得到一個休息和調整的感覺,這也是法能帶給我們的利益。<span style="color:rgb(42, 100, 150)">&nbsp;[07′48″]</span></p>
<p style="text-align:justify">  所以,如果我們曾經在一個地方很好地調整自己,或者走投無路的時候從什麼地方得到了啟示,然後突然找到了希望,而這些在法上都可以得到,那麼我們就會有善法欲——師父在這裡邊說「強有力的善法欲」。<span style="color:rgb(42, 100, 150)">&nbsp;[08′10″]</span></p>
<p style="text-align:justify">  「而這個善法欲」,師父下面提出了我最開始提的問題:真正修行上去的步驟是什麼?你們還記得這問題吧?「<strong>而這個善法欲,是策發我們精進必要的基礎</strong>」。所以善法欲的意思就是——你要很想學、你要很高興學。注意!這不是要求,而是你心裡就是這種滋味、就是這種感覺——很想學,學起來覺得開心、覺得沒有負擔。不但沒有負擔,還把每天工作中、生活中、人事上,或者你跟自己彆扭的那些心情,也說不明白的那種感覺,透過研討《廣論》,不知道為什麼就好像沒那麼沉重了。如果是這樣的話,還是那句話——我們就會帶一種歡喜心想要再去聞法。這種心就是精進的基礎,因為精進的定義就是「勇於善」,它在善上非常勇;「勇」還有一種非常歡喜的意思。<span style="color:rgb(42, 100, 150)">&nbsp;[09′15″]</span></p>
<p style="text-align:justify">  注意喔!注意!不要走神!師父說:「<strong>有了這個,才能夠得到佛法真正的好處。</strong>」問大家一句:師父希望誰得到佛法真正的好處啊?就現在在聽聞的你,有想嗎?師父就是希望在聽聞的你——正在聽聞的我,得到佛法的好處。那麼這個好處,一定是聽了簡明的道理,把它用在身心上,然後產生善法欲,慢慢地獲得精進,這樣得到的。&nbsp;<span style="color:rgb(42, 100, 150)">[09′51″]</span></p>
<p style="text-align:justify">  所以師父說,等到我們獲得了這個精進之後,其實就可以得到佛法的好處了。因為他有一個很歡喜地去行持法的基本心態,應該說很陽光、正面的心態,開啟了我們內心中很多的正能量,讓我們慢慢地擺脫負面作意、負面思惟、悲觀的理路。乃至平常習慣在一堆煩惱裡邊左纏右纏、上纏下纏,就是不肯出來!但是《廣論》一打開,師父的法音開始出現的時候,哎!突然攪煩惱那個續流就斷掉了,我們就開始專心在法上,這無疑是我們生命一個很大的期待和喜悅。所以希望大家能因為上這節課,自己感到歡喜呀!<span style="color:rgb(42, 100, 150)">&nbsp;[10′49″]</span></p>
<p style="text-align:justify">  然後師父講到最後一段,說:有了一個這樣的正確概念,然後順著次第一步一步地學下去,到最後提綱挈領變成一個行持的準則。這是最後的結論嘛!講了這一段。&nbsp;<span style="color:rgb(42, 100, 150)">[11′02″]</span></p>
<p style="text-align:justify">  所以,這一小段最重要的問題應該就是善法欲。<u>但是善法欲是怎麼形成的?</u>就是聽到了一個道理——正念之後,大家要在身心上去訓練。那麼請問:這一段師父對我們最深的期待是什麼?<u>就是期待大家把簡明的道理聽了之後,要馬上在身心上去實踐;實踐了之後,才會知道佛法的美妙。</u>也就是能不能用聽來的這個道理,來改變我們的身心世界?<span style="color:rgb(42, 100, 150)">&nbsp;[11′42″]</span></p>
<p style="text-align:justify">  在這裡邊我作一個簡要的分析:把簡明的理路馬上運用到我們身心上頭的話,會產生什麼作用呢?比如第一點,如果我們身心上頭是苦的話,一定要有一個對付苦的辦法;這個對付苦的辦法,一定是從聽聞中來,或者你從聽聞其他教典裡來的。那麼要觀察一下:這個苦到底有沒有因?是無端生起的,還是有因的?如果這個苦有因,這個因到底是不能改變的,還是可以被消除的?如果這個苦和它的苦因都是可以被改變和消除的,那我們現在所遇到的境遇呀,還有各種不理想的狀況都是可以改變的。光是知道這一切都是可以改變的,其實我們就稍稍有一點沒那麼沉重了,不是嗎?<span style="color:rgb(42, 100, 150)">&nbsp;[12′39″]</span></p>
<p style="text-align:justify">  所以佛法其實講的就是向內調伏、調伏身心,然後能帶來心靈的喜悅、擺脫心靈的重負。它就是在處處研究我們現行的煩惱——現在正在進行的這種煩惱,它的本質是什麼?它有沒有苦因,可以把苦因拿掉?那麼快樂雖然好像有的時候離我們很遙遠,但是有時候也垂手可得。而我們此處想要尋覓的快樂,到底是什麼等級的快樂?大家可以稍稍期待一下,那就是下一段。 [13′16″]</p>
<p style="text-align:justify">大家好!今天我們來繼續學習下一段。還是要注意策勵自己的發心,在聽聞的時候有一個大乘的意樂。因為這大乘的意樂其實就像一個方向一樣,它會把我們聽這一節課哪怕是幾分鐘所造作的這個業,都引領到無上菩提的方向。而引領到無上菩提的方向,就好比是一滴水的善,我們把它放進了大海,那麼這一滴水就永不乾涸。然後在聽完的時候,再把它迴向無上菩提,所以就做了一個非常完美的聽聞——發心、正行和結行。</p>
<p style="text-align:justify">  好,那現在我們接著聽一段。<span style="color:rgb(42, 100, 150)">&nbsp;[00′46″]</span></p>
<blockquote>
<h4>  所以現在我們用簡單的方法。《菩提道次第廣論》,那麼說些什麼呢?簡單地說一下。「菩提」,翻成功我們中文叫作覺,大家曉得——覺悟。這覺悟些什麼呀?平常我們說叫「自覺、覺他、覺行圓滿」,這個我們也不必一個一個解釋。拿我們最現實的,也最具體的說明——我們目前,大家追求的是什麼?快樂。昨天說過了,簡單地說,這樣;更深一層地,或者是仔細一點講的話,要想把痛苦解除,要想快樂得到。當你把痛苦徹底解除的時候,得到的快樂是圓滿的,不會有毛病的,這樣;應該說,不會有毛病的,但是並不圓滿。而不但這個快樂沒有毛病,而且圓滿的,這樣。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[02′01″]</span></h4>
<h4>  那麼我們為什麼得不到呢?我們這麼努力去做,為什麼得不到呢?原因是說,我們雖然認真去做了,因為我們並沒有對我們所做的事情有正確的認識,沒有正確的認識,你雖然辛苦忙了半天,卻不一定有好結果。比如說我們生了病,要去找醫生,你去找醫生,假定你對這個醫生有沒有本事,這個藥對不對,你都不知道,隨便找一個蒙古大夫,隨便弄一點藥吃吃的話,病治不好;不但治不好,乃至於更加重你的病苦。同樣地,世間的任何事情都是如此,所以我們雖然要求這個好的目的,但是因為並不了解怎麼去做。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[02′58″]</span></h4></blockquote>
<p style="text-align:justify">  今天師父就先講了一下《菩提道次第廣論》「菩提」這兩個字。請問大家:菩提翻成中文叫什麼呀?覺!談到「覺」,就有三方面,一個是什麼?「自覺」。還有什麼?「覺他」。然後第三個是「覺行圓滿」,在這裡面就沒有解釋了。但是師父是怎麼解釋啊?師父說:「<strong>拿我們最現實的,也最具體的說明——我們目前,大家追求的是什麼?</strong>」大家追求的是什麼呀?「<strong>快樂!</strong>」所有人都要追求快樂,連小鳥、小昆蟲......什麼都是在追求快樂。那麼師父說:「<strong>更深一層地,或者仔細一點講,要想把痛苦除掉,要想快樂得到。</strong>」這個過程,除掉的痛苦是徹底解除、得到的快樂是圓滿的話,那是正確的。<span style="color:rgb(42, 100, 150)">&nbsp;[04′06″]</span></p>
<p style="text-align:justify">  師父在這裡面就舉出了,注意喔!想一想上一段我們學的,怎麼樣用一個簡明的道理,馬上用到身心上頭,我們就提起了興趣、產生了善法欲呢?就是因為佛法攸關於我們的苦樂問題——這個覺悟啊!「覺悟」也是淨化和證達的意思,中文用兩個字表達就是覺悟。覺悟就是已經到達生命的一個圓滿的境地,這裡面指的是無上菩提。&nbsp;<span style="color:rgb(42, 100, 150)">[04′37″]</span></p>
<p style="text-align:justify">  那無上菩提之路說起來是什麼呢?就是步步離苦、步步得樂的這一條路。如果我們知道:喔!佛法原來是一步一步讓我的身心擺脫痛苦、一步一步得到快樂的話,那不是人人都欣樂之、人人都嚮往嗎?所以,大家想一想,如果這樣的話,我們會不會有善法欲呢?我們聽來的這樣簡明的道理,可以用在身心上除苦引樂,然後每天步步積累、步步積累,這樣的生活誰不嚮往呢?所以師父在本論的開頭,希望我們把聽來的佛法用在身心上,去掉痛苦、得到平靜和歡樂,這就是我們對《廣論》產生的希求心。大家可以想一想是不是很踏實?是不是很接地氣?很現實、很現實!所以佛法的作用,也是非常非常實惠的。<span style="color:rgb(42, 100, 150)">&nbsp;[05′40″]</span></p>
<p style="text-align:justify">  那麼既然這麼好,說有一種可以徹底地把痛苦都去掉,把所有的快樂都圓滿這樣一條無上菩提之路。對比一下我們的現狀吧!然後師父就說了:「<strong>我們為什麼得不到呢?</strong>」現在我們為什麼得不到呢?分析的原因就是:認真做了沒?認真了。那什麼原因呢?就是我們對所做的事情「<strong>沒有正確的認識</strong>」。提到這一點的話,可能就要產生廣泛的討論了。<span style="color:rgb(42, 100, 150)">&nbsp;[06′12″]</span></p>
<p style="text-align:justify">  因為沒有正確的認識,所以忙了半天,都不一定有好結果。一般說教育小孩這件事,大家就都有經驗了。一個小孩子,比如他認為背書有什麼重要的呢?他認為玩比較重要,玩就像大人工作一般重要,為什麼要坐在學堂裡背書,犧牲掉那麼多珍貴的玩的時間呢?如果一個孩子,讓他盡興地玩,玩到十八歲的話,那整個青少年就什麼都學不到了。所以一定也要對坐在課堂裡讀書有個正確的認識,然後才能夠不辜負光陰。所以這個正確的認識,就有賴於家長和老師對我們這些所謂的小小頑童的慈愛和管束。&nbsp;<span style="color:rgb(42, 100, 150)">[06′57″]</span></p>
<p style="text-align:justify">  那麼對於我們想要達成無上菩提的人來說,沒有一個這樣的老師引導我們,告訴我們正確的離苦得樂之道是什麼?甚至心裡正在進行的這個苦認不認識?還要進行下去嗎?離開痛苦的辦法在當下到底是什麼呢?如果沒有得到一個好醫生,生了病的話,可能還會病上加病。如果我們家裡附近有一個名醫,可能無形中就會成為你的一個依靠,有點病你就去問他:「怎麼回事啊?」然後這醫生態度又特別好,會特別慈悲告訴你,又給你開藥、又關注你。那你想想,他是不是人生路上的一個良伴、一個絕對不可或缺的真摯朋友?我覺得師父就是在用這樣一個非常非常親切的辦法,把一位非常非常偉大的人物,或者對我們生命的苦樂息息相關的人介紹給我們。那個人到底是誰呢?接著往下聽!&nbsp;<span style="color:rgb(42, 100, 150)">[07′59″]</span></p>
<blockquote>
<h4>  那麼現在有這麼一個人,他是徹底完全覺悟了,告訴我們這個道理,告訴我們這個道理,所以這個叫作「覺」。覺悟什麼呢?任何一件事情對、錯,他完全了解了,這樣,那就是所謂這菩提就是覺的意思。那麼我們要想得到這個結果的話,不但聽到那個道理就算了,還要照著它去做,所以,你照著它這個方法走上去的這個步驟,叫作「道」,這麼簡單。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[08′43″]</span></h4></blockquote>
<p style="text-align:justify">  所以師父要給我們介紹的這個偉大人物,可能學過的同學早都知道,就是我們偉大的佛陀!師父用非常親切的引導,從我們身心的苦樂這點開始,發現我們都沒法讓自己一直永久處在快樂的狀態,甚至有了痛苦,擺脫掉的時間也很長,甚至有些痛苦就緊緊地撕咬著自己的身心,是沒法擺脫掉的,變成一生一世的牽纏和羈絆。那麼有沒有一個人,他的痛苦全部解除了、他的快樂全部都圓滿了?師父就在滿天的星辰之中,引導我們去看佛陀——這位非常耀眼、比星星更耀眼的導師!<span style="color:rgb(42, 100, 150)">&nbsp;[09′35″]</span></p>
<p style="text-align:justify">  那麼說:他把生命所有的苦都解決、樂都得到了。然後師父說:他完成了三種——自覺、覺他、覺行圓滿,任何一件事情的對和錯全部都了解了。師父就告訴我們說,在宇宙間、在天地間、在人世間,曾經有這樣一顆心,而且他現在也是存在的,這顆心是存在的。他心中有一個量,這個量,就是對所有的事情完全沒有顛倒的看法;他的見解一如既往地清澈和準確,乃至精確,沒有一絲絲的錯謬。所以他去除苦因的方式是正確的,苦因被去掉了,所以沒有苦果;那麼得到快樂的因是正確的、是種下去了,繼而令它圓滿,所以他的快樂也圓滿了。這苦和樂的去除和得到,只是源於這顆非常非常有智慧的心,他對一切事情有正確的知見、有正確的看法,完全沒有顛倒。<span style="color:rgb(42, 100, 150)">&nbsp;[10′41″]</span></p>
<p style="text-align:justify">  他告訴我們得到菩提的辦法,那這個辦法到底是什麼呢?就是「道」——菩提道,師父就解釋第二個字了。大家有沒有看到,師父把這個「道」字解釋得是何等地親切——就是佛陀告訴你一個方法,那個方法就是怎麼樣能夠得到全部的快樂呢?怎麼樣能夠幫我們生命所有的痛苦都去除掉呢?天底下有這樣的事情可以達到嗎?像我這樣每天煩煩惱惱,也沒有什麼心力,又很多事情在忙的人,真的有機會會晤到偉大的佛陀嗎?能夠知道這樣了不起、如此親切溫馨的「道」嗎?打開本論就是了!師父已經走到我們中間,在為我們講述了。所以這是一件多美好的事情!大家一定要好好地珍惜每天跟師父會晤的時間,也是跟佛陀、祖師們會晤的時間——就是在研討的時刻啊!謝謝! [11′46″]</p>
<p style="text-align:justify">好,接下來請大家繼續向下聽。</p>
<blockquote>
<h4>  那麼下面的「次第」呢?任何走這個路,一定有個次第,一定有個次第。比如說,我們爬樓梯,一定是下面一階階上來,沒有一個事情是例外的。不要小看這個喔,不要小看它呀!實際上那個次第是非常重要的。平常我們做任何事情的時候,要注意幾樣東西,平常我們說:質、量;質是講這個東西對不對,量是講這個夠不夠。隨便,譬如我現在說前面一杯水,我要喝水,那麼不僅僅是它水對不對,當然,不但對不對,還髒不髒,這個是就它的質純淨與否。單單這個質夠不夠?不夠,你說一滴水也是,一滴水喝了不能解決你的渴,還要什麼?量。所以質是要正,量是要足。除了這個對不對?還要一樣東西——次第。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[01′03″]</span></h4>
<h4>  小事情我們往往不大注意,忽視掉了,實際上呢,次第是非常重要。平常舉一個非常簡單的比喻,我們燒飯,我們大家曉得要米、要水,然後要火,把幾樣東西要洗。這個我們不能說反正要火、要水,大家混在一塊兒來,這個不按次第不行。你一定把那個米拿來先洗乾淨了,加了水,放下去燒。你不能說反正要水、要火,我先燒完了以後再洗,那個沒有用,那個沒有用。燒焦了,你怎麼可以?就算不燒焦,燒出來,髒的怎麼可以?譬如說燒菜——那是米的話,已經弄乾淨了——燒菜的話,你不能說那個菜田裡拔出來,我燒完了再洗,這個裡邊都是泥巴,然後呢,乃至於有農藥,一吃下去,本來給你營養的,反而把你毒死。所以「次第」,所以現在我們說,我們要想達到這樣的一個目的,應該走這樣的路,這個路過程當中還有必然的這個次第。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[02′14″]</span></h4></blockquote>
<p style="text-align:justify">  大家都有聽清喔?這一段師父是解釋了一下「次第」。次第,顧名思義就是先後的次第。談到次第,一定是先做什麼、再做什麼、再做什麼。那麼這個次第是不是固定的?還是可以相互移動的?然後師父講了前面的例子,比如講了燒飯等等,這個顯然是不能夠移動的,它的次第是絕對要固定的。就是先做什麼、後做什麼事,比如說先洗菜,然後煮菜、吃菜,這個是不能翻過來的。<span style="color:rgb(42, 100, 150)">&nbsp;[02′57″]</span></p>
<p style="text-align:justify">  所以,師父在這裡邊提到了質量,質要正,量要足,然後這個次第絕對不是一件小事情,說大家不要忽略它!提到這一點,我想問大家:請問此處的次第,是對什麼事情的次第呢?是在談這個「道」的次第,對不對?那麼次第,師父用非常簡明的、我們每天生活中會遇到的事情來告訴我們:次第這件事,必須是先走下面的臺階,然後才能夠上上面的臺階。比如這本《廣論》,它用三主要道攝要,先是出離心,然後菩提心,然後空性。比如一個弟子想要尋覓真理的時候,先要尋覓善知識,善知識要有德相,這個弟子要具足弟子相,然後師生相應,才能夠生起道次第最初的上師相應的量,才能得到後面的量。這一切都是有完整清晰的次第,諸佛菩薩在千經萬論裡都在講這樣一個次第。<span style="color:rgb(42, 100, 150)">&nbsp;[04′14″]</span></p>
<p style="text-align:justify">  那麼此時此刻,師父把這個「次第」、「次第」二字送到我們的耳畔,一定要注意到這是關於「無上菩提道」的次第,和平常怎麼燒飯啊......我們平常的那些,是有著深廣意義的不同。舉個簡單例子,如何建立教法呢?它的次第是什麼呢?所以師父就建立了僧團。那麼在建立僧團之前,師父就想要把《菩提道次第廣論》講給很多很多的居士聽。在這個過程中,經歷了很多起起伏伏、天南海北的——捧著這本書,想把這本道次第無上的法寶送給我們。可以想像他老人家經歷了多少艱辛地探索,找到現在這種解釋的方式,我們容易聽,可以把心放進去,然後想要了解《菩提道次第廣論》到底在說什麼。師父的悲心和善巧,讓我們非常輕鬆地去了解什麼叫「次第」。<span style="color:rgb(42, 100, 150)">&nbsp;[05′27″]</span></p>
<p style="text-align:justify">  當然談到「次第」兩個字,現在我們寺院五大論班的法師,學習到了比如說《攝類學》的次第是什麼、《心類學》的次第,還有《釋量論》,乃至《現觀》、《中觀》、《俱舍》等等的次第,尤其是在菩薩道的次第裡,學習到了初地到十地的功德。可是在此處,師父就用煮飯啊、一杯水呀、上樓梯呀這麼簡明的喻,讓我們趣入到對無上菩提的次第的探討和希求。<span style="color:rgb(42, 100, 150)">&nbsp;[06′02″]</span></p>
<p style="text-align:justify">  所以在此很感恩師父,能用這樣非常平白的道理,讓我們知道次第這件事實際上是很大很大的!如果沒有前面的次第,那麼將沒有後面的次第;如果前面的次第沒好好努力的話,腳下的一步沒有,怎麼可能有以後的路呢?那麼此時此刻當下的你我在做什麼呢?我們就是在一起聽聞《菩提道次第廣論》,師父在解釋「次第」這兩個字。而這兩個字對我們生命的無上的意義是什麼呢?就是我們將了解如何徹底地離苦、如何究竟地得樂,它的次第是什麼。就如了解登一個樓梯、煮一個飯的次第一般的簡明的方式趣入,我們將要在我們的心中、在我們的生命中,開始對無上菩提之路的探索,這一定是一件很令人驚喜的事情。所以「次第」二字,終於落到我們的識田裡了!<span style="color:rgb(42, 100, 150)">&nbsp;[07′12″]</span></p>
<p style="text-align:justify">  那麼這個次第,將在我們的生命中揭示出一重比一重的美好、一重比一重的欣喜。這個次第可能是經典裡面師父給我們講的次第,這個次第同時也是我們認識自心之後,在自心中所看到的次第。那麼這個次第一定是步步離苦、步步得樂,它是從眼下的迷惘、眼下的沉悶,慢慢地變清晰,看清腳下踩的是什麼?當下一步是什麼?當下一步的離苦得樂究竟是怎麼走法?所以還是回歸到佛法的實用性,它非常非常地貼緊我們的身心,它是腳踏實地的一條路,不是玄而又玄的空中樓閣,看著很好、說著很好聽可是不實用,不是這樣的!完全不是這樣的!<span style="color:rgb(42, 100, 150)">&nbsp;[08′11″]</span></p>
<p style="text-align:justify">  師父指給我們的,就是這樣非常踏實、有次第可循的,而且非常真實的離苦得樂的一條路。所以非常希望大家能夠好好地珍惜每一次學習的機會,把它好好地努力下去,看一看這個次第到底在我們的生命中重要到什麼程度?尤其是——最初的次第是什麼呢?步步的次第又是什麼呢?如果這所有的次第都關係著我的苦樂,那麼真的是一件很令人新奇的事情。&nbsp;<span style="color:rgb(42, 100, 150)">[08′50″]</span></p>
<blockquote>
<h4>  那麼下面叫「廣」,「廣」是詳細地來說明這件事情,來說明這件事情。我這地方再特別說明一下,我完全都是用最通俗的名字來講啊,下面大家也許說,那平常我們這樣,好像聽那個書本上面,也許你有可能兩種反應。大家注意喔!一種呢,大家如果習慣於平常我們教學方式的話,也許覺得這個好像不夠書卷氣。還有一種呢,也許習慣了,聽完了這個,很歡喜的話,就不再歡喜平常我們一般的正規狀態。那麼這兩點,我們都這地方要說明,要改善的。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[09′44″]</span></h4>
<h4>  第一種情況,他習慣了文謅謅的這種語言以後,驟然聽了以後,覺得不大習慣,那這是難免的。但是我們要了解,你今天跑得來聽這個東西,你目的幹什麼?假定說你是學文的、學什麼的,那對,用不著到我們這個地方來。你可以到普通的文學院裡面去,哪一個學校,研究佛教史,研究中國文學,然後研究西藏文學,寫出最好的文字來,根本用不著到這裡來!我們這裡主要的目的是,要了解了講修持,然後照著去修持的話,證得這個覺悟的、圓滿的果。所以真正的重點擺在這裡,你不要忘記掉了!所以在這個場合之下,為了適應我們的條件,這樣!那麼你慢慢地、慢慢地自然心裡面,就不會受以前習慣的影響。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[10′45″]</span></h4>
<h4>  還有一種呢,也許我們在這裡聽得滿歡喜,覺得:哎呀,這個講的道理的的確確聽完了我馬上可以用上,很高興!於是不知不覺又會產生這種心理——在別的地方聽見這種照著次第去講的很多文字,你會排斥它,說:「唉,你看,那些講了個半天沒用!」這種心理也絕不可以!要曉得,它語言文字是絕不可少的,絕不可少的。做任何事情,修學佛法亦復如是,必定要透過這一個東西來說明,次第地深入,我們才能夠懂得。只是我們目前狀態,是因為條件所限,所以不能用得它深的地方去,才這樣的,這個我們要了解,這個是要了解。所以,這兩種情況,我就事先先說明、避免。越到後來,我越是會用比較像學校裡念書這樣,用各式各樣的成語文字來表達,這個首先說明一下。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[11′57″]</span></h4></blockquote>
<p style="text-align:justify">  這兩小段,開始講到「廣」了,就是廣泛地討論這件事、詳細地討論這件事,師父說他儘量用通俗的方式來講。其實我讀過師父的幾篇日記,師父的日記跟《廣論》的講法簡直是完全地天壤之別。師父的日記有點像半古文那樣,非常地簡潔,有的時候八個字表達的意思,可能要想很久。不是用這種好像散文的方式表達、像跟我們聊家常一樣這樣親切地表達出來的。&nbsp;<span style="color:rgb(42, 100, 150)">[12′34″]</span></p>
<p style="text-align:justify">  注意哦!在這裡邊師父點我們這種現行,就是「配不配我們胃口」的意思——你習慣說法師用什麼方式講給你呢?比如很多小孩也是,他之所以不願意聽爸爸媽媽的話,他覺得:「哎!我爸爸態度應該好點。」或者:「我媽媽應該說幾句、對我表達一些她很愛我呀,或者很心疼我這樣的觀點,我才能夠接受訓斥。」總之,我們在學習的時候,會有一些條件、有一些條條框框,覺得教我的人應該是這樣的、應該是那樣的等等這樣的習慣吧!&nbsp;<span style="color:rgb(42, 100, 150)">[13′14″]</span></p>
<p style="text-align:justify">  而且師父在前面還講說:「一開始的時候你可能不習慣,後來你習慣了之後,又對另一種不習慣。」師父說這兩種都要改善。注意哦!接下去的時候,對於喜歡聽文謅謅的,師父就非常地犀利說:「就去文學院聽!」其實我也是比較喜歡文學的。但是師父用這樣的方式講的話,也會同時還有一種優美的旋律。那麼這種優美的旋律,它常常緊扣著我們的心,我們的心中出現什麼樣的一個非理作意,哎!師父馬上就在帶子裡講了。說:「你想要做什麼?你想要聽到優美的文字啊,還是想要聽到什麼呀?那你是去念文學院,還是來聽解決生死道理的?還是來聽佛法的呀?」就是發現目的、宗旨好像偏移了,不知不覺偏移了。哎!師父就輕輕點一下,好像是說:「哎!某人啊,你又在想什麼呀?」&nbsp;<span style="color:rgb(42, 100, 150)">[14′17″]</span></p>
<p style="text-align:justify">  所以,在這裡邊再次地強調:我們這裡主要的目的要了解,了解了要講修持,講了修持之後要照著去修持,證得這個覺悟的、圓滿的果。所以它真正的重點放在哪裡呢?放在我們要了解真理;了解了真理之後,要想法去行持;行持後才慢慢去證得那個結果。<span style="color:rgb(42, 100, 150)">&nbsp;[14′46″]</span></p>
<p style="text-align:justify">  所以真理用什麼方式傳播的?那麼為什麼他會有這樣的選擇方式?他可能是根據廣大的漢地有情能夠應機的一個程度,不要講得太深。因為這樣一本《廣論》最初拿到手裡的時候——在十多年前我碰到,那個時候很多人都會害怕,說:「哇!這一本佛教撰著如此地厚、如此地專業,我們能學嗎?」其中廣論班同學還有沒上過學、不認識字,他也在廣論班裡,他就負責聽,連筆記也不會寫。這樣的艱難,都對師父講的法生起這樣的好樂心,所以可以想像傳遞的面是非常非常廣泛的,用這樣的文字。&nbsp;<span style="color:rgb(42, 100, 150)">[15′27″]</span></p>
<p style="text-align:justify">  那麼也聽過很重視文字的我的一些朋友,他們會跟我說:「哎呀!這些例子太多了,好像講得有點散。」當時我們在討論,我說:「『散』是什麼意思啊?是偏離主題的意思嗎?」我們就探討這個問題。當時我說:「師父舉的每一個喻,其實你在你的內心上觀察一下,都可能發現一種現行。不透過這些喻,實際上我們很難把佛法在身心上找到落腳點。」所以師父在這裡邊,就是希望我們不要對這種講的方式起太多的負面作意,這樣的話會影響我們專注在法義上。一旦法義聽不清楚,我們將無法把法義在內心上找到落腳點。這些勸慰非常地親切、非常地關注,就像一個父親勸自己說:「啊!在修這個車的時候,你要注意怎麼樣去拿扳手啊!怎麼樣去上油啊!怎麼樣把車輪倒過來的時候不要砸到你自己的鼻子啊!」等等,所以它是非常親切實用的方法。<span style="color:rgb(42, 100, 150)">&nbsp;[16′34″]</span></p>
<p style="text-align:justify">  在這裡再再地提醒我們說:為什麼來聽這節課呀?主要的目的就是要修行自己呀!修行自己什麼呢?就是要把痛苦的、不悅意的、纏繞身心的那些麻煩,透過聽聞佛法的緣故,能夠慢慢去解除種種繫縛,讓佛法成為生命清涼的一劑美藥,而且我們服著的時候覺得很愉悅、很歡喜。所有的喻、所有的理路,都只是為了指向這一點——也就是讓我們快樂、讓我們能夠清涼、讓我們不要活得那麼糾結。 [17′16″]</p>
<p style="text-align:justify"> 法師們好,同學們好!很開心又到了我們一起研討《廣論》的時間。</p>
<p style="text-align:justify">  在研討之前,大家還是要端正一下自己的意樂——是為了求取無上菩提,我們開始研討《廣論》。為什麼要取證無上菩提呢?因為我們在輪迴的世界。輪迴的世界是被苦性所攝的,而我們要追求的無上菩提是被樂性所攝的。所有的心都有離苦得樂的趨向性,那麼你我也同樣在這個離苦得樂的趨向性中。所以為了能夠達到生命最究竟、最圓滿的無苦的境界,我們虔誠地、莊嚴地坐在這裡,並且有一個大乘的發心——為了利益無窮無盡的有情,我們必須去希求佛果,所以要來聽聞。<span style="color:rgb(42, 100, 150)">&nbsp;[01′02″]</span></p>
<p style="text-align:justify">  聽聞的時候,因為時間很短,所以請大家一定要專注!不知道你們回去有沒有自己看書一下呀,或者自己聽帶一下?如果自己看一下、琢磨一下,我們再來研討,可能你會覺得首先更熟練一點;另外,你看看自己學這一段的思路,還有你的受用,和我們一起學了之後,有一些什麼樣的改變。<span style="color:rgb(42, 100, 150)">&nbsp;[01′32″]</span></p>
<p style="text-align:justify">  現在我們還是一起把這一段聽一下。注意聽!<span style="color:rgb(42, 100, 150)">&nbsp;[01′38″]</span></p>
<blockquote>
<h4>  那麼,所謂《廣論》的「論」,最後一個,平常我們就說,詳細地來討論,詳細地來討論這件事情。所以從這個題目上面,我們可以曉得說,我們現在學這個東西,就是怎麼樣從我們凡夫,下腳第一步開始,一直走上去,走到圓滿成佛的這條路。而這條路的過程當中,不管就它內容的正確與否來說,就它應該完成的數量來說,以及走上去的次第來說,它都有一個完整詳細的說明,詳細的說明。我們從這個上面,有了一個正確的認識,你照著一步一步實踐的話,就可以達到最高圓滿的境界,最高圓滿的境界,這就是本論的我們要學的。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[02′53″]</span></h4></blockquote>
<p style="text-align:justify">  好,先聽這一小段。聽了之後,我想提一個問題,大家想一想。師父說:「<strong>詳細地討論,詳細地討論這件事情。</strong>」請問是什麼事情呀?有人答嗎?能答出來嗎?什麼事情啊?詳細地討論什麼事情?不知道你們私下的答案是什麼呀?現在好想全部都聽一遍。有人答說是「菩提」嗎?對吧!菩提就是「覺」嘛,討論怎麼樣去成就無上菩提。&nbsp;<span style="color:rgb(42, 100, 150)">[03′41″]</span></p>
<p style="text-align:justify">  所以注意哦!師父說這件事情要被詳細地討論,而且師父重複一下:「<strong>詳細地討論。</strong>」那麼這件事情就在師父的講說中進入了你我的生命。我們平常生活中會有這件事情、那件事情,比如說去上班了、洗衣服了,或者思考一些這樣、那樣的事情。但是,如何去求證無上菩提的這件事情,有沒有詳細地討論?比如說這一年的積蓄怎麼花費呀,每天去菜市場買什麼菜、煮哪一道菜,還有商量家人的一些事情啊、朋友的事情,我們都會很詳細地討論;但是有沒有人跟我們一起討論怎麼樣趣向無上菩提呢?<span style="color:rgb(42, 100, 150)">&nbsp;[04′39″]</span></p>
<p style="text-align:justify">  那麼在此處,師父就提出了「<strong>詳細地討論這件事情</strong>」。這件事情是什麼事情呢?就是我們究竟地離苦得樂這件偉大的事情、微妙的事情、神奇的事情;又是常常被我們忽略的事情,沒有時間討論的事情。<span style="color:rgb(42, 100, 150)">&nbsp;[05′04″]</span></p>
<p style="text-align:justify">  所以師父說:「<strong>從這個題目上面,我們可以知道說,我們現在學這個東西</strong>」,我們現在學!想一想,很多年前師父講到「我們現在學」!學什麼呢?「<strong>就是怎麼樣從我們凡夫下腳第一步開始,一直走上去,走到圓滿成佛的這條路。</strong>」注意哦!師父殷殷渴盼的內心,在這一句話已經說得非常非常明顯了。說:「我們現在開始學這個!」學什麼呀?凡夫從哪裡學呢?就是下腳的第一步,第一步!第一步是什麼呢?就是從什麼也不知道開始,說:「有無上菩提這回事嗎?有生死輪迴嗎?有解脫道嗎?」甚至說:「人在生死之間還需要一個善知識嗎?還需要對善知識修信嗎?」以前的你我什麼都不知道,但是師父並沒有嫌棄我們什麼都不知道,正因為我們什麼都不知道,所以師父說:「<strong>我們現在學。</strong>」就好像慈愛的爸爸、媽媽,拉著不會走路的小孩子的手在教他,反正連滾帶爬開始,然後站起來走,就是從下腳的第一步開始。<span style="color:rgb(42, 100, 150)">&nbsp;[06′37″]</span></p>
<p style="text-align:justify">  師父的期待非常地美,就是一直走上去,走到圓滿成佛的這條路。看看!第一盤還沒講完,師父就已經提出了「圓滿成佛的這條路」。當這幾個字落入你我的耳根,融進了我們的內心的時候,這幾個字在我們生命中所產生的作用,是非常非常震撼的!因為我們居然知道了有成佛這件事!居然知道了有一個善知識,將在《廣論》裡和我們詳細地討論關於「我」怎麼樣成佛的事情。這個「我」,是坐在你的錄音機邊啊,還是手機旁,坐在什麼旁邊跟我們一起學《廣論》的,就是很多個「我」。居然有一個善知識跟我們討論「我」怎麼樣成佛這件事情!所以不管我知道得多少、我習氣多重啊、我沒有時間啊、我笨啊,甚至我身體不好呀,我把其他的事情做完我就沒有體力學......這都沒關係!因為就這麼短的時間,師父還是來為我們講這件事了,我們遇到他了!<span style="color:rgb(42, 100, 150)">&nbsp;[07′53″]</span></p>
<p style="text-align:justify">  這條路的過程,注意!師父會非常非常在意它的「清淨」。舉個簡單例子,假如說瓷碗,你的傳承清不清淨?是不是最著名的那個瓷都製造出來的?他有講到一個傳承的清淨——內容一定要非常地正確,正確與否要討論。還有「數量」是怎麼樣的呢?所謂數量,如果說燒一個瓷器的話,就還是要講火候。像我們做餅也要講火候,火候一大就糊了、不能吃了;就算蒸馬鈴薯都要講火候,因為火候一過了之後可能就不好吃了,所以它的火候到什麼程度就應該轉換一下。還有走上去的「次第」,就是先幹什麼、再幹什麼、再幹什麼。有沒有發現是手把手地教啊?所以它都有一個「完整詳細的說明」。然後「詳細的說明」,師父又說了一遍:「<strong>詳細的說明。</strong>」<span style="color:rgb(42, 100, 150)">&nbsp;[08′52″]</span></p>
<p style="text-align:justify">  「<strong>我們從這上面,有了一個正確的認識</strong>」,注意!因為有詳細的說明、有善知識為我們講,然後我們從這上面就得到了一個正確的認識。我不知道對這句話大家懷不懷疑自己?有很多人會認為:「即使老師講,我也得不到正確的認識。」但是師父會認為,我們從這個上面是可以得到正確的認識的哦!如果你第一次得不到、第二次得不到,就重複幾次嘛!重複地學習是可以得到的。&nbsp;<span style="color:rgb(42, 100, 150)">[09′25″]</span></p>
<p style="text-align:justify">  我以前曾經問過仁波切說:「我覺得自己有點笨,怎麼樣能夠變得聰明一些呢?怎麼樣可以修成不忘陀羅尼,學什麼馬上都能記住?」後來仁波切就走到我旁邊,把經典在我頭上輕輕拍了三下,說:「給你不忘陀羅尼了!」然後說:「重複!重複!重複!」所以重複地學習,可能是我們領會一個我們並不熟悉的、很重要的智慧的辦法。所以不要小看我們的學習能力!我們的心一旦聽到了善知識的法音,內心裡生起了渴仰之心,然後將這樣的心慢慢去增廣的時候,誰知道你有一天會有一個怎樣的進步呢?<span style="color:rgb(42, 100, 150)">&nbsp;[10′15″]</span></p>
<p style="text-align:justify">  所以不要一開始就覺得自己不行哦!因為其實你不行,你也沒有什麼證據呀!有什麼證據說自己就不會得到正確的認識呢?師父都這樣信心滿滿的,師父說:「<strong>有了一個正確的認識,你照著一步一步實踐的話,就可以達到最高圓滿的境界,最高圓滿的境界,這就是本論要我們學的。</strong>」幾句話哦,幾句話,把《菩提道次第廣論》一開始到最後達到的高度標示出來了。高度是什麼呢?就是你我生命最高、最圓滿的境界。那就是完全沒有一絲絲痛苦、沒有一絲絲迷惘的一個境界,生命裡所有的苦澀都消失了、所有的不知道也都消失了。因為佛陀有一個名字叫正遍知——什麼都知道,只要是心所對境、只要是存在的、只要是有的,他全都可以了解,而且可以最正確、最徹底、最詳盡地了解。我們透過修鍊,也可以讓我們的心達到那樣一個境界。<span style="color:rgb(42, 100, 150)">&nbsp;[11′25″]</span></p>
<p style="text-align:justify">  注意哦!師父在此處指出了,我們是可以有那樣一條路的可能性的。他就是來到這個世界,告訴你我:我們雖是凡夫,但是有了正確的認識之後,我們是可以一步一步照著次第來,可以走上無上菩提之路。這是一個很大的喜訊吧!所以在我們給自己規定的這種進步空間和小小的視野裡邊,如果沒有善知識的指引,我們用怎樣的目力也無法看到無上菩提恢宏的方向。我們怎麼可能在心續裡有這樣一個志向,說我可以成就無上菩提呢?可是藉借著師父,注意哦!就在《菩提道次第廣論》的名字上,師父就在你我的心中放下了一個鴻鵠之志——我們要求取無上菩提!我們要有這樣的一個信心:凡夫從腳下的第一步下腳處開始,我們一步一步地走,是可以走上徹底地離苦得樂的那一天、那美好的高度。為什麼呢?因為師父牽著我們走,因為師父走在我們旁邊,因為他舉著燈陪著我們走,只要不放開手,就可以一直一直走,走到那個地方。<span style="color:rgb(42, 100, 150)">&nbsp;[12′59″]</span></p>
<p style="text-align:justify">  所以,雖然在討論《菩提道次第廣論》的「論」字,是不是在討論我們的生命明天會怎樣?你希望你的生命明天是什麼樣子?我希望我的生命明天是什麼樣子?師父希望我們大家的生命明天是什麼樣子?如果沒有善知識來開啟我們的慧力,怎麼敢去期望完全沒有痛苦的生存?生存怎麼可能離開痛苦?離開痛苦豈會有幸福的感覺呢?所以藉借著善知識的指引,我們可以遙望一下——也許有一天,你我因為跟隨善知識步步前進,不停地精進的原因,會走到完全沒有痛苦的、大徹大悟的那個境界。所以這是一個天大的好消息吧!好好地歡喜一下哦! [14′01″]</p>
<p style="text-align:justify"><a href="https://d3v2d3f6zmz0pr.cloudfront.net/images/13/130006/130006pc.jpg"><img alt="" src="https://d3v2d3f6zmz0pr.cloudfront.net/images/13/130006/130006pc.jpg" style="height:708px; width:500px" /></a> </p>
<p style="text-align:justify">又到了學習《廣論》的時間了!<span style="color:rgb(42, 100, 150)">&nbsp;[00′03″]</span></p>
<p style="text-align:justify">  我們的生命在一刻不停地向前,我們的心續也在剎那剎那的遷流之中,沒有停頓的時候。在這個遷流的、一直向前的續流之中,如果能夠達成越往前走越是快樂、離開的痛苦越多,那麼這個遷流無疑是值得我們欣喜的;但是如果越往前走越黑、苦澀越多,那麼就是令人滿懷憂慮的。所以,為了改變我們的現在、為了改變我們的明天,我們坐在這裡來觀察自己的心,來學習如何調整。用現在的努力,調整明天的生命狀況,其實就是我們要做的。所以,還是要有一個為利無窮無盡的有情,我們要希求佛果的發心。<span style="color:rgb(42, 100, 150)">&nbsp;[01′04″]</span></p>
<p style="text-align:justify">  常常會想:為什麼一定要一個大乘的發心?因為有一個大乘的發心之後,才能取得佛果,到最後其實得到最圓滿狀態的還是自己。當我們發心去照顧所有所有的有情,有一天所有的美好就都會落到自己的心上,成熟在自己的身心上,這就是因果奇妙的道理。&nbsp;<span style="color:rgb(42, 100, 150)">[01′30″]</span></p>
<p style="text-align:justify">  所以一會兒在聽師父的帶子的時候,大家要專注。不知道你是不是現在還是很忙,在很忙的時候,「啊!研討時間到了,趕快打開!」你的心是不是還馬不停蹄地緣在你剛才忙的那件事情上?注意哦!注意哦!現在上課了,上課了!要注意,上課了!要開始聽師父的帶子了,要把自己的心專注在聽聞上。因為每天只有這麼少的時間,所以一定要惜時如金——不是「時」,是惜「分鐘」如金、惜「秒」如金!所以在聽的時候,儘量不要走神!&nbsp;<span style="color:rgb(42, 100, 150)">[02′10″]</span></p>
<p style="text-align:justify">  好!現在開始聽。&nbsp;<span style="color:rgb(42, 100, 150)">[02′13″]</span></p>
<blockquote>
<h4>  那麼這個作者是宗喀巴大師,作者是宗喀巴大師。這個地方,請翻開書本前面有一個彩色的照片,彩色的照片,這張照片非常莊嚴、非常莊嚴。那麼我簡單地把宗喀巴大師的他的歷史啊,介紹一下:他是青海人,青海西寧附近的人,西寧就是青海省的省會。他生在元朝——元順帝,順帝就是元朝最末一代皇帝,相當於西曆的一千三百五十七年,一千三百五十七年。他從小就是一個絕頂聰明的人,很小就出家,然後到十六歲,就進西藏。因為這個青海一帶,在我們中國靠那個角,包括青海啊,然後西康啊,然後四川的一部分哪,西藏啊,那個都是藏族的區域,藏族的區域。他們信的都是佛教,而是屬於佛教當中的密教一支,密教一支。那麼,在這一個藏語的佛法系統當中,他的教育的中心是在拉薩,在拉薩。所以宗喀巴大師在十六歲的時候,也受了他師長的影響,進拉薩去求學,以後呢一生就在西藏,而且把西藏的佛法整個復興,整個復興。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[04′26″]</span></h4></blockquote>
<p style="text-align:justify">  好!剛才聽的時候有沒有專注啊?師父最先講的是什麼呀?一張照片是不是?我們這裡邊可能有學了《廣論》好多年的同學,回想起一開始聽到這句話的時候,其實很多居士的反應是趕快翻、翻、翻,翻到《廣論》上的那張照片開始看,然後一邊看那張照片,會一邊聽師父為我們介紹宗喀巴大師。<span style="color:rgb(42, 100, 150)">&nbsp;[05′00″]</span></p>
<p style="text-align:justify">  那尊宗大師的像就是在塔爾寺。我和鳳山寺的法師也去朝禮過,我們想去拍照,結果那邊佛殿裡是不許打閃光燈的。那個佛殿不是很大,其實裡邊不打閃光燈是拍不清楚的,那天還有點陰天。當時我們就在宗大師殿外面一直繞啊,然後在祈求。要是不打閃光燈,陽光也出不來,實際上我們拍不到宗大師的照片的,因為我們想拍正面,還想拍側面的。然後突然間我就發現,佛殿裡宗大師的臉突然全部都亮起來,整個佛像都亮起來了。我就很驚訝說:「哎!到底是怎麼回事?」一看,哇!一道陽光,就從那個寺門——那個是很小的佛殿的門,直接全部滿滿地照耀在宗大師的這尊像上。好像宗大師就是張開手在那兒等我們說:「快拍照吧!快拍吧!趁著現在陽光很好。」那時候我們都特別高興,然後馬上就拍下來了,就是跟封面那張一樣的。&nbsp;<span style="color:rgb(42, 100, 150)">[06′08″]</span></p>
<p style="text-align:justify">  「宗喀巴」其實不是宗大師的名字,是「宗喀」那個地方的大師,所以後來就都稱為宗喀巴大師。這裡邊,注意哦!師父介紹了宗大師是什麼朝代的人呀?你們自己回答哦!小的時候聰不聰明呢?幾歲的時候,由於聽他師父的話就進西藏了對吧?去拉薩求學。注意!有一句最重要的話就是——宗喀巴大師「把西藏的佛法整個地復興」。注意哦,整個地復興哦!就是佛教的綿延、佛教的繁榮,他一肩挑,整個地把佛教振興起來了。&nbsp;<span style="color:rgb(42, 100, 150)">[06′59″]</span></p>
<p style="text-align:justify">  因為近幾年也會碰到比如說尼泊爾的佛教徒、美國的佛教徒、加拿大的佛教徒,還有緬甸的佛教徒。其實只要是佛教徒,大家在一個陌生地方相遇了,都會非常非常開心的。大家都關心著佛教的現狀,也關心著佛教的未來。其實我們知道佛陀的教育非常非常地珍貴,對於全人類來說,這是非常難能可貴的一筆智慧、慈悲的財富。如果佛教能夠長久地振興下去、繁榮下去,那麼對每一個有情來說,真的是有著無限的利益。那麼宗喀巴大師,就是把西藏的佛教整個地振興起來,可以說如日中天。師父就要把聚光燈照在宗大師的身上,讓我們這些人穿越了時光,好像坐在宗大師的對面,去凝視著他——這位把整個西藏佛教振興起來的偉大高僧。<span style="color:rgb(42, 100, 150)">&nbsp;[08′07″]</span></p>
<p style="text-align:justify">  其實在拉薩還有他的塑像,有一尊塑像非常非常像他本人,面容非常地親切和藹,有一種很溫和的氣質,很慈悲。可以說,凝視著這張照片的時候,我們也只能從宗大師的廣傳或者略傳之中,去體會宗大師是聰明到何種程度、勤奮到何種程度,對佛教又振興到何種程度。他的講說、辯論,還有著述,都達到了登峰造極的一個不可思議的成就。<span style="color:rgb(42, 100, 150)">&nbsp;[08′48″]</span></p>
<p style="text-align:justify">  我很多次看到師父捧著《菩提道次第廣論》。師父走到哪裡都帶著《廣論》,師父每一次來給我上課的時候,也都帶著《廣論》。他從房間裡出來的時候總是捧著兩本書,一本是《菩提道次第廣論》,一本是《南山律》。注意!他是雙手捧著,捧在心口。一看到師父那樣莊嚴地走出來,就會覺得他捧著好像比他自己的生命更加珍貴的一個寶物,他要把這個寶物送給我們。我也曾經看過很多次,師父在祈求宗喀巴大師的時候痛哭流涕,一直說:「不要將經典當容易看啊!」還有一次,我看見師父在讀經典的時候,讀著、讀著就趴在桌上開始哭了!這本《菩提道次第廣論》,師父為了求到它的傳承,為了給我們講,可能流了好多好多的眼淚吧!翻譯它的法尊法師,不知道流了多少眼淚!還有將佛法傳承到今天的祖師、佛菩薩們,為了保留這個清淨的傳承,又流了多少眼淚!&nbsp;<span style="color:rgb(42, 100, 150)">[10′05″]</span></p>
<p style="text-align:justify">  我也曾經去過宗大師在拉薩閉過關的那座山。他不是坐在一個大石頭上說法嗎?我有去看他坐的大石頭,其實是一個非常樸素的石頭。那座山幾乎沒有什麼樹,樹很少的,所以一看可以看到很遠很遠的地方,都是那種圓圓的石頭,摸起來很光滑。當時是跟仁波切爬到那座山上,當時我非常懷疑我能不能爬上去,因為從小沒爬過山。但是上師在前面,我在後面,結果好像很輕鬆就爬上去了。我們爬到一半的時候,從後面來了三個出家人。哇!他們身上背的東西,看起來像一輛小車,都是用行李背在上面的,人壓得快成九十度了。然後我就問仁波切說:「他們拿的是什麼?」仁波切說:「他們要去山上閉關,拿的應該是吃的一些東西。」然後我說:「背這麼重的東西能爬山嗎?」仁波切說:「那你看看吧,一會兒我們誰走得快?」&nbsp;<span style="color:rgb(42, 100, 150)">[11′08″]</span></p>
<p style="text-align:justify">  結果過了一會兒之後,那三個出家人已經遠遠地走在前面。然後再一會兒看,他們就剩個影子。過一會兒看,他們已經在另一道山崗!看起來是滿神奇的,好像在飛一樣,很快就到另一座山了!就在另一條遠方的山脈,看到有三個小身影,就是那出家人。&nbsp;<span style="color:rgb(42, 100, 150)">[11′27″]</span></p>
<p style="text-align:justify">  然後到了宗大師閉關的那個關房,那個關房是很小的,據說是後人把它建起來的,很小、很小!那附近還有克主傑、賈曹傑尊者打坐的地方。據說宗大師剛去那座山上的時候還沒有泉水,後來是吉祥天母的坐騎用腳踏出來的。這是一個傳說,但是真的是那個地方出現泉水,然後我還去了那個泉!去到那個泉的時候,非常奇怪,前面的山上都沒有什麼樹、沒有什麼草,到了那個地方之後,突然發現:哇,草好綠啊!綠到什麼程度?好像玉一樣,軟軟的,好漂亮的草。到這一區為什麼草這麼多呢?當時那個關房也有一個出家人,他就帶著我們走啊、走啊,就走到一個地方,他在上面搭了一個小屋子。然後他就把那個鐵蓋子打開,是側面的,它上面是封著的,就像一個門一樣。他把那扇門打開,哇!哪得清如許的那個泉啊,太清澈了!然後他就拿著一個水瓢,盛滿了送給我說:「哎呀!這是加持啊,你快喝了吧!」那山裡的泉水是很冷很冷的,我平常是不能喝冷水的,因為害怕胃疼。那天就不管了,這是加持,就開始拿那一瓢水先喝了,然後又擦頭上祈求加持!聽說很多人喝了那個泉水胃病就好了,很神奇的!而且我留心了一下,那個泉水裡還有長出幾朵小花,是黃色的,非常地美!&nbsp;<span style="color:rgb(42, 100, 150)">[13′01″]</span></p>
<p style="text-align:justify">  離開那個泉,在宗大師的關房旁徘徊了許久,捨不得離開。後來找一塊草地靜靜地坐下來的時候,其實那個地方還是有很高的大樹,然後你看一看遠山、看一看天上的流雲,那些煩煩惱惱的事都飄走了,心裡有一種恭敬和虔誠地想念宗大師的感覺。想著他把這麼美的《菩提道次第》留給了我們,想著他為了無窮無盡的有情,在那一生的示現中,振興了佛教,給六百年後的我們帶來了這麼多的欣喜、這麼多的感動,所以是很難忘、很難忘的人!&nbsp;<span style="color:rgb(42, 100, 150)">[13′50″]</span></p>
<p style="text-align:justify">  如果不是師父拉著我們,讓我們凝視到宗喀巴大師,實際上你我又怎麼會知道世上曾經有一位這麼偉大的高僧?又怎麼會成年累月地學他親筆寫的著作,教我們如何去成佛的?這些事情真的都是非常新奇的,居然就成熟在你我的生命中了。所以還是好好地隨喜、好好地開心吧!不管你有多少不開心的事情,有多少求不得的那些心事,但是我們值遇了師父、值遇了這麼好的教法,這應該是生命中最值得慶祝、最燦爛的事情,所以還是請你微笑吧! [14′38″]</p>
<p style="text-align:justify">前一節課師父就幫我們介紹宗喀巴大師。那麼接下來,師父會簡略地介紹一下藏傳一系的佛法。所以在上課的時候,請大家把心慢慢地靜下來,讓那些喧雜的思路,還有那些忙亂的節奏感慢慢地平靜下來,讓我們專注地聽師父的帶子。在下面的帶子中,師父會給我們介紹幾位偉大的人物,他們為佛教的發展做出了豐功偉績,非常非常值得我們感恩和銘記。那麼下面我們就開始聽第一小段。<span style="color:rgb(42, 100, 150)">&nbsp;[01′02″]</span></p>
<blockquote>
<h4>  那麼在這裡,我也不妨把這個藏傳一系的佛法,簡單地介紹一下。因為這個在我們國內平常是少傳聞,所以我簡單地說明一下。那個西藏的佛法開始的時候,是松贊岡布王,那個人,相當於我們唐朝初年,唐朝初年。唐以前是南北朝,南北朝下面是隋、唐,這樣。那麼那個松贊岡布王就是隋、唐那個時候的人,他也是西藏人當中一個雄才大略的君主。那麼,那個時候我們中國也碰見我們所謂唐初,那是中國最盛的時候,唐太宗。所以中國歷史上,不管西藏,有這麼一段佳話:唐太宗的公主文成公主,就嫁給那個松贊岡布王,那個時候進去的時候,帶了很多佛經進去。那個松贊岡布王不但娶了唐朝的公主,另外他也娶了一個尼泊爾的夫人。那麼同樣地,那時候尼泊爾也是佛教的國家,所以從這兩個地方傳進去了大量的佛法。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[02′42″]</span></h4></blockquote>
<p style="text-align:justify">  好,大家有仔細地聽吧?這個段落我把它分得很短,有點擔心長了之後大家走神。師父說:「<strong>簡單地介紹一下,因為這個在我們國內平常很少傳聞。</strong>」就是藏傳一系的佛法,我們是很少知道的。我們可以想一想,在很多年前,師父開始不管走到哪裡都帶著《菩提道次第廣論》,他自己學習,然後又開始給大家講《廣論》,開始講了很多次,講到後來都剩下師父一個人。所以到底如何把《菩提道次第廣論》這樣一本精彩的佛教論著介紹給我們這些漢人,實際上是很有難度的。雖然很多年前尊法師就已經把它翻譯過來了,所以我們是用漢語學的,但是剛開始看到《菩提道次第廣論》的時候,大家可能覺得這是一部深奧的佛教撰著,要花下血本的時間才能夠學懂,通常都怖畏它的深度和學習時間的長度,所以大家都學著學著就沒有心力了。<span style="color:rgb(42, 100, 150)">&nbsp;[04′01″]</span></p>
<p style="text-align:justify">  可以想一想,師父在那樣的一種狀態下——大家都不知道宗大師的名字,也不了解《菩提道次第廣論》,在這種狀態下他一個人,一次又一次地講、一次又一次地講,經歷了多少失敗。在面對我們無知的曠野,他沒有任何的怖畏心,一直這樣單槍匹馬地穿越我們這片無知的黑暗。所以看到這「很少傳聞」的時候,我心裡還是有一點酸楚,又非常地感恩、又非常地酸楚,覺得師父真的是很不容易,才把《菩提道次第廣論》送到你我的面前,送到我們的心中。<span style="color:rgb(42, 100, 150)">&nbsp;[04′51″]</span></p>
<p style="text-align:justify">  那麼現在師父要介紹的,實際上是一幅恢宏的歷史畫卷。這幅歷史畫卷可能是沉重的,但這裡邊也有非常非常絢麗的色彩。這裡邊就提到了唐朝的松贊岡布王,然後提到了我們都非常非常熟悉的文成公主。我去拉薩大昭寺禮拜的時候,有看到文成公主帶到西藏的釋迦牟尼佛十二歲的等身像,現在是在大昭寺,原來聽說是在小昭寺,又更早聽說好像是供奉在「烏仗那」這麼一個地方。<span style="color:rgb(42, 100, 150)">&nbsp;[05′33″]</span></p>
<p style="text-align:justify">  文成公主帶到西藏的釋迦佛十二歲的等身像,大家都知道,宗大師對他獻過五佛冠,把他變成了報身佛的裝飾。據說往昔他也是帶著佛冠的,是遵循往昔的傳統而做的。那供上佛冠的主要目的是什麼呢?符合報身的裝飾這樣的一個緣起,是希望直至輪迴的盡頭之間,眾生的福田能夠永遠堅固地存在,宗大師是為了這樣一個緣起而供的。&nbsp;<span style="color:rgb(42, 100, 150)">[06′14″]</span></p>
<p style="text-align:justify">  那尊佛像,人們每天大排長龍,都去貼金、去禮拜,然後去供養、去祈求。那次我們去禮拜的時候,有幸跟隨著仁波切,排在朝聖隊伍的最前面,因為仁波切,所以大昭寺的法師特別把佛龕的門打開。那一刻,彷彿時光靜止,平常非常地威嚴,也非常慈愛的仁波切,那一刻,居然如赤子般捧著哈達走到釋迦佛像前,他輕輕地把頭俯在釋迦佛的膝前,深深祈禱的身影,今天想來,歷歷在目,讓我的心靈震顫!當時我也學著仁波切,把頭靠在釋迦佛的膝上祈求。那一刻彷彿萬籟俱寂,好像一個流浪的孩兒,靠在慈父的膝上。只有佛陀萬古的慈悲,充滿我的心,充滿著宇宙。雖然時間不長,但卻在記憶中永恆!<span style="color:rgb(42, 100, 150)">&nbsp;[07′35″]</span></p>
<p style="text-align:justify">  現在想起來,還是非常感動的。</p>
<p style="text-align:justify">  另外在拉薩也有看過松贊岡布王,還有文成公主的塑像。可能去朝禮的人都會想要看一看文成公主的塑像,塑得像度母一樣,非常非常地莊嚴!在很多很多西藏人的心中,文成公主像佛菩薩一樣,因為她把大量的佛法帶給了西藏。所以漢傳佛教,由我們美麗慈悲的唐朝公主帶到了藏地,有沒有覺得這是非常美好的佛教史上的佳話!&nbsp;<span style="color:rgb(42, 100, 150)">[08′15″]</span></p>
<p style="text-align:justify">  佛教的傳承淵遠流長,它能夠綿延到我們現在這個時代,還能聽到從那麼古老傳到現代的這個佛法傳承,很珍貴、也很稀有吧!所以你我共聚此時,聆聽這珍奇的時光,真的是非常地難能可貴!</p>
<p style="text-align:justify">  請大家繼續聽。<span style="color:rgb(42, 100, 150)">&nbsp;[08′41″]</span></p>
<blockquote>
<h4>  那麼,這個松贊岡布王不但振興了佛法,這個西藏的文字也是那個松贊岡布王時候建立起來的,他特別派一個大臣,到別的地方去,然後學好了帶回來。最後呢,學的是印度,把印度那個母語,經過了他自己的認識以後,適應西藏,造了那個藏文。所以這個藏文雖然跟梵文是不一樣,但是脫胎於梵文,脫胎於梵文。因為這樣的關係,所以它翻譯過去,它有種種的方便。譬如說,拿我們現在的語言來說,你這英文翻成功中文,跟英文翻成德文、法文不太一樣,他們西方語言轉變一下容易,因為他們語言相似,語言相似,就是這個道理,這個我們順便一提。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[09′44″]</span></h4></blockquote>
<p style="text-align:justify">  在這一小段裡,我再提一個問題:松贊岡布王不但振興了佛法,而且西藏的文字是什麼時候建立的?也是那時候建立。那時候有一個大臣叫吞彌桑布札,對吧?非常有名的大臣,他創立了西藏的文字。現在《菩提道次第廣論》被翻譯成很多國的文字,我在很多年前就看過英文的、蒙文的、韓文的、日文的......很多國的文字都有《菩提道次第廣論》,所以它傳播得是滿廣泛的。<span style="color:rgb(42, 100, 150)">&nbsp;[10′25″]</span></p>
<p style="text-align:justify">  在提到文字的部分,師父都很珍惜字紙,字紙是不亂丟的。為什麼呢?出於對文字的敬重。因為文字的來源也是非常地淵遠流長,也是很不容易的傳承。所以對於字紙,不是隨便寫完了就把它放在那兒,尤其是佛法字紙,都要非常非常恭敬地、好好地放在盒子裡,供在什麼地方。那麼對經典,就要更加好好地恭敬受持!<span style="color:rgb(42, 100, 150)">&nbsp;[10′54″]</span></p>
<p style="text-align:justify">  這裡邊談到藏文,大家都知道鳳山寺很多法師在學習藏文。很多年前,應該是二十多年前了吧!師父就請鳳山寺的法師們開始學習藏文。經過了二十多年的基礎,才有今天的譯經事業,才能翻譯《四家合註》。但是師父在讓我們學習藏文的時候,對於漢語的古文也非常非常地重視。師父認為用漢語來傳播佛法是非常非常重要的,我們寺院的僧人也一定要把漢語學好,而且這是母語,要非常非常地熟練。所以這麼多年過去了,很感恩師父對於建立教法這樣的一個遠見。二十年前學了藏文到現在,我們寺院的很多法師啊,比如說他們可以看藏文的《金鬘論》、看藏文的原典......很多註釋都可以看藏文的原典。這個在二十年前,到鳳山寺出家的法師是不能想像的;但是二十年之後的鳳山寺,走進一班你就看到大家都捧著藏文書看,幾乎是很普遍的一件事情。&nbsp;<span style="color:rgb(42, 100, 150)">[12′03″]</span></p>
<p style="text-align:justify">  所以,熟悉一個語言、沿著這個語言理解佛法,這樣的深度和精確度,實際上是一件非常非常不容易的事情。我們寺院的很多法師也都非常非常地努力,希望藉借著自己的努力,能把宗大師的教法更廣泛、更深刻地用漢文自利利他吧,傳遞給很多很多對宗大師教法很有信心的,乃至世界各地各種語系的人們。因為現在僧團裡有法師用英文講法,然後現在應該也有法文、有韓文,可能以後還有很多的不同的語言。所以說很高興有這麼多的語言形式,讓擁有各種語言的人們都能夠接觸到佛法,都能夠去學習如何離苦、如何得樂。所以也感謝佛陀的恩德,感謝先輩祖師他們深深的恩德! [13′06″]</p>
<p style="text-align:justify">好,那我們再聽下一段。</p>
<blockquote>
<h4>  那麼除了文字以外,制定法律,最主要地佛法那個時候奠了基。之後有一個皇帝叫持松德貞,或叫赤松德貞,這個也是一個非常了不起的皇帝、藏王。那麼他又大大地振興佛法,從印度請了一位大成就者,大成就者所謂靜命大論師,到西藏去弘法。所以西藏的正式有三寶,所謂僧伽等等,從那位大師開始的。不過當時西藏的地方上有一種土著的教,叫作苯教,我們有時候稱它為黑苯教,那個勢力很強,那是民間的鬼神哪這些。所以不但民間反對勢力很強,而且黑苯教的那個鬼神,那個東西還是很有力量的。其實我們現在世間也是一樣,你看什麼十八王公啊,或者什麼,那種鬼神是有他的力量。那黑苯教裡邊,他們還有他們的什麼咒術啊,各式各樣的這種怪招,所以這個佛法剛進去的時候遭到了種種魔難。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[01′39″]</span></h4>
<h4>  那麼這個靜命大師,這是一位了不起的成就者,就說:「像這種魔難,我沒有力量克服它,現在印度有一位佛教的大成就者——蓮花生大士,如果請到他的話,那一定沒有問題。」那麼,這個藏王就努力就去請。這也是因緣成熟,那個時候那位大師也正好從印度向東方走,那麼正好到尼泊爾,於是藏王派去的使者遇上,就把他請進去。請進去了以後,這個蓮花生大士是顯密圓融的成就者,他有種種的殊勝的方法,所以把那些各式各樣作祟的妖魔鬼怪一一降服,大弘教法,這樣,大弘教法!<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[02′39″]</span></h4></blockquote>
<p style="text-align:justify">  在這裡邊提到了兩位偉大的高僧,一位就是赤松德贊那個時候迎請的靜命大論師——也是從那個時候開始有三寶、開始有僧伽;後來,靜命論師說還是要請蓮花生大士——蓮花生大士現在我們知道的人就多了,可能二十多年前知道的人也不多。所以這兩位大師都被迎請到了西藏。&nbsp;<span style="color:rgb(42, 100, 150)">[03′17″]</span></p>
<p style="text-align:justify">  在這裡邊,師父還順便介紹了一下苯教。像以前我也跟師父說我要去哪兒學習呀、去藏地學習呀、學經典啊,那時候師父就非常非常殷重地叮嚀說:「去那麼遠的地方學習的話,一定要跟隨一個善知識!如果不跟隨善知識、自己亂闖的話,實際上到了那裡之後,可能都分不清楚佛教和苯教的出家人,就外表的僧服都看不出來,可能都學了苯教還不知道。」所以師父那個時候就特別特別強烈地建議說,去求法一定要依止善知識,跟隨善知識的指導,不要自己亂闖,因為我們並沒有擇法眼,也不知道當地的狀況是什麼,語言也有隔閡,什麼都是不熟的。所以當時師父還特別特別囑咐說:「一定要跟隨善知識,這樣的話我們才能夠參訪到真正的善知識,才能夠從善知識那裡得到擇法慧,然後去選擇一條真正的求法的路,真正地能夠聽聞到清淨正法的路,而不辜負了大好的光陰。」&nbsp;<span style="color:rgb(42, 100, 150)">[04′38″]</span></p>
<p style="text-align:justify">  所以在這裡邊提到了這兩位大師,首先把三寶帶到了藏地,接著降魔呀、做了各種降伏的事業,那就是蓮花生大士。大家再接著聽:&nbsp;<span style="color:rgb(42, 100, 150)">[04′51″]</span></p>
<blockquote>
<h4>  不過因為剛開始,初初建立,雖然剛開始建立了,等到蓮花生大士走了不久,它那個基礎沒有穩固,所以很快地又衰下來了,衰下來了。再加上過了一百多年以後,就發生了一個很不幸的事情。就是那個赤松德貞又傳了幾代以後,我一下子記不住幾代,它那個有一個皇帝叫朗達瑪,他反對佛法,反對佛法,所以皇家聽了那個黑苯教的影響,整個把佛法摧毀,整個摧毀。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[05′37″]</span></h4>
<h4>  那個時候相當於我們的唐朝唐武宗,我們中國歷史上面也曾經說「三武一宗之難」,那幾個皇帝都是反對佛法的,以皇家的命令,把廟拆掉,叫和尚還俗。那個時候朗達瑪也是這個樣,所以把它徹底地摧毀掉。摧毀掉了以後,後來那簡直是一蹶不振。在我們中國來說的話,因為已經很普遍了,所以這個三武雖然摧了以後,還可以恢復一點,西藏簡直是恢復以後就不成樣子。那麼就這樣,經過了一百多年的時候,那個教法是非常地亂、非常地亂。平常的時候,大家都是憑個人的想像,憑個人的想像,所以這個凌亂的情況我們可以想見。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[06′35″]</span></h4></blockquote>
<p style="text-align:justify">  不知道剛才大家有沒有認真聽哦?在靜命大師和蓮花生大士之後,發生了非常不幸的事情,就是朗達瑪破壞佛法,他破壞佛法的深度是很深的,狀況是很慘的。當時藏區只剩下三位比丘,有出家人想要求受比丘戒,但是因為至少必須有五位比丘才能傳比丘戒,所以就從漢地請來兩位比丘,再加上原本的三位比丘,一起為藏區的出家人傳授了比丘戒。所以到現在,藏系出家人的僧服上有一塊藍布,那塊藍布就是為了紀念和感恩漢族的出家人把比丘戒傳給了他們。不知道你們有沒有留心,他們的袈裟上有一塊藍布?可見佛法的弘傳是非常非常不容易的! [07′36″]</p>
<blockquote>
<h4>  那時候到朗達瑪再傳的下面,另外有一個藏王,朗達瑪下面那個西藏的政治,這個政治方面發生過一個政變,那我們不去談它。所以那個皇室也就分了幾支,其中有一支靠西邊的,一個國王信佛,那麼一方面是信佛,一方面想到他祖先在佛法上的這種擁護、輝煌,所以他心裡面非常痛心,他就發心到西藏去再去求法。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[00′34″]</span></h4>
<h4>  結果他們祖孫兩代聚全國的精華,花了很長的一段時候,到印度去請了印度的大成就者——阿底峽尊者。阿底峽尊者是印度當年的一個最高成就者,關於阿底峽尊者的內容,我們講到本論的傳承、師承的時候,它有一個說明,所以我這裡不詳細講。阿底峽尊者到了西藏以後,把佛法振興起來,從阿底峽尊者振興以後的西藏的佛法,叫作新教,在這個之前叫作舊教。譬如我們現在聽見我們這裡國內也有,藏密,所謂寧瑪,就叫舊教,其他的就是白教啊,然後花教、黃教這是新教。新教就是阿底峽尊者以後,經過革新以後的新興的這種,當然佛法的中心沒變,不過它的作法是比較改善了。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[01′43″]</span></h4>
<h4>  經過了阿底峽尊者這樣一個努力以後,它就復興。復興了以後,但是畢竟前面那個基礎並不穩固,所以阿底峽尊者復興了以後,慢慢、慢慢、慢慢地,又慢慢、慢慢地過了一些時候,又開始有一點衰頹現象,有一點衰頹現象。後來呢又經過宗喀巴大師又起來,宗喀巴大師距離阿底峽尊者是三百多年,不到四百年,阿底峽尊者相當於我們宋朝初年,宋初,那麼這個宗喀巴大師是元朝末年。經過了宗喀巴大師這樣地一次徹底地改革以後,所以西藏的佛教如日中天,到今天已經有六百多年了,已經有六百多年了。宗喀巴大師改革以前,已經是很衰;一下達到那個頂峰,而且能夠維持這個局面,經過很長一段時候,現在也慢慢地、慢慢地向下。雖然向下,但是它還保持著非常完整的內容在,非常完整的內容在。這一點是我們以前都不知道的。<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">&nbsp;[03′07″]</span></h4></blockquote>
<p style="text-align:justify">  接著就講到了阿底峽尊者。如果有看《阿底峽尊者傳》的話,就知道有這樣一位非常了不起的智光王,他因為要去請阿底峽尊者,被鄰國的國王關起來了。因為他準備了很多金子想要去請阿底峽尊者,那個關他的王就說:「你們要拿出跟這個王身高等量的黃金,我才能把你們這個王放回去!」所以他的侄子菩提光王,就去籌黃金,結果籌到了只差一個頭這樣多的黃金。當時智光王、菩提光王他們見面之後,智光王就跟他說:「你還是把這些黃金拿去印度請阿底峽尊者,請大善知識來振興佛法吧!我這樣一條命,你把我從監獄裡帶回去,又對佛法能有多大的幫忙呢?」他是捨命請求善知識來西藏弘揚佛法,所以他的恩德對我們是非常非常深的!<span style="color:rgb(42, 100, 150)">&nbsp;[04′16″]</span></p>
<p style="text-align:justify">  在《阿底峽尊者傳》中說,也是經歷了很多挫折,阿底峽尊者最後是捨壽二十年來到了西藏。阿底峽尊者來到了西藏之後,就遇到了他的心子——種敦巴尊者,這又是一段師生的千古佳話。阿底峽尊者來到西藏之後,聽說聶塘有很多花,尊者很喜歡聶塘草原上的野花;還有印度有很多很多大象,西藏卻一隻大象也沒有,所以阿底峽尊者應該是思念故鄉吧!非常想念大象的叫聲,於是弟子們發明了一種長號的吹法,聽起來非常像大象的叫聲,來供養尊者。據說阿底峽尊者每次聽了都很歡喜。<span style="color:rgb(42, 100, 150)">&nbsp;[05′08″]</span></p>
<p style="text-align:justify">  他住在聶塘寺,為了把佛法傳到這樣的地方,捨壽了二十載。他在印度的時候,身上掛了一百零八座寺院的鑰匙,所以真的是印度佛教的頂嚴,這樣的一位頂嚴要請到西藏,大家可以想像是多麼困難的事情!當初我們玄奘大師去印度,後來回來的時候,不是也有國王因為搶玄奘大師差點刀兵相見嗎?搶高僧!所以迎請高僧是非常非常困難的一件事情,但是他們居然完成了這樣一個偉大的壯舉。<span style="color:rgb(42, 100, 150)">&nbsp;[05′47″]</span></p>
<p style="text-align:justify">  以前去朝禮聶塘寺——阿底峽尊者曾經駐錫過的寺院,因為那天去得早了,寺院還沒開門,天還有點黑黑的。當時有一些人在寺院門口,好像在烤馬鈴薯,我們一行人就在外面等著,在想什麼時候能開大門,因為我們接下來還要坐飛機。後來想一想,看來等不到開門了,我就把一串水晶念珠從大門上扔進去了,想說:「啊!供養阿底峽尊者曾經駐錫過的寺院,供養阿底峽尊者。」<span style="color:rgb(42, 100, 150)">&nbsp;[06′23″]</span></p>
<p style="text-align:justify">  聽說阿底峽尊者不是有一尊度母嗎?有什麼事情,阿底峽尊者都趕快去祈求那尊度母。我把念珠從那個大門上扔進去,然後在門口祈求,因為那個寺院應該是出家人都沒有起來,太早了。然後我就在門口想著要不要走,結果旁邊烤馬鈴薯、烤土豆的那一群人,覺得可能我是從很遠的地方來的,沒有見到可能有點傷感。然後他們就起來一起去敲那個寺院的大門,大概四、五個人一起去敲,說藏文,說:「開門啊!師父!」我想應該是:「開門啊!師父!」大家就一起喊。<span style="color:rgb(42, 100, 150)">&nbsp;[07′00″]</span></p>
<p style="text-align:justify">  結果喊了一會兒,把裡面的出家人喊出來了,他說:「什麼事情?」我說:「我想拜見那尊度母。」然後那個出家人說:「好吧!那你就跟我來吧!」其實都沒有燈,他當時是拿了一盞很小的油燈在前面引領著我們,進入那殿堂也全都是黑的。他說:「你是不是就想要看阿底峽尊者帶到西藏的那尊度母像?」然後帶著我。因為周圍都黑的,什麼也看不到,走、走、走,知道是走進殿堂了。然後拿那個小油燈一照,哇!就是那尊度母!它是一尊很小尊的度母像,可能是很多年、很多年了,但是那個寺院還是把它珍藏得非常非常好的。<span style="color:rgb(42, 100, 150)">&nbsp;[07′45″]</span></p>
<p style="text-align:justify">  然後我就在那尊度母像面前跪下來祈求,他就拿著一盞小燈讓我看那尊度母像,很小尊的!那是阿底峽尊者從印度帶到西藏的,所以看了還是非常非常感動!那個出家人也沒講話,就拿著那盞燈在旁邊照著,等著我們禮拜、祈求。然後等著這所有的祈求完成之後,他又把我們送回去。那個出家人,其實都沒有看清楚他長什麼樣,然後我們就離開了聶塘寺。在離開的時候天還沒有亮,我回頭想看清他的模樣,但是還是沒有看清,後來就趕飛機了。<span style="color:rgb(42, 100, 150)">&nbsp;[08′20″]</span></p>
<p style="text-align:justify">  可能現在我們聽起來,啊!印度的大成就者來到了西藏這件事,好像像傳說那樣、像一個故事那樣。但是你去過他駐錫過的寺院,你就知道他真的來過!那裡邊還有他隨身帶的佛像,他每天祈求的度母像還留在那裡。所以那個時候就會覺得:啊!滿天滿地都洋溢著阿底峽尊者對我們的慈悲,把這個傳承從那個時候傳到現在、到你我面前,這個《菩提道次第廣論》,都有阿底峽尊者的傳承。他為了傳這個傳承,捨壽二十載,我覺得我們所有的人都不應該忘記這樣一位大善知識。注意哦!他離開他的家鄉,語言不通、飲食不適應,又想看花,又想念大象的叫聲——在西藏是完全聽不到喲!氣候可能也是非常不適應吧!所以他是在怎樣艱難的狀態下把佛法傳承下來,用怎樣的勇氣和毅力、用自己的生命把這個傳承傳下來!<span style="color:rgb(42, 100, 150)">&nbsp;[09′33″]</span></p>
<p style="text-align:justify">  所以祈願所有的大善知識能夠長久住世!也祈願我們所有這些能夠聽到傳承教法的人,能把這樣珍貴的傳承好好地珍惜在自己的心上,好好地受持!因為這就是對前輩祖師們的一種報答、一種感恩。你們覺得呢? [09′58″]</p>
<p style="text-align:justify">大家好!很高興又到了我們一起研討《廣論》的時候!</p>
<p style="text-align:justify">  其實每次在上課之前,最好提前有幾分鐘時間讓自己的心寧靜一下,或者認真地策發一下自己的大乘意樂。因為我們平常可能忙的事情比較多,突然開始聽講的話,不知道注意力一下子能不能全部專注上來?如果只要師父的聲音一出現,我們的注意力全部都能夠集中上來,這還可以;但是如果無法集中的話,那麼就要提前準備。這個準備的事情是非常非常重要的!因為一旦準備好自己的恭敬心、虔誠的信心,對法現起了種種勝解作意,那麼我們這簡單的十多分鐘的課,或者一小時的課,它可能會影響我們,成為我無限生命的一個力量。&nbsp;<span style="color:rgb(42, 100, 150)">[01′09″]</span></p>
<p style="text-align:justify">  那麼為什麼沒有準備、很浮浮泛泛地去上一節課,和經過精心準備的心境、認真地發心,這樣非常殷重地上一節課,對我們生命的影響是天壤之別的?因為我們平常的狀態沒有集中在經典上,比如學習經典它要一個非常恭敬的心,而且要慢慢地學,跟平常做很多事情的速度看起來是不一樣的。因為它需要凝視我們的內心,去看祖師、佛菩薩在說什麼。所以就好像從一個非常非常喧嚷的白晝時光,突然進入到一個明月當空寧靜的夜色之中,心境是非常寧靜、非常愉悅的。打開書的時候比較有耐心,也比較認真地能夠把每一個字聽到心裡去。&nbsp;<span style="color:rgb(42, 100, 150)">[02′09″]</span></p>
<p style="text-align:justify">  所以我會認為在學《廣論》之前的準備是很重要的,其實就是聽聞軌理。聽聞軌理一旦修成習慣之後,數數思惟聞法勝利,那麼對於大乘發心的策發,正聽聞時聽聞軌理的訓練,乃至聽完之後結行的迴向,其實都有著不可思議的影響。因為這會成為我們的一種習慣!&nbsp;<span style="color:rgb(42, 100, 150)">[02′37″]</span></p>
<p style="text-align:justify">  比如說我們早晨起來會準備一天的生活,我們上班之前也會準備,乃至我們上辯論場之前也會準備,我們上背書課之前也會準備。那麼我們上廣論課之前的準備到底是什麼呢?就是思惟聞法勝利。思惟到什麼程度呢?最少要讓自己的心動轉,至少讓它寧靜下來,一會兒聽的時候能夠集中心力。尤其對於自己能夠聽聞佛法的時光,要生起非常非常珍惜的這樣一種心情,很難得、很難得的。就是對師父所講的話、對宗大師的《廣論》,一字一句都不想錯過,要把它非常非常清晰明了地聽到自己的內心之中。&nbsp;<span style="color:rgb(42, 100, 150)">[03′37″]</span></p>
<p style="text-align:justify">  好!那我們就開始聽一段師父講的《廣論》。</p>
<blockquote>
<h4>  那麼幸好民國初年有幾位了不起的大德,尤其是太虛大師,這個人真是個大菩薩。他以他的心胸,他要全部提起,所以他倡一個口號——八宗並弘。那麼,這個我們換成現代最簡單的話,我要來說一下。平常我們個人修,譬如說他學禪、他學淨,這對我們個人來說,是沒有錯,你可以有成就,而且我們個人修,也必須要走個人的特別的路子,一定是一門深入。但是對整個佛法的弘傳來說的話,這個不夠,這個不夠,一定要各方面的圓滿配合,這樣。譬如說我們現在來造一個房子來說,或者造一個寺院來說,假定說,我今天在這地方要講修行,你說我造個小茅篷,反正是一間,那麼拜佛也在這裡,吃飯也在這裡,睡覺也在這裡,我只要我的修行成功,就行!可是假定說,你要把那個三寶的形相撐持起來的一間大廟,這個不行;你一定要有大殿,有寮房,有大寮,有各式各樣的配合。那麼佛法也是如此。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[05′23″]</span></h4></blockquote>
<p style="text-align:justify">  好,上一次師父講了靜命大師、蓮花生大師,然後講到阿底峽尊者、講到宗喀巴大師。現在這幅歷史畫卷又翻到了民國初年有幾位了不起的大德,尤其是八宗並弘的太虛大師。我想有一些老同學可能把這一段也都聽過很多遍了,其實我滿想問問大家的:在這一段裡,我們這一次聽聞,大家會覺得有看到什麼過去忽略過的嗎?就是你忽略的、沒有聽出來的。&nbsp;<span style="color:rgb(42, 100, 150)">[06′04″]</span></p>
<p style="text-align:justify">  比如師父說:「<strong>這個人真是個大菩薩,他以他的心胸,他要全部提起。</strong>」全部提起什麼呢?大家的回答是什麼呢?有人可能說是佛教,有人回答說八宗並弘,就是所有佛教的傳承,他全部要擔在自己的肩上,令它弘傳下去。從這樣一個了不起的大德的心胸和他的擔當,然後師父又講到:「平常我們個人修行,譬如說學禪、學淨,對我們自己來說,是沒有錯,都可以有成就的,而且我們也必須要一門深入。」個人修行要一門深入,但是對於佛法的弘傳來說,注意!師父說:「<strong>這個不夠</strong>」,又說一句:「<strong>這個不夠!一定要各方面的圓滿配合。</strong>」&nbsp;<span style="color:rgb(42, 100, 150)">[07′10″]</span></p>
<p style="text-align:justify">  當初可能在學習的時候,這一段也就這樣看過去,覺得師父在讚美太虛大師,在給我們講太虛大師的胸襟是如此地遼闊、恢宏,如此地承擔佛教的弘揚。可是師父為什麼要講呢?為什麼要為我們講他的心胸,他全部提起,而且還要對我們講自己修一門深入是可以的,但是對整個佛法的弘傳來說,這樣是不夠的,一定要各方面圓滿地配合?&nbsp;<span style="color:rgb(42, 100, 150)">[07′55″]</span></p>
<p style="text-align:justify">  說到這一點的時候,就想問大家一個問題:法師們、居士們,我們是怎麼看待自己對於佛教發展的責任?比如說自己的修行,和對於佛教的弘傳這個責任感和使命感,這兩者是怎樣結合的?如果我們想要發起菩提心,我們要去利益法界的有情,那如何令法界的有情都能得到利益呢?就是一定要給他們建立出離心、菩提心、空性的這樣一個道次第的修持啊!所以如何能令廣大有情的生命離苦得樂?那一定要教法的弘揚!所以弘揚教法,其實就是關心所有的生命,就是有這樣一顆廣大的心可以承載很多很多顆心的離苦得樂。&nbsp;<span style="color:rgb(42, 100, 150)">[09′02″]</span></p>
<p style="text-align:justify">  其實在這個地方,我覺得師父還是透過歷史畫卷的這些傳承祖師的偉大行相,在讓我們看我們該學的人是什麼樣子,他們怎麼樣面對自己的修行,他們又怎樣把佛教的弘揚荷擔在自己的身上,有著這樣的一種氣魄。那麼現在坐在教室裡或者坐在家裡邊,在研討《廣論》的這些同學們來說,我們對自我的修行、對於佛教的發展——也就是眾生的福祉,應該自己有一個什麼樣的發心呢?因為師父講這一段,一定不是只讓我們聽聽就可以了。啊,聽聽「太虛大師好偉大哦!阿底峽尊者好偉大呀!宗大師好偉大!」偉大之後呢?為什麼要給我們聽這種偉大呢?&nbsp;<span style="color:rgb(42, 100, 150)">[09′59″]</span></p>
<p style="text-align:justify">  所以師父又說:「假如自己修行的話,蓋個房子、造個小茅篷就可以了,反正就一個茅篷嘛,拜佛也在這裡,吃飯也在這裡,睡眠也在這裡。」像一開始我們剛出來,寺院還沒有蓋的時候,確實就那麼一大間屋子,早課、晚課、中間上課、背書、辯論全在那一間裡邊。那種狀態下,其實如果居士來是完全沒有辦法的,因為沒有地方給大家上課,光是出家人就把整個地板都站滿了,根本沒有居士的立足之地呀!所以要想要弘揚佛法的話,就要蓋一個寺院呀!蓋一個寺院,比如有一百個出家人的話,得有一百個出家人的寮房、一百個出家人的教室、一百個出家人的辯論場,還有護法殿啊、如意寮,還有齋堂。齋堂也要一百人的,然後大雄寶殿至少要比一百人還要多。&nbsp;<span style="color:rgb(42, 100, 150)">[10′56″]</span></p>
<p style="text-align:justify">  所以你要想弘揚佛法,他就說:「<strong>各方面都要圓滿配合。</strong>」那麼各方面要圓滿配合,有些人就想起來說:「哇,這樣好累呀!」是有一些人很累的哦!但是如果沒有一些人很辛苦地把佛教撐持下來的話,我們怎麼樣能夠現在又學到《菩提道次第廣論》呢?怎麼可能延續到現在呢?師父講的這麼多祖師,把法傳承到現在,你說哪位祖師不辛苦?但是都樂在其中啊!所以正是因為先輩祖師不畏各種各種困難,堅持把佛法弘揚下來、傳承下來,所以我們現在才有機會。&nbsp;<span style="color:rgb(42, 100, 150)">[11′39″]</span></p>
<p style="text-align:justify">  正是因為有人荷擔著佛法的重任,我們這個所謂的小我,才能在這些大菩薩們的發心之下,我們能有一間自己的課堂、能有一本自己讀的經論、能有一個佛堂在裡邊靜靜地念經,實際上這是好多好多人成辦的。比如我們生在一個和平的地方,這個地方沒有戰亂,所以我們就可以學習;沒有特別地貧窮,我們都可以有吃的、有住的,教育程度也相當地好,我們讀經典還可以。即使班裡邊有不識字的,透過幾年學《廣論》,都會認字了,這也是非常好的——所以要各方面圓滿地配合!&nbsp;<span style="color:rgb(42, 100, 150)">[12′25″]</span></p>
<p style="text-align:justify">  在這裡邊師父就給我們打開了非常廣闊的這樣一個角度,讓我們去看教法的發展實際上需要歷代的大德一肩擔承,把這個教法傳承下來。要有傳承教法這樣的發心,和他們這種堅韌不拔的力量,佛教才能夠傳持到現在,才能夠到了你我的眼前、到了你我的耳畔。所以從這一點來說,師父實際上在《廣論》開始的時候、在每一部分講的時候,都非常非常善巧地擴大我們的格局、擴大我們的心胸,讓我們在整個佛教發展上、在關心所有眾生的福祉上,去安立自己的修行。&nbsp;<span style="color:rgb(42, 100, 150)">[13′16″]</span></p>
<p style="text-align:justify">  所以我會覺得,師父在培養我們成為發大心的、大乘種姓的這樣一個弟子,他真是太善巧、太慈悲了!在很多很多地方,都可以讀到他那滿滿的心意,和那種有的時候簡直是不露痕跡、悄悄地為我們的心,就好像澆一棵苗一樣,來澆點水、培點土,或者對我們輕輕地祝福,讓我們內心的菩提苗芽,能夠不停地成長和茁壯。再學這一段的時候,再想一想師父他是從怎樣的格局,令佛法弘揚下來? [14′03″]</p>
<blockquote>
<h4>所以像虛大師這種菩薩再來人,他有這樣的願心,結果他門下的弟子,除了我們本來有的台、賢、性、相各方面,以及所謂禪、淨等等。關於密教部分,在我們中國內地,已經失傳很久;以前有,偏於宮廷方面,元、明以來,一直都是這個樣。後來虛大師就為了學這個,派了幾個弟子,一部分向東去學東密,當年的時候是大勇法師什麼,還有呢,後來大勇法師也到西藏去。那麼另外呢,跟大勇法師去,是現在本論的作者——法尊法師。實際上真正到西藏去學藏密的還是有一堆人,而這個裡邊,結果對目前介紹這個藏密過來的,最了不起的一個大功臣,就是那「尊法師」。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[01′14″]</span></h4></blockquote>
<p style="text-align:justify">  剛才我們聽這一段,說像虛大師這種菩薩的再來人,師父在這一段講了:「密教的部分,在中國內地已經失傳了很久了;以前有,是在宮廷裡邊傳的。」然後講到太虛大師派了幾個弟子去學習密法,其中就有大勇法師啊,然後還有誰呀?就是現在本論的翻譯者——法尊法師。但是師父說真正去學習的還有很多人,這裡邊對目前把藏傳佛教介紹過來的,最了不起的大功臣就是「尊法師」!&nbsp;<span style="color:rgb(42, 100, 150)">[01′59″]</span></p>
<p style="text-align:justify">  提到尊法師,新的同學不知道熟不熟悉,老同學都非常熟了。其實他翻譯了很多很多我們漢傳裡邊沒有的。我今天講一下大家比較熟悉的,譬如說:《菩提道次第廣論》、《菩提道次第略論》、《勝集密教王五次第教授善顯炬論》、《集密五次第教授攝要》,還有《菩提道次第攝頌》、《辨了義不了義善說藏論》、《辨了義不了義善說藏論釋難論》、宗大師寫的《緣起讚》、《菩薩戒品釋》——就是專門解釋菩薩戒的,然後《地道建立》、《二十種菩提心法》、〈十萬頌般若經中一百零八句法的略解〉,還有《上師薈供法》等等。法尊法師也曾被譽為是現在的玄奘大師!當然這裡邊還有《現觀莊嚴論》、《辨法法性論》、《七十空性論》、《精研論》、《四百論》、《入中論》、《入中論善顯密意疏》、《入中論疏》,還有《阿毘達磨俱舍論釋.開顯解脫道論》等等。&nbsp;<span style="color:rgb(42, 100, 150)">[03′09″]</span></p>
<p style="text-align:justify">  可以想像一個人一生啊,從去學藏文到精通藏文、到開始翻譯。他為什麼要翻譯呢?就是為了我們這些漢土的有情能夠了解藏傳佛法,然後做了這麼多辛苦的翻譯呀!現在我們寺院的法師們也在翻譯,我也有參與過一些。在翻譯的時候可以看到真的是滿辛苦的,說「滴滴心血化為字」一點都不過分!有的時候他們都是在學習五大論、辯論完了,早晚課之後再開始翻譯。&nbsp;<span style="color:rgb(42, 100, 150)">[03′46″]</span></p>
<p style="text-align:justify">  像有的同學從練習翻譯開始,其實都有二十多年的學習生涯了。因為從十多歲到寺院,現在我們譯經院的法師都快四十歲了,所以學了二十多年的藏文。有法師們傳聞說,有的法師做夢都在用藏文說夢話,所以是非常熟練的。但是大家翻譯的時候,還是會遇到比如他們當地的土話呀,我們就不明白了,覺得是什麼意思呢?然後就要請問仁波切呀、請問格西呀,問了之後才會知道當地人都明白的一件事,但是我們漢族人就不懂這是什麼了。可能就像我是東北人嘛!東北人都明白的一句話,要是講給台灣人的話,台灣人完全不知道是怎麼回事;同樣,台灣人講一句話講去東北,東北人也不曉得是怎麼回事。因為有地域的隔閡、語言的隔閡,所以譯師、去求法的譯師,就對佛教的弘揚發展,應該說建立了豐功偉績呀!&nbsp;<span style="color:rgb(42, 100, 150)">[04′48″]</span></p>
<p style="text-align:justify">  像以前聽說也有一位去求法的法師,沒有吃的,就只有幾粒豆子,然後每天吃一粒豆子,堅持學習、堅持翻譯,就這樣過了一週啊!所以去求法的時候,比如說去藏地求法的話,首先就是高山症,再一個就是飲食習慣,然後語言關、你的體力、環境各方面的挑戰,這都是譯師們要穿越的。我們寺院的法師,好就好在沒有去很遠的地方學習,就在自己的寺院裡學會了藏文,然後集體翻譯。所以這要感謝師父的恩德、感謝廣大居士的這種護持吧,才有今天的譯經院。&nbsp;<span style="color:rgb(42, 100, 150)">[05′40″]</span></p>
<p style="text-align:justify">  提到譯經院,大家就會想到玄奘大師啊,想到義淨大師啊、鳩摩羅什大師啊,然後現代的法尊法師、大勇法師等等,這些了不起的譯師。他們辛辛苦苦地用自己生命點點滴滴的心血,描繪了這個傳承的美麗畫卷,讓我們看起來非常非常地絢麗和感動。所以現在再看到師父介紹:「最了不起的大功臣,就是那『尊法師』!」唸到這「尊法師」的時候,心裡一陣的感動、一陣的溫暖,因為他對我們來說,再也不是一個很陌生的譯師,他是我們生命裡的大恩人! [06′28″]</p>
<blockquote>
<h4> 那麼,這個是順便說一下。剛才說到宗喀巴大師,把那個完整的教法提起來了,那麼現在呢,我們也有機會接觸到。雖然它現在已經向下了,但是的的確確把我們中國固有的東西,以及現在這個配合起來的話,我的感覺,不管我們自修也好,對佛法的前途也好,那真是前途無量、前途無量。那麼關於這個宗喀巴大師,他自己本人的成就,我也簡單地說一下,這裡。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[00′44″]</span></h4>
<h4>  宗喀巴大師,剛開始學的時候,他主要的先由基礎上面——教理,所以他頭上多少年廣學各家各派的東西,各家各派的東西。他只有二十剛出頭一點,進到西藏,沒有幾年就全藏聞名,全藏聞名,換句話說,他這個教理的通達。但是他並不是憑空而來的,以他這樣的一個絕頂聰明的人,他到處去參訪當時的善知識,沒有一個善知識不參訪的,這樣。然後跟他們廣學那些善知識所通達的東西,而學的內容,不拘任何宗派,小乘的《俱舍》,然後呢,大乘的性宗、相宗、因明,乃至密教,然後自己有圓滿徹底的認識。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[01′53″]</span></h4></blockquote>
<p style="text-align:justify">  好,這一段聽完了之後,師父說:「<strong>剛才講到宗喀巴大師,把完整的教法提起來了。</strong>」那我的問題是:什麼是完整的教法?第二個問題:什麼是提起來?大家想想哦!&nbsp;<span style="color:rgb(42, 100, 150)">[02′15″]</span></p>
<p style="text-align:justify">  接著師父講到:「<strong>現在,我們也有機會接觸到</strong>」,接觸到什麼呢?被宗大師提起的完整的教法,是這樣吧?說:「<strong>雖然它現在已經向下了,但是的的確確把我們中國固有的東西,以及現在這個配合起來。</strong>」師父說:「<strong>不管自修也好,對佛法的前途也好</strong>」,師父用了兩次「<strong>前途無量、前途無量!</strong>」這也是對完整教法的傳承一種美好的、非常真摯的信心,還有對於能對完整的教法有信心、有法緣接觸到的我們,無論我們自修也好、無論我們發廣大的心也好,師父都說我們應該是前途無量的吧!&nbsp;<span style="color:rgb(42, 100, 150)">[03′11″]</span></p>
<p style="text-align:justify">  那麼再問大家一個問題:什麼叫「前途無量」?如果你自己修的話,前途無量是什麼呢?對於佛法、教法的傳承來說,前途無量又是什麼呢?&nbsp;<span style="color:rgb(42, 100, 150)">[03′27″]</span></p>
<p style="text-align:justify">  在下一段又介紹了,說宗喀巴大師在開始學的時候,他主要先由基礎上面的教理,廣學各家各派的教理,所以二十歲剛出頭的時候已經全藏聞名了。注意哦!師父說這個教理他是非常通達的。師父在這裡邊成立宗大師是一個非常聰明,而且是絕頂聰明的人,他到處去參訪當時的善知識,沒有一個不參訪的。那這一句我問大家一下:一般我們都認為無師自通是最聰明的,對吧?那這麼絕頂聰明的人,為什麼還要到處去學呢?&nbsp;<span style="color:rgb(42, 100, 150)">[04′14″]</span></p>
<p style="text-align:justify">  再問大家一個問題:那是不是因為他絕頂聰明,所以才知道要到處去學呢?然後「<strong>廣學那些善知識所通達的東西</strong>」哦!那這個人聰不聰明呢?&nbsp;<span style="color:rgb(42, 100, 150)">[04′27″]</span></p>
<p style="text-align:justify">  「<strong>而所學的內容,不拘任何宗派,小乘的《俱舍》等等,然後性宗、相宗、因明,乃至密教,他都有自己最圓滿的認識。</strong>」這麼絕頂聰明的人,參訪了那麼多大善知識,跟那麼多大善知識學,所以最後得到自己圓滿的認識。&nbsp;<span style="color:rgb(42, 100, 150)">[04′46″]</span></p>
<p style="text-align:justify">  這一段師父有沒有立出他自己的觀點呢?雖然是介紹宗大師的,但是有沒有想我們學佛開始的時候,要不要重視學教理呢?因為還記得師父在上一面提到朗達瑪破壞佛法,後來說破壞得不成樣子,又後來講到有一點恢復。恢復一百多年之後,那個教法也是非常地亂、非常地亂!然後師父用怎樣的語調形容它亂呢?注意聽!注意聽!「<strong>平常的時候,大家都是憑個人的想像,憑個人的想像,所以這個凌亂的情況我們可以想見。</strong>」注意哦!非常亂、非常亂,大家都是憑個人想像的時候,那已經是亂到極點了,這個見解是在說什麼呢?傳承已經沒有了,對於經典的解釋、論典的解釋,大家都在憑個人的想像。就是想像力怎麼解釋就怎麼解釋,已經沒有師師相承的這樣一個傳承了,那就是亂到極點了!&nbsp;<span style="color:rgb(42, 100, 150)">[06′05″]</span></p>
<p style="text-align:justify">  那麼今天有講到,宗大師這麼絕頂聰明的人,他到處去參學當時的善知識,把他們所通達的內容不拘宗派地全部都學來了,就是各個傳承都學來了,所以成為了當時的頂嚴,非常非常聞名!大家學了《廣論》就會看到各種說法全部是有依據的,佛陀是怎麼說的、祖師又是怎麼講的,正確的觀點是什麼。所以佛教是一個非常非常嚴謹的思辨過程,它不是憑想像力而構建的一個玄學,它是非常非常嚴謹的,由於思路、由於抉擇而成立出來的教理。透過跟隨善知識聽聞,聽聞之後得到聞慧,然後再進行思考得到思慧——得到自己不可動搖的這種見解,然後再依照這個來修行轉變。就是聞的時候也轉變心,思的時候也轉變心,再由修再轉變心,完成對內心強大的轉變。&nbsp;<span style="color:rgb(42, 100, 150)">[07′14″]</span></p>
<p style="text-align:justify">  所以推動命運的那雙手是什麼呢?是思想。那麼思想如何才能夠從片面的、局限的,甚至是顛倒的,變成是廣泛的、全面的、清淨的呢?就是要聽聞教典。所以為什麼佛法亂的時候,它的相狀會是修行人都憑各自的想像?就是沒有一個經典的依據,沒有可靠傳承教法的教理來指導大家的修行,那盞教理的明燈大家已經看不清楚了,所以個人的經驗就變成了好像很重要的事情。所以師父也再再地告誡我們說,像宗大師這樣絕頂聰明的人都去跟所有的善知識學,那麼又何況是我呢?說學佛法不能夠憑藉自己的主觀臆斷、主觀想像,要看看傳承是怎麼說的、經上是怎麼說的、論是怎麼講的。那麼這麼說有道理嗎?要經過內心的反覆思辨、再再地去思考,所以它會被稱為是智慧之學。&nbsp;<span style="color:rgb(42, 100, 150)">[08′37″]</span></p>
<p style="text-align:justify">  學了幾年之後,你就會發現自己比過去聰明多了。對事情的判斷力會比過去迅速,對什麼事情都會有非常認真、很負責任的一番探索,不會大而化之。因為《廣論》每行字、每行字,都是要我們認真地探索教理是在說什麼?所破是什麼?所立是什麼?在我們內心的行相又是什麼?你的說法有傳承嗎?有依據嗎?&nbsp;<span style="color:rgb(42, 100, 150)">[09′05″]</span></p>
<p style="text-align:justify">  所以在譯經院法師們大會校討論的時候,大家都要說:「這句話到底是什麼意思?你這樣說有依據否?他這樣說有依據否?」不會說:「我覺得怎樣、我覺得怎樣......」就算是再來人,正因為他是再來人,所以他更加地重視教典。因為如果教典失傳了的話,我們怎麼樣修行啊?我們怎麼樣知道哪裡是解脫、什麼是菩提心、什麼是空性啊?所以認真地學教理,然後可以使教正法傳持下去。那教正法能夠傳承下去,就會有證正法。&nbsp;<span style="color:rgb(42, 100, 150)">[09′41″]</span></p>
<p style="text-align:justify">  所以每一個在此時此刻認真地聽師父帶子的我們,都在為傳持教法奉獻出自己的力量,因為我們對這個教法有很大的信心的緣故。可以自己隨喜一下,因為我們不是靠個人的想像力在修行,我們是依照嚴格教理的論典、依靠善知識的講解,然後再反覆、多次地學習。像有的學員已經學二十年了,學二十年了之後,你是會覺得《廣論》沒什麼好學的,還是你會發現太多沒有學懂的?還有師父的帶子,聽了多少遍了?聽了多少遍之後,還會發現其中有自己疏漏的地方,甚至有特別大的點都沒有看到。如果這樣的話,那麼二十年的學習,每一年、每一年它都有不一樣的意義,它不僅僅是一個重覆,它是一個遞進,它是必須要進步的一個層次。&nbsp;<span style="color:rgb(42, 100, 150)">[10′40″]</span></p>
<p style="text-align:justify">  我們能學到這種圓滿的教法,而且有這樣了不起的大善知識,把圓滿的教法提起來傳承到我們的面前,所以感謝一切大善知識,尤其感恩那些譯師們,感恩我們的師父。也感恩這個時代,能給我們這樣一個美好的環境,讓我們能夠靜靜地坐在燈下,學著這些聽起來很古老,卻是充滿時代的跳躍感這樣的智慧,應用起來是如此實用,可是它的傳承真的是淵遠流長。所以好好為自己能夠聞法的時光幸福一下吧!真的是非常感恩! [11′32″]</p>
<blockquote>
<h4>那麼說到他這個人的聰明,我講一個故事,很有意思,就是發生在他身上。他那時候剛進西藏沒多久,那麼有一次生了病,去看醫生。看醫生哪,當地都是最好的醫生,就給他看,看完了以後,把完了脈以後就用藥,這用藥大家要討論一下他的病情什麼等等。結果呀,有意思,這個病人,換句話說,就是宗喀巴大師,他也在這個裡邊參加他的意見,欸,覺得這個脈相是怎麼樣,應該下什麼樣的藥等等。哈!結果所有代他看病的醫生,有一個共同的感受,非常驚訝說:「這個年輕人,了不起!不是我在這裡給他看病,而是我遇見了一個最好的,好的醫學教授,上了一課。平常我不懂的東西,被這個病人一講,都懂了!」我們無法想像的這種事情,這是我們絕對無法想像。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[01′12″]</span></h4>
<h4>  以我們不妨想一想,為什麼要我們想一想呢?就是說,我們經常拿我們的自己的生活經驗所體會一下,那麼才能夠更深入地了解我們要講的特質、內容。所以我們現在不妨想,我們現在看病,跑到醫院裡去,那個醫生不要說不講,就是跟你細細地講,再詳細講,講了半天,你會不會有什麼印象啊?我們一點印象都沒有,因為醫學這個東西非常複雜。我們現在的這個病,他譬如說要看你的胸部,X 光照,你一看就可以看得出來。然後實驗報告,說你這個紅血球多少,白血球多少。他可沒有哦,就把那地方,脈這麼一把,要我們自己把,把那個脈,根本不曉得它到底是什麼,只覺得撲通、撲通跳幾下。欸,就這麼他這樣的一個年輕人,他就是能夠了解這個,而把當時的名醫,都這樣說服,這是實在絕頂聰明,這樣的一個人!所以我們從這個地方,可以了解,這樣的聰明人,然後廣學——從小乘開始,到性、相,各宗各派。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[02′29″]</span></h4></blockquote>
<p style="text-align:justify">  好!我現在問大家一個問題:講宗大師的功德、講宗大師聰明絕頂的時候,你們會不會想到師父為什麼會講了這樣一個公案呢?其實宗大師的功德,講、辯、論著都是無與倫比的,那麼為什麼師父講了一個看病這樣的公案呢?你們心裡有這樣的疑惑嗎?有什麼答案嗎?&nbsp;<span style="color:rgb(42, 100, 150)">[02′57″]</span></p>
<p style="text-align:justify">  那我現在再問大家下一個問題:如果講宗大師講、辯、論著這樣的功德,我們能不能從我們的經驗裡,去體會到宗大師有多了不起呢?我們有沒有講、辯、論著這樣的經驗呢?如果沒有的話,如何去類比出宗大師的絕頂聰明呢?&nbsp;<span style="color:rgb(42, 100, 150)">[03′20″]</span></p>
<p style="text-align:justify">  這樣的一個角度,是否可以理解師父為什麼從這個角度講宗大師的功德?因為至少我們都去醫院看過醫生,看醫生的時候我們還能參與意見,這是不可能的事情!不要說專家級的名醫,或者最厲害的醫生雲集的專家討論會,就是一個普通的醫生給我們看病,通常講了半天我們也不明白,就是給什麼藥、吃什麼藥,應該是這種狀況吧!就只有用一個看病這樣的例子,我們才會從我們平常的經驗之中去類比一下,這樣一個年輕人——就是大學生啊、中學生這樣的年齡,就可以參與到對於病理狀況啊、藥劑狀況的這種專家級的討論;而且下一步是被專家級的佩服,說一個非常非常厲害的醫學教授、最好的教授。而且是給專家上了一課,平常不懂的東西,被這個病人講了一下,都懂了!成為專家級的醫學教授了。&nbsp;<span style="color:rgb(42, 100, 150)">[04′27″]</span></p>
<p style="text-align:justify">  這種事情如果發生在哪個大學裡的大學生的話,可能會令整個醫院、令專家滿震動的。那麼假如我們是在專家系統裡,也會很驚愕的,因為他不是這個系統的人。在醫學領域,宗大師都能夠這樣子;就以這樣的聰明程度,再在他擅長的這個聞思修、講、辯、論著的領域裡,那真是大鵬展翅,不可思議的高度!不知道你們可不可以認同我這樣的理解?大家認為呢?&nbsp;<span style="color:rgb(42, 100, 150)">[05′03″]</span></p>
<p style="text-align:justify">  我覺得師父非常非常貼緊我們的現狀,因為我們無法了解講、辯、論著的功德到底有多高!怎麼樣去想像呢?除非你有一點點經驗。所以特意找了這樣一個看病的例子。你們認為呢?&nbsp;<span style="color:rgb(42, 100, 150)">[05′21″]</span></p>
<p style="text-align:justify">  「<strong>而把當時的名醫都這樣說服,這實在是絕頂聰明</strong>」,最後師父結論到哪裡呢?「<strong>這樣的一個人!所以我們從這個地方,可以了解</strong>」,可以了解他就這麼聰明!「<strong>這樣的聰明人,然後廣學——從小乘開始,到性、相,各宗各派。</strong>」以這樣的聰明程度、以那樣的用功程度,然後那麼廣泛地參訪所有的善知識去學習,那可以想像他對教理廣博聞思的程度,達到一個頂級的狀態了!&nbsp;<span style="color:rgb(42, 100, 150)">[05′59″]</span></p>
<p style="text-align:justify">  那麼下面又是一個問題了:為什麼要一直講宗大師絕頂聰明?越講宗大師絕頂聰明,我們就會覺得:「啊!這是聰明人能走的,我這麼笨的是走不了的!」會不會有這樣的想法呢?因為那都是佛菩薩示現的才能走的,我可能走不了。當我們遙望星星的時候,難道僅僅是為了證明我在地上多麼渺小嗎?佛陀夜睹明星開悟了,我們看到星星,只會想到自己的渺小,還是也會想到很多?建立生命的宗旨啊,或者想一想:這個絕頂聰明的人,來到這個世界上廣學各宗各派,用了難以想像的努力,為我們示現了講、辯、論著不可思議的種種功德,那他來這邊就是為了表現一下他多聰明、多有智慧,然後就走開了,就是這樣表現一下嗎?日、月、星辰難道是為了自己的光明而顯現的?還是為了能夠給我們照明而出現的?&nbsp;<span style="color:rgb(42, 100, 150)">[07′13″]</span></p>
<p style="text-align:justify">  再一個問題!「他這麼絕頂聰明,那我太笨了!」我太笨了,然後呢?「所以我就笨下去吧!」或者說:「這是聰明人走的路,我就不走這條路。」還是會覺得:「這麼聰明的人都選擇走這條路,何況我這麼笨的呢?我更要跟著聰明人走了!」這裡邊有好多種思路。有在想嗎?看到了聰明人會絕望嗎?還是看到了聰明人來帶領我們,我們會感到希望?難道我們喜歡被不聰明的人帶著嗎?被不博學的人帶著,我們喜歡追隨這種人嗎?當然不是吧!如果追隨一個不是絕頂聰明、廣學多聞的,我們有什麼成長的空間呢?&nbsp;<span style="color:rgb(42, 100, 150)">[08′09″]</span></p>
<p style="text-align:justify">  我剛才提到,為什麼不在這裡邊講說宗大師講、辯、論著的功德,而是要說看病?現在能提出這個問題的人,是不是了解了宗大師講、辯、論著的功德了,對不對?然後才能夠提這樣的問題。可是三十年前,師父在講《菩提道次第廣論》的時候,有人知道宗大師嗎?我們對藏傳佛教了解的是多少?心裡應該有很多排斥吧、有很多誤解吧!怎麼可能了解到宗大師還有講、辯、論著等等不可思議的功德,怎麼可能去知道他可以一天講二十一部論?然後他可以巡迴辯論《現觀》十一遍,到多少個寺院去巡迴辯論,他每天要背多少書,這個我們是不知道的,也不知道看書!這是師父講了三十年之後我們再來學,有一些學過的同學會提出問題:「為什麼不講講、辯、論著的功德?」&nbsp;<span style="color:rgb(42, 100, 150)">[09′15″]</span></p>
<p style="text-align:justify">  當時要是講了,講、辯、論著的功德,大家又會生什麼想法呢?講、辯、論著!我要學這樣講、辯、論著,太麻煩了吧!念一句阿彌陀佛就可以了,這多省事的求解脫的辦法呀!是拒絕聞思經論的。我們覺得學習經論是很麻煩的,我們會找捷徑去取得修行的成功。也沒有想過很多向內調伏啊,乃至到底用什麼樣的發心念這一句佛號,才能真的跟阿彌陀佛相應啊、跟西方極樂世界相應啊......很多東西。沒有對教理作過詳盡地聞思,我們就會覺得:「哎!就是那樣一回事情!」&nbsp;<span style="color:rgb(42, 100, 150)">[09′57″]</span></p>
<p style="text-align:justify">  在那樣一個時代,師父想要引導我們慢慢地走近宗大師,心裡不要有太多的排斥,所以才講到了這樣一件可以成立宗大師絕頂聰明的事情。你們會不會覺得師父是為我們貼身設計呀?三十年之後,現在學五大論的這麼多了,宗大師的功德、父子三尊的功德也了解很多了。想想當時,他就是千里獨行啊!征服的就是我們無知的曠野,一個人在漢地講!難道不是嗎?&nbsp;<span style="color:rgb(42, 100, 150)">[10′38″]</span></p>
<p style="text-align:justify">  再問大家一個問題:在師父決定講這本《廣論》的時候,他對宗大師的功德了解得有多深?我們就試想一下,有讀過廣傳嗎?讀過略傳嗎?讀過《應化因緣集》嗎?如果不是深深地為宗大師講、辯、論著的功德所崇仰,怎麼可能挑起這麼重的擔子——到一個人們都不知道他的地方,為我們講述《菩提道次第廣論》?所以他了解宗大師的功德一定是非常非常密集、非常非常多的,但是他卻講了這個!來我們這邊,我們那時候是沒有多少人知道的,所以就等於心裡好像有海一樣的含量,只給我們餵一滴水。根據我們的吸收量、信心的程度,合量地給我們設計的這樣一個法宴。想想這是何等的用心啊!&nbsp;<span style="color:rgb(42, 100, 150)">[11′46″]</span></p>
<p style="text-align:justify">  再想想,我們很多帶班的班長啊,自己考慮考慮自己去帶班的時候,都是一種什麼樣的發心呢?是完全為自己班裡的同學能不能吸收師父講的這一段考慮呢?還是有很多「我要把這段講得好」、「我要把我理解的東西講出去」呀?是完全站在聽聞者是否能理解的角度考慮,是否令聽聞者得到最大的利益?還是有的乾脆就上去炫技——不管能不能聽懂,反正我把我知道的全部都講一遍!講很多很多,可是並不適合大家。&nbsp;<span style="color:rgb(42, 100, 150)">[12′23″]</span></p>
<p style="text-align:justify">  所以常常說,做一件事情要有一個無染的發心、有一個極為純淨的利他心。從這樣一個小的、師父選擇的這個公案裡邊,是否可以體會到一點?師父了解那麼多,所以他才把這本《廣論》珍惜成這樣子,才不顧一切地給我們講。不管多少次失敗,他還是要給我們講,一定要講到我們能夠生起信心!那個時候他的心應該是堅定、不可動搖。就像我們用我們這個非常非常短淺的智慧去揣測一點點的話,他應該是對宗大師功德的認知已經是不可動搖的,所以才會有如此的勇氣、毅力,用這樣慈悲的心一直講、一直講。&nbsp;<span style="color:rgb(42, 100, 150)">[13′06″]</span></p>
<p style="text-align:justify">  所以我們能看到的、我們能理解到的善知識的恩德,他對我們的慈悲,總是很局限的。但是正因為我們看到了這種局限,我們可以去想像,還有多少是我們沒有體會過的,甚至連動念都沒有去想的?他講這一個例子到底用了多少心思?在我們這一生,乃至無量劫的無上菩提的這條路上,他為我們詳盡地打算了多少?一定比自己打算的多,這是肯定的!因為我們不懂求無上菩提。&nbsp;<span style="color:rgb(42, 100, 150)">[13′47″]</span></p>
<p style="text-align:justify">  再想一想,從無限生命的角度來關注我們,在生生世世的這樣一個努力上,這又是他多少次的宣講、多少次的為我們考慮?多少次的考慮我們的吸收量、理解程度?怎樣才能應機、怎樣才能讓大家歡喜地聽完,這又是多少次考慮了呢?所以為什麼說法恩這麼深、這麼重,一字一劫呀!所以要好好地學習呀! [14′29″]</p>
<blockquote>
<h4>我為什麼要提這個事情?這個地方,大家停一下,讓我們自己做個警惕:我們現在在這個地方,來幹什麼?修學佛法。你為什麼要修學佛法?說目的我們已經了解了,那麼為了達到我們去苦得樂的目的,我們有一個認識,說我們所以得不到的原因,因為對於很多事情,沒有正確的認識,一個專門名詞叫「無明」。換句話說,我們在無明當中,我們的概念,我們的執著,我、我、我!這個東西都是錯誤的根本,痛苦的根本在這裡。唯有一個有正確認識的人,指導了你,你了解了你的錯誤,那個時候心裡面想排斥這個錯誤。不但如此,還要進一步地認識怎麼樣才是正確的,然後照著正確的去做,那個時候,你才能夠轉化得過來。這個道理很清楚,這個道理才是我們真正第一步應該擺在心裡想一想的。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[01′06″]</span></h4></blockquote>
<p style="text-align:justify">  這一段不知道大家有沒有特別認真地聽?師父剛剛講到 1B,第一盤磁帶,師父就說:「<strong>我為什麼提這個事情?</strong>」這個地方注意!師父說:「<strong>大家停一下。</strong>」師父說了「<strong>停一下</strong>」!需要停掉什麼東西呢?剛才講了宗大師絕頂聰明的公案,不知道師父是不是又想到我們心裡可能泛起很多東西,然後馬上就調整現行了。說停一下,是什麼東西停一下呢?停一下我們內心中正在進行的那個續流。&nbsp;<span style="color:rgb(42, 100, 150)">[01′48″]</span></p>
<p style="text-align:justify">  然後接著師父說:「<strong>讓我們自己做個警惕。</strong>」警惕什麼呢?就是:「<strong>我們現在在這個地方,來幹什麼?</strong>」師父又提出這個問題。就是此時此刻是誰在這裡?那大家一定答說是「我」!然後「我」在這個地方幹什麼呢?答案:「<strong>修學佛法。</strong>」再問:「<strong>為什麼要修學佛法呢?</strong>」說目的已經了解了,是為了去苦得樂。那我們有得到快樂嗎?沒有!苦去掉了嗎?沒有!為什麼呢?師父說:「<strong>我們有一個認識,說我們所以得不到的原因</strong>」,到底是什麼呢?有講吧!說為什麼得不到的原因呢?「<strong>因為對很多事情,沒有正確的認識,一個專門的名詞叫『無明』。</strong>」師父說:<strong>我們在無明當中,概念執著我、我、我!這個東西是錯誤的根本,痛苦的根本在這裡。</strong><span style="color:rgb(42, 100, 150)">[03′03″]</span></p>
<p style="text-align:justify">  注意哦!剛才上一段講到宗大師的功德,師父小心翼翼地給我們講了這個例子,讓我們去認識一位絕頂聰明的善知識他的智慧、聰明程度。到這裡,你看師父,我覺得又非常勇猛地直接劈向我們的內心。說你在想什麼呢?注意!到這兒來做什麼了?馬上提出此時此刻的「我」在幹什麼?我的目的是什麼?那麼為什麼沒有得到快樂、為什麼沒有離苦?師父直接把「無明」這個概念就在第一盤投到我們眼前了。&nbsp;<span style="color:rgb(42, 100, 150)">[03′42″]</span></p>
<p style="text-align:justify">  大家都知道無明的概念是在十二因緣那兒才出現的,他在第一盤就一下子推到你面前了!應該說擲地有聲,嚇我們一跳——無明!什麼無明?我們所有的錯誤都是無明!什麼是無明啊?然後師父說痛苦的根本就是這裡。聽了這之後有幾人相信啊?說:「無明是什麼東西呀?為什麼它是痛苦的根本?」我們痛苦的根本不是某人某人沒理解我呀、錢賺得少呀,或者我不要去做我不喜歡的事情,我要去做我喜歡的事情啊!或者我被人家背叛啦,我被騙了!這些是痛苦的根本啊,對不對?還有說:「要學五大論很辛苦啊,提不起心力來的時候還要去聽、還要去辯論、還要去背書,這都是痛苦啊!」為什麼無明是痛苦的根本?我們會相信嗎?&nbsp;<span style="color:rgb(42, 100, 150)">[04′43″]</span></p>
<p style="text-align:justify">  再說什麼是無明啊?師父說:「<strong>我們的概念,我們的執著,我、我、我!這個東西就是錯誤的根本,痛苦的根本就在這裡。</strong>」如此地大刀闊斧、如此地勇悍,在第一盤磁帶就把「無明」和「我」這個概念直接拋出來,實在有點像驚天的炸雷一樣炸在我們面前。&nbsp;<span style="color:rgb(42, 100, 150)">[05′10″]</span></p>
<p style="text-align:justify">  當然在第一盤聽的時候,也有人會對這個點就全部錯過了,因為一開始聽《廣論》的時候,很多人就是喜歡聽,高高興興聽完一輪,其實沒記住多少,就是高興,歡喜心是有了。再細細地學的時候我們會發現,我們其實忽略了太多,沒想到 1B 就把「無明」拋出來了,就讓我們認識到這個根本。實際上你要再找痛苦的根本的時候,你對這兩個字是會非常深刻的,就像在黑夜的閃電一般明晰那樣的深刻程度。「無明」是什麼?為什麼我執著的「我、我、我」成了痛苦的根本呢?我們的痛苦的根本不都是外在的條件、外在的人,甚至疾病、環境等等,都是這些東西導致的嗎?為什麼「我」成了痛苦的根本呢?所以一定是有一大堆問題,如果就這個問題我們去糾結的話,一定會引生很多很多迷惑的問題。&nbsp;<span style="color:rgb(42, 100, 150)">[06′11″]</span></p>
<p style="text-align:justify">  這可能師父又會說了:「停!要警惕一下。」我們會發現:「什麼是無明」後面跟著很多很多疑問,什麼都不明白!這個時候師父就說:「那你什麼都不知道怎麼辦呢?」「唯有一個有正確認識的人,指導了你,你了解了你的錯誤。」因為剛才我們就是不了解,我們不承認呀!「你了解了你的錯誤,那個時候心裡想排斥這個錯誤。」注意!看到這兒的時候不知道有沒有疑問?了解了錯誤,到排斥錯誤,其實可能有很長的距離喔!本身了解錯誤就要很長的距離,有些人不覺得,甚至不知道錯誤在哪裡,都在外境上找、在環境上找。而在自我身上去找錯誤,去找下一段生命的一個希望點、一個起飛的點,有多少人呢?因為我們的身語意終究都攀緣在色聲香味觸法,執著在這上面,有多少心力讓所有的精神回歸自心?可能就喝一杯茶的功夫,會靜一靜嗎?連吃飯也變得很匆促、工作也很匆促,跟別人講話呀、做什麼,都是在一個忙亂的節奏之中、緊張的節奏之中,甚至是焦慮的節奏之中,我們如何停啊?如何警惕自己在做什麼?&nbsp;<span style="color:rgb(42, 100, 150)">[07′41″]</span></p>
<p style="text-align:justify">  所以,又有多少時間去想:現在的痛苦可能是由於我的錯誤導致的,那「我」是什麼錯誤?用多少時間去了解自己錯誤的行為方式、錯誤的語言方式、錯誤的思路?因為一定是錯誤的思路導致的。一開始想問題就想錯了,所以後來都不是自己想要的那樣子。在人生匆促的腳步中,我們有多少時間停下來,在夜晚看一看天上的星星?地上的人們忙成那樣子,碰到月圓的時候,有多少人去欣賞那麼漂亮的月亮在天上?在寂靜的夜空中,那皎潔的月亮那麼美,其實也沒有多少人有時間欣賞了。我的意思是說,在月亮、星光和日出被忽略的時候,我們的身心也被忽略了。我們只是隨逐著一個忙亂的時代腳步、生存的腳步,一天一天、一天一天地這樣過下去。有認真地想一想:我來幹什麼?我此生的目的是什麼嗎?&nbsp;<span style="color:rgb(42, 100, 150)">[08′56″]</span></p>
<p style="text-align:justify">  有人覺得這問題都是哲學家想的。哲學家為什麼要想這個問題?難道不是想要生命變得更美好嗎?每個人都想要生命變得更美好、生活變得更美好,提升生命的質量,所以全部都在忙。有時間想「無明」嗎?有時間探討這痛苦的根本嗎?甚至從未聽聞過。「什麼事情?無明和我是痛苦的根本,是錯誤的一切?」這件事簡直是太稀有了!如果不是師父在這裡提出來,我們終極一生乃至生生世世,怎麼會想這個念頭呢?怎麼會知道這個信息呢?如果他不來告訴我們,我們怎麼樣知道呢?&nbsp;<span style="color:rgb(42, 100, 150)">[09′47″]</span></p>
<p style="text-align:justify">  所以了解錯誤這個過程,就是要一個知道錯誤、又改了錯誤,有經驗、又肯告訴我們的人告訴我們才知道。然後我們知錯了就會改,當然會排斥錯誤。如果不知道錯是不會想改的,因為那不是我的錯呀,那是很多很多很多的錯呀,不是我的錯;是他們改了,我的生命才會變得美好,為什麼是我要改我的錯呢?而且這個錯非常地古怪,居然是「我」,居然是「無明」!好像跟什麼事都沒關係,好像是個概念、是個推理,這事情就更令人難以捉摸了!&nbsp;<span style="color:rgb(42, 100, 150)">[10′31″]</span></p>
<p style="text-align:justify">好,我們前一段是用了很大的力氣才知道,了解了錯誤,然後才想排斥錯誤,這就夠了嗎?還是不夠!師父又說:「<strong>不但如此,還要進一步認識怎樣是正確的。</strong>」知道是對的就可以了嗎?還不行,還要照著去做。了解了什麼是對的,建立了正確的概念和思路,接著這些思路要指導我們的行為。就像一盞燈照亮路,然後我們要在這路上走下去,要邁腳、要抬腳、要走!所以「<strong>照著正確的去做</strong>」,注意!師父結論:「<strong>那個時候,你才能夠轉化得過來。</strong>」請問轉化什麼呀?轉化什麼呢?轉什麼?我不知道你們在聽的時候會有多少答案?比如說從錯的轉到正確的來,這是一種答案。還有什麼?轉苦為樂,是嗎?終於找到正確的得到快樂的方式了,我們丟棄了以為快樂、實際上是痛苦的思惟模式和行為模式,那個時候才能轉化得過來!看看這次第哦!這次第是井然有序的,師父娓娓道來。<span style="color:rgb(42, 100, 150)">&nbsp;[01′22″]</span></p>
<p style="text-align:justify">  接著師父說:「<strong>這個道理很清楚。</strong>」請問誰清楚呀?師父知不知道我們不清楚啊?但是師父在這裡說:「這個道理是很清楚的。」因為大家都知道,要了解無明就要了解空性,空性就是整本《廣論》後面毗缽舍那的部分,也是整個《般若經》、《金剛經》,還有很多經所闡述的內容。師父說:「<strong>這個道理很清楚,這個道理才是我們真正第一步應該擺在心裡想一想的。</strong>」第一步喔!什麼是第一步啊?是坐在課堂裡的第一步、研討的第一步,還是人生來應該先想這個問題?當然我們小的時候無法想,聽了之後才會想。想什麼道理呀?痛苦的根本是什麼?為什麼一直要離苦得樂達不到、這麼苦澀?是哪裡錯了嗎?每天拼命地忙就是為了求快樂,為什麼這麼多苦悶?是哪裡錯了嗎?<span style="color:rgb(42, 100, 150)">&nbsp;[02′36″]</span></p>
<p style="text-align:justify">  如果總是環境錯了,環境好了我們才會快樂,一直沿著這樣怪外境的思路活下去,有沒有希望得到快樂和滿足呢?如果是快樂和痛苦出在我們的思路上,出在我們對事物的認知上,我們並沒有找到快樂的因和痛苦的因,我們努力的一起首就是錯的話,那肯定最後得不到啦!所以師父在這地方讓我們停一下、讓我們警惕一下什麼呢?方向!思路的方向——也即人生的方向!如果那麼想離苦得樂,一定要知道什麼是苦、什麼是樂,然後才開始行動比較正常吧!所以這件事是否在學佛、在開始探討離苦得樂這個問題的時候,第一步應該擺在心裡想一想的?<span style="color:rgb(42, 100, 150)">&nbsp;[03′33″]</span></p>
<p style="text-align:justify">  那我再反問大家:我們有時間把這個問題擺在心裡想嗎?再問:有能力擺進去嗎?有位置嗎?有空閒嗎?心裡被很多東西充滿,有一個小小的空隙擺進去無明和苦樂等等這些問題,有沒有時間想?如果師父沒有給我們講《廣論》、沒有這麼多的研討班,我們有沒有時間想?大家每週辛辛苦苦不管從多遠坐車呀怎樣怎樣,都去研討班裡學習,花三個小時。還有的人輪流參加很多班,從週一到第七天全部都在參加班,他學不夠,各個次第的班他都參加,都在想這個問題吧?<span style="color:rgb(42, 100, 150)">&nbsp;[04′23″]</span></p>
<p style="text-align:justify">  所以,廣論班是什麼地方呀?比如現在我們聽聞的時候,就是在這個五濁的塵世中,在這忙亂、匆促的腳步聲,在這個時代非常非常喧雜的各種聲音中,擺上這一本《菩提道次第廣論》,然後傾聽師父說法的聲音,讓我們得到那一方寧靜。哪怕是很短,也要思考一下:無明是什麼?苦樂的問題是什麼?我們必須給自己贏得時間去思考這個問題,因為這個問題真的很重要!所以師父說:「第一步要擺在心裡。」一定要擺進去,不要沒有時間擺進去!而且一定要想了又想,然後反覆地探索才成。難道不是嗎?<span style="color:rgb(42, 100, 150)">&nbsp;[05′13″]</span></p>
<p style="text-align:justify">  所以想一想:如果沒有廣論班、沒有僧團,我們哪有時間去探討這個問題?沒有時間去觸及生命最重要的問題,難道不悲哀嗎?那麼現在我們擁有這樣的時間、擁有這樣的因緣,而且這麼多好朋友都在一起討論,難道不應該珍惜嗎?每個人是有每個人的習氣和毛病,有你看不慣的地方,就像你身上也有別人看不慣的地方,大家都相忍著在一起組成一個班,然後互相觀功念恩、互相隨喜,堅持了很多年。所以想一想:從最初什麼也不懂,對「菩提道」全都不懂的狀態下,現在我們可以讀廣傳、傳承祖師傳、各種傳記,甚至都學到五大論了,都開始上攝初班、攝中班了!&nbsp;<span style="color:rgb(42, 100, 150)">[06′07″]</span></p>
<p style="text-align:justify">  如果沒有師父的步步引導,我們如何在這樣煩亂、繁忙的一生中,能有這樣的時間來讀經典哪!什麼是經典呀?經歷了世世代代的更替、永遠閃耀的人類智慧,就是那些智者的頂嚴留下來的叫經典啊!我們哪有時間會遇經典?而且有一位高僧一句一句講給你聽,還怕你心裡有反感,想各種辦法,就像一個慈母餵一個生病的小孩一樣,想各種辦法——哎!包個糖衣,然後怎麼樣給你吃點好吃的。<span style="color:rgb(42, 100, 150)">&nbsp;[06′45″]</span></p>
<p style="text-align:justify">  像我小時候是不願意吃藥的,我每一次吃藥都哭,絕對不吃藥!我爸就把藥放在嘴裡,說:「你看啊!這是甜的哦!」然後我爸就先吃。所以我每次吃藥,我爸爸都吃很多藥,然後我才能吃下一粒。我爸爸把那個藥含到嘴裡,我就去扒我爸爸的嘴巴說:「你到底是放在舌頭底下,還是嚥進去了?」我一定要把我爸爸的嘴翻遍了,發現藥確實是嚥進去了,然後我才會吃下一粒。所以那就是幼稚的孩童啊!根本不了解父母的心啊——為了吃藥治病。佛菩薩就像父母一樣,就是想要照顧我們的法身慧命,想盡辦法引領我們走無上菩提之路!這個深恩啊!你我豈能忘懷呀!&nbsp;<span style="color:rgb(42, 100, 150)">[07′32″]</span></p>
<p style="text-align:justify">  從前一段講宗大師的功德,說他是一個絕頂聰明的人,到這一段提出了無明。那我們學了這兩段之後,到底應該注意什麼呢?可以想一下:那麼絕頂聰明的人,廣學教理去做什麼了呢?絕頂聰明的人應該知道做最重要的事情——就是離苦得樂的第一步,乃至最究竟的一步。那麼為什麼要依止各大善知識廣學?為什麼要廣學呢?他廣學的經論跟苦樂有沒有關係呢?離苦得樂一定要廣學嗎?那麼絕頂聰明的人,難道不是很容易就獲得嗎?為什麼還要廣學呢?那麼這樣的廣學,為現在的你我樹立了一個什麼樣的榜樣呢?這樣的廣學針對離苦得樂有幫助嗎?甚至是唯一的嗎?廣學就可以破除無明嗎?是破除無明的第一步嗎?<span style="color:rgb(42, 100, 150)">&nbsp;[08′52″]</span></p>
<p style="text-align:justify">  我是在講宗大師的示現。學經典和苦樂有沒有關係?學經典究竟可不可以去除痛苦,可不可以得到究竟的快樂?是不是離苦得樂的途徑?如果是途徑的話,我們拿多少時間來學習教典呢?如果說它是途徑,為什麼它是途徑呢?因為痛苦如果源於顛倒的認知、源於錯誤的看法,那麼把錯誤的看法顛倒過來的那個就是最重要的。那麼誰的語言、誰的勸說、誰的話語、誰的經典,可以讓我們把心中的錯誤改變呢?說:「法、佛法!」法有什麼樣的作用?能不能改變我們?能不能救護我們?法的定義哦!改變我們什麼呢?一定是改變苦的,然後把沒有得到的快樂得到,這叫改變。救護,救護是什麼意思?如果活得好好的,救我幹什麼呀?一定是從苦的地方救走,救到樂的地方,所以這是法的特質。<span style="color:rgb(42, 100, 150)">&nbsp;[10′14″]</span></p>
<p style="text-align:justify">  那麼宗喀巴大師廣學多聞的一定就是法,學了這樣的法,就是要用來離苦得樂的。所以師父講了無明,也是要我們用來離苦得樂的,不僅僅是講個道理。雖然看起來像道理,但是你把這個道理實踐了之後,它就是力敵千軍的離苦得樂的那個力量。<span style="color:rgb(42, 100, 150)">&nbsp;[10′37″]</span></p>
<p style="text-align:justify">  短短的兩段,師父在這裡顯示了「法」的力量。大家要在我們的生命中認知到,善知識最深的恩德就是為我們說法。那麼法對我們生命改變的力量到底是什麼?它的定義就是改變和救護。改變什麼?痛苦的現行,乃至我們趣向痛苦的方向都一併改變。救護什麼?把我們從各種非常可怕的悲傷、焦慮、失落、渺茫、孤獨感等等,這是情緒;還有對死亡的恐怖、對病的恐怖、對失去親人的恐怖、對失去愛的恐怖、對失去錢財的恐怖......,太多恐怖了!救什麼呀?救我們於各種怖畏之中。還有人害怕名聲變不好——叫「惡名怖」,太多怖畏的人生!所以要把我們從那些怖畏之處拯救出來的,就是「法」!「法」有這樣的功德。所以善知識才為我們說法,大家才雲集起來一起聽法、討論法,這是一件多麼有意義的事情!所以大家一定要堅持學下去,要把這件事擺在生命的一個相當重要的位置。是不是應該這樣子呢? [12′16″]</p>
<p style="text-align:justify">在聽下一段之前,請大家把我們上一次研討的這一小段背一下!因為我覺得這一小段非常非常地重要,所以我常常要求大家能夠背一下,或者至少你非常地熟練,最好背一下!現在請大家背給我聽聽!&nbsp;<span style="color:rgb(42, 100, 150)">[00′22″]</span></p>
<p style="text-align:justify">  (法師背:我為什麼要提這個事情?這個地方,大家停一下,讓我們自己做個警惕:我們現在在這個地方,來幹什麼?修學佛法。你為什麼要修學佛法?說目的我們已經了解了,那麼為了達到我們去苦得樂的目的,我們有一個認識,說我們所以得不到的原因,因為對於很多事情,沒有正確的認識,一個專門名詞叫「無明」。換句話說,我們在無明當中,我們的概念,我們的執著,我、我、我!這個東西都是錯誤的根本,痛苦的根本在這裡。唯有一個有正確認識的人,指導了你,你了解了你的錯誤,那個時候心裡面想排斥這個錯誤。不但如此,還要進一步地認識怎麼樣才是正確的,然後照著正確的去做,那個時候,你才能夠轉化得過來。這個道理很清楚,這個道理才是我們真正第一步應該擺在心裡想一想的。)&nbsp;<span style="color:rgb(42, 100, 150)">[01′51″]</span></p>
<p style="text-align:justify">  背得還是滿準確的,一個字都沒錯,對不對?一定要把它記熟喔!好,我們現在一起來聽下一段。&nbsp;<span style="color:rgb(42, 100, 150)">[02′01″]</span></p>
<blockquote>
<h4>  所以我們記住,我們現在跑到這地方來學佛,我想沒有一個人不同意,大家都會這樣想。不過這地方呢,我們進一步地檢查一下,實質上的內容,我們跑到這裡來,是不是真的學了佛了?這是個大問題。以我自己的經驗來說,我們來的目的是學佛,我們也這麼說,可是實際上我們學的是「我」。欸,你們會想,為什麼講學的是「我」?我現在仔細分析一下,你們也可以把它看成道理來看,也可以把它看成功學佛來看。假定你把它看成學佛來看,你就受用了;假定你只是把它聽作道理來聽,那我也在這兒浪費,你也在這兒浪費。那麼下面我就說,我們往往跑到這地方來,我覺得,我覺得我要這個樣走,我要這個樣學,我要這個樣學。是不是大家都有這樣想法?我想有。本質上面,應該就是說我有這樣意志,要學到什麼。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[03′01″]</span></h4></blockquote>
<p style="text-align:justify">  提一個問題,不知道這樣很快地聽一遍,大家會有多少印象?以前在廣論班的時候,我們常常一遍沒聽清楚,然後再聽一遍、再聽一遍。有的時候聽了七遍,還有同學有一個觀點聽不到,後來最多的時候聽十二遍,還有聽不到的!是器漏嗎?還是專注力不夠?重複這麼多遍,應該專注力還是滿夠的,但是總會忽略掉一些什麼。&nbsp;<span style="color:rgb(42, 100, 150)">[03′36″]</span></p>
<p style="text-align:justify">  師父在這一小段的開頭說:「<strong>所以我們記住</strong>」,注意!他是根據前邊來的,「要把這個道理第一步擺在內心裡想一想。」然後「<strong>所以我們記住</strong>」,注意!記住什麼呀?「<strong>我們現在跑到這地方來</strong>」,兩個字——「<strong>學佛</strong>」,師父說:「<strong>我想沒有一個人不同意,大家都會這樣想。</strong>」大家都認同:對,我們跑到寺院是來學佛的!至少我們跑到廣論班的課堂上,是來學佛的!&nbsp;<span style="color:rgb(42, 100, 150)">[04′17″]</span></p>
<p style="text-align:justify">  但是問大家一個問題:為什麼師父說:「所以我們記住」呢?為什麼還要說:「要記住」?比如我們小的時候,剛開始上學校的時候,可能父母親會提醒:「記住喔!今天你要上學,你不能去玩哦!」而且有的時候會說:「你記住,要背書包喔!」因為有的小孩自己就走了,他不知道要背書包。所以師父在這裡提出:「我們記住,我們跑到這地方來是來學佛的。」是不是有時候我們會忘記我們是來學佛的?有這種可能性嗎?忘過嗎?&nbsp;&nbsp;<span style="color:rgb(42, 100, 150)">[05′01″]</span></p>
<p style="text-align:justify">  那麼忘了的時候,到這兒來做什麼呢?&nbsp;<span style="color:rgb(42, 100, 150)">[05′08″]</span></p>
<p style="text-align:justify">  很多年前吧,那個時候提到一個供養的概念。其實大家能夠遇到《廣論》、學《廣論》,都是非常有善根的,但聽說有些人學到中士道的時候就學不了了,還有的人學到什麼地方就會脫班了,根本問題其實不是外在的什麼大事情,只是缺乏資糧。如果在這個廣論班開始的時候,就注意到認真地集資、淨懺,其實不管學到中士道、學到上士道,甚至很多輪你都不會離開這個班級,你只會在這個學習的進程之中。那時候我就強調了供養三寶的重要性。&nbsp;<span style="color:rgb(42, 100, 150)">[05′52″]</span></p>
<p style="text-align:justify">  有一次師父就跟我說:「你要再說一下供養三寶的重要性。」那時候師父是希望我對僧眾說。我說:「師父,這個概念已經講過了,好像前多少天剛講過!」然後師父就跟我說:「真如啊,大家會忘的呀!所以要一再地講呀!」其實聽完師父那樣講的時候,我很震撼,也很慚愧、很感動。因為就一個供養三寶的概念,比如說佛前供水、每天禮佛,如果有可能的話,再供鮮花。就佛前供水這件事,我記得我們在廣論班推的時候,就是七杯水嘛!還要大家交一個單子,每天拿那個單子給我看,每天供水的打勾給我,像小學生交作業一樣。沒供的就打叉,然後我就問:「你今天為什麼沒供水呀?」說:「忘了!」&nbsp;<span style="color:rgb(42, 100, 150)">[06′53″]</span></p>
<p style="text-align:justify">  所以我們來學佛的這件事,有可能會忘!所以在這裡邊師父說:「我們要記住。」記住了這個大前提,大家都同意是來學佛的,才能夠進一步檢查:「實際上,我們在這裡是不是真的學了佛了?」這句話說完了之後,注意哦!緊接著師父說:「<strong>這是個大問題。</strong>」&nbsp;<span style="color:rgb(42, 100, 150)">[07′21″]</span></p>
<p style="text-align:justify">  那我現在反問一下:我們生命裡的大問題有多少呢?你自己可以悄悄排序一下。現在就可以想一下最大的問題是什麼呢?人際關係問題?還是健康問題?還是最近心情不好的問題?還是最近某人說話,或者某件事傷害了你的問題,在心裡邊很痛一直過不去,這是個大問題?還是你一直等著一個人跟你道歉,他沒有道歉,這是個大問題?當然也有可能被別人借了錢沒還,這也是個大問題。但師父在此處指出了一個大問題就是——我們是不是真的學了佛了?這是個大問題。注意哦!又是排序。&nbsp;<span style="color:rgb(42, 100, 150)">[08′21″]</span></p>
<p style="text-align:justify">  接下來師父就說:「<strong>以我自己的經驗來說,我們來的目的是學佛,我們也這麼說,可是實際上我們學的是『我』。</strong>」注意!那個「佛」字變成「我」了。然後師父說:「欸,你們會想,為什麼講學的是『我』呢?現在要開始仔細分析了。」在分析之前,師父說不要把它看成道理。也可以把它看成是學佛來看,假定把它看成學佛的話就會受用;假定把它聽作道理來聽聽,師父說:「那就是一種浪費。」師父說他自己浪費、大家也浪費。&nbsp;<span style="color:rgb(42, 100, 150)">[09′05″]</span></p>
<p style="text-align:justify">  注意哦!「以我自己的經驗來說」,師父說這句話的時候,因為我以前跟師父在學習的時候,就常常跟師父講:「師父,您《廣論》講得太好、太好了!」師父都常常說:「哎呀!我很慚愧呀!我很慚愧呀!我只是把我做錯的經驗拿出來告訴大家呀!」可以說在《菩提道次第廣論》上,說法者那種謙虛地說:「我不如你呀!」很謙虛地為大家如法講聞的德相,每次都讓我憶念到這一點。所以你看,此處又來了!以後在這本論中,很多時候師父都會這樣。&nbsp;<span style="color:rgb(42, 100, 150)">[09′48″]</span></p>
<p style="text-align:justify">  注意哦!這個經驗哦!這個經驗,雖然師父常常講它是一個失敗的經驗,但是有多少人經歷過這個經驗,能夠認識到——我是在學「我」呢?那學「我」的話,下面就出現問題了。什麼是「我」?什麼是「我」呢?假如僧團裡大寮的組合,比如這班同學一個煮粥的方式,大家到僧團裡來之後,說:「我媽說是這麼煮的。」他說:「我爸說是這麼煮的。」大家都會從父母那裡學到是怎麼煮飯、煮菜的,每家煮飯、煮菜的經驗或多或少都不同。如果大家光是在討論這個怎麼煮的次第上,或者用什麼東西煮,這個過程就討論得爭論不休的話,那早齋、午齋就不用吃了。所以肯定大家要在這個完全經驗不同的狀態下,採取一個統一的方案,僧團裡才能吃上早、午齋嘛!所以在這種狀態下,就要去除掉我的經驗的部分,比如「我是怎麼樣的」,大家找出一個共同點,然後開始煮飯。&nbsp;<span style="color:rgb(42, 100, 150)">[10′59″]</span></p>
<p style="text-align:justify">  還有一個就是念誦。念誦,也是每個人都有每個人的韻律、每個人的高低音等,但是聽到維那一起腔之後,大家開始隨著維那去念的時候,每個人必須以維那念的為準,調整自己的速度、高低音等。要把自己的聲音合到這個大的梵唱之中,所有的人在其中,才會很愉悅、很舒適地做完整體的念誦課程。&nbsp;<span style="color:rgb(42, 100, 150)">[11′28″]</span></p>
<p style="text-align:justify">  如果在這個整場過程中,不知道是怎麼念的,然後就開念的話,那就是我了!我很多年前去五臺山求法,進入那個大殿裡去念。因為當時有點聽不懂維那法師念的,他說話我也聽不懂,不知道他是哪兒的口音。他一起腔之後,我就用那種非常尖的尖聲開始跟著念,在整個出家人的梵唱之中,高八度飄在上面念。因為低音好像我發不出來,因為我是一個孩子,發不出來,我就發很高的音。當時也有一個小男孩,他八歲,我倆就在整個旋律中飆高音飆在上面,就這樣飆了幾天。結果有一天維那在上面講話,講了半天,我在想:「好像現在應該開始念經了吧!」結果旁邊那個出家人就回頭看了我一眼,說:「小居士,就是在說你呢!」因為聽不懂他說話嘛!我在想說:「為什麼要說我?」他說:「你念的跟大家都不一樣!你唱的。」可是我非常非常地賣力氣,我覺得我已經用全部的精神在唱,但是實際上打亂了人家課誦的那個規矩。&nbsp;<span style="color:rgb(42, 100, 150)">[12′41″]</span></p>
<p style="text-align:justify">  後來我知道了之後,我就不能放開嗓子用那麼高的音去唱。再後來我知道:「哦!要把我的聲音合到那裡邊去唱。」結果下一次我就改了。改了之後,維那法師就沒有說我了。我現在也不記得維那法師長什麼樣子,也不知道他是誰。在大眾中只是盡情地把心投進去了,但是過分地強調自我的風格,忘記了緣一個整體的感覺。 [13′08″]</p>
<p style="text-align:justify">  接下來師父說到:不幸的是,我們所以來真正的原因,有一個最根本的問題就是——我自己是誰不認識,不知道!所以叫無明。注意哦!接著聽一段:</p>
<blockquote>
<h4>  可是不幸的是,我們所以來,真正的原因,就是有一個根本問題——我自己不認識我是誰,所以叫作無明,所以叫作無明。我們的情緒,起心動念,以及我們的知見,無非都在錯誤的認識當中。今天我們看了一本書,佛告訴我們這樣,啊,懂了、懂了!我真的懂了嗎?沒有,沒有!然後我們是懂了一些什麼?就是懂了我們對這一個文字的概念,這個概念不一定是佛要指給我們看的。這個內容很重要!我現在隨便來講一個實際上的例子,我們常常說的:「哎呀,這個佛法裡面講空的呀!你要得看破啊!你得放下。」一點都沒錯,你只要能夠看破,看破嘛,你就放下;放下嘛,你就自在。說:「欸,對、對、對!一點都沒錯。」結果你真的看破了嗎?你真的放下了嗎?你真的自在了嗎?我想仔細地檢查,不能說沒有,但是絕對沒有真的做到。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[01′34″]</span></h4></blockquote>
<p style="text-align:justify">  在上一段,師父說到我們想要學佛,但是以師父自己的經驗來說,目的是來學佛的,但實際上都走成學「我」了。下面有兩段說:「我們跑到這個地方來,我覺得我要這樣走、我要這個樣子、我要這個樣子學。」接下來師父說:「<strong>我們的情緒,起心動念,以及我們的知見,無非都在錯誤的認識當中。</strong>」注意哦!這是第一盤的 B 面,師父就再一次提到了無明這個問題。再一次哦!這無明到什麼程度呢?「情緒,起心動念」,念頭!「以及我們的知見」,就是我們對一個問題的看法,「無非都在錯誤的認識當中」,所以叫無明。&nbsp;<span style="color:rgb(42, 100, 150)">[02′34″]</span></p>
<p style="text-align:justify">  這個一開始概念可能很難理解,聽起來變成全是錯的。因為我們不能逃開情緒、不能逃開起心動念、不能逃開知見。如果這全是錯的話,怎麼生活呢?怎麼生活?就生活在無明當中呀!聽到這裡恐慌嗎?如果是這樣的話,豈不是鋪天蓋地了嗎?都錯了!都錯了——什麼錯了?注意哦!它還是有一個下腳處的。不是說:「啊!這一片全是錯的!」還是有個下腳處的。肯定是有一個當下對自我的認知——就是當下的起心動念的觀察,當下我們對於這一個事物的看法,乃至我們的情緒,還是有個下手處的。因為如果無明要是那麼可怕,遮天蔽地的像黑暗一樣蓋著我們的話,我們豈能夠去尋覓到智慧的黎明呢?乃至那種空性的燦爛光芒呢?&nbsp;<span style="color:rgb(42, 100, 150)">[03′56″]</span></p>
<p style="text-align:justify">  這麼厚重、這麼普遍的一個無明的狀態,實際上平常是很少能夠感覺得到的。能這樣講的也不多吧!平常起心動念、情緒乃至認知,都完全是被無明所攝的,其實這就是一個苦輪啊!苦的輪轉就是這樣的。&nbsp;<span style="color:rgb(42, 100, 150)">[04′18″]</span></p>
<p style="text-align:justify">  以前我有讀到一段師父的日記,師父在日記裡說了跟這一段幾乎是一模一樣的話。師父說:「境無是非、好惡。以無明相應的愛染,就成了種種貪、瞋、痴的惡業;以正知見相應的善法欲、正信、正解,就會集成一個遠離生死的業,就會隨順出世道的道業。那麼這個出世道的道業,要一切全靠善知識的引導、垂示。」垂示什麼?正知見、正方便,而且下面還有一條——「一切要全靠自己依教奉行也」。後面師父在日記裡寫了兩個字,叫:「勉之!」後面一個嘆號。&nbsp;<span style="color:rgb(42, 100, 150)">[05′09″]</span></p>
<p style="text-align:justify">  所以在這個無明的問題上,其實談到無明就要談到當下的起心動念,我們對一個事情的認知。注意哦,注意!師父說:「境無好醜,損益在人。」鎖定我們的心。我們的心對外界是怎麼認知的,有兩個方向:一個是無明的方向,一個是正知的方向、出離的方向、菩提心的方向、空性的方向。而無明的方向是苦的,朝向空性的方向就是樂的。就是無限生命的兩種方向——無限的苦和無限的樂,兩個方向。這樣子講完了!然後師父說:「佛告訴我們這樣、這樣......」,注意哦!「懂了、懂了!」這是我們常常會有的一種感覺呀!自我的感覺。然後師父說:「我真的懂了嗎?沒有!」&nbsp;<span style="color:rgb(42, 100, 150)">[06′02″]</span></p>
<p style="text-align:justify">  那我們感覺懂了,是懂了一些什麼呢?師父說就是我們對文字的一些概念。那麼這個概念是不是佛要指給我們看的呢?這個內容是很重要的,接著下面就講了看破、放下、自在嘛!說:「能不能看得破?看破了什麼?放下了什麼?」用這個例子來檢查一下,我們到底懂了嗎。&nbsp;<span style="color:rgb(42, 100, 150)">[06′27″]</span></p>
<p style="text-align:justify">  在這一段,很多研討《廣論》的同學可以自己想一下,現在我們已經是學師父的手抄第幾輪了?尤其是學《廣論》越來越久的同學,自己的心態要拿這個法鏡照一下。比如學到某一段的時候,會不會覺得:「啊!這段我懂了,我早都看了!」或者雖然沒有現起我懂了的狀態,至少會比其他同學懂吧!甚至我對於師父的帶子熟到師父說上一句,我知道下一句師父會提什麼觀點,我都知道!那會不會在很多同學中間,有一種自己懂了的感覺呢?&nbsp;<span style="color:rgb(42, 100, 150)">[07′06″]</span></p>
<p style="text-align:justify">  如果懂了的話,師父說我們對文字的一個概念——是不是真的懂了?懂了的層次有多深?我們會同意師父的這個觀察嗎?因為這樣觀察可能有點受不了,好像我們都沒懂;如果沒懂的話,是不是都白學了呢?如果白學了的話,那太痛苦了!所以還是懂一些吧!那懂一些到底懂了什麼?如果前邊學了很多遍懂了的話,這一遍學是不是發現了一些沒懂的?在以前懂了的過程中,現在又發現沒懂的,那以前的懂了到底是不是懂了呢?&nbsp;<span style="color:rgb(42, 100, 150)">[07′45″]</span></p>
<p style="text-align:justify">  所以每次朝前走,都會發現過去沒有看到的風景,雖然這一本論我們學二十年,但其實要生生世世這樣學下去。它的內容之廣博、之深刻!它涵蓋五大論,甚至是佛所說的經典都可以攝為這三主要道,它是非常廣博而深邃的一本論典。為什麼講深邃呢?因為有講空性。空性深嗎?業果深嗎?還有我們的心深嗎?很多東西都看不到,所以要一遍一遍地學。你說:「二十年你還學一本論啊?」二十年學一本論是很厲害的,始終如一地學!學會了嗎?學懂了嗎?我這些話也是問我自己的,也是常常提醒自己的! [08′40″]</p>
<p style="text-align:justify">  提個問題哦!乃至「文字」的概念懂了嗎?有的時候文字的概念也是沒懂的。真正地懂了文字、懂了教理,我們自然就會拿著這個教理來照自己的心。像有一段師父的日記,說:「來此又時日,以所習道次第反觀自己,深感不對。不對處是:不以法自淨,而以法繩人。目前務必以戒自心,自己做到了,方好濟人也。」「濟」,是濟度天下的濟。&nbsp;<span style="color:rgb(42, 100, 150)">[00′55″]</span></p>
<p style="text-align:justify">  所以為什麼要學這些教理呢?為什麼要學呢?一定是拿所學的來反觀自己。注意!反觀自己的身、語、意,反觀自己。反觀自己一定會看到什麼?看到那個不對的東西。不對的是什麼?法的方向一定是自淨其意的,不是以法來約束別人的。要警戒自心!而且師父說:「自己做到了,方好濟人啊!」&nbsp;<span style="color:rgb(42, 100, 150)">[01′30″]</span></p>
<p style="text-align:justify">  在師父的日記中,幾乎篇篇滲透了強烈的、自我精進的這樣一個氣息呀!滿篇都是這樣的。所以在講《廣論》的時候,我有時候倒覺得師父有一些東西講得雲淡風輕,可是在他的日記裡都是極度深刻的。就是每一步都像一個小學生一樣,非常非常地紮實和認真地做功夫,沒有一點點花拳繡腳的跡象,一點都沒有!他非常深刻地以《菩提道次第廣論》的法理來明照自己的心。其實師父就是這樣做的,一步一個腳印這樣做的,包括他作課誦,包括他見誰了、說什麼。還有師父教我很多事情,師父也把它寫在日記裡邊,然後我再重看,每一篇、每一篇師父都在策勵自己。你看到的就是非常非常虔誠的一個佛陀的弟子,非常地虔誠!&nbsp;<span style="color:rgb(42, 100, 150)">[02′42″]</span></p>
<p style="text-align:justify">  所以在師父的日記中,看不到一絲絲他覺得對佛法懂了的這種感覺,每天都是拼命地策勵自己。那我們會不會對佛法有受用?比如師父從來不間斷誦《般若經》,師父誦《般若經》有受用的時候,會很歡喜地感恩上師三寶、護法的加持,從來沒有說這是自己領會的。就像《般若經》上所講的「承佛威力」,都是這樣感恩佛陀。&nbsp;<span style="color:rgb(42, 100, 150)">[03′14″]</span></p>
<p style="text-align:justify">  說:「佛法裡邊講的空,你就要看破、要放下。」這點我就跟所有的老學員們探討一下,也許新學員也用得上吧!就是能不能放下:我們學了二十多年了,不能再以一個像初心那樣虔誠的狀態來學了,這點能看破嗎?在此處能看破嗎?還有包括我自己,我自己現在是在給別人講法嗎?還是我在重新地學習。是學生嗎?應該是個學生!我們在一起學習。二十年過去了,或者多少年過去了,我們看破了什麼?每一次懂了,過一段時間發現:哎呀!還有更不懂的;再看一下師父的手抄,哇!又有不懂的。怎麼覺得這個手抄好像越來越廣、越來越深,你越走近它的時候,欸,它好像後退一樣,就是覺得到底有多少未明了的深意在等待著我們去探討。&nbsp;<span style="color:rgb(42, 100, 150)">[04′26″]</span></p>
<p style="text-align:justify">  所以班長啊,可以放下自己的權威嗎?可以放下自己在班裡好像對《廣論》很權威的那種感覺嗎?像一個初心的小學生一樣,老老實實地學習。甚至剛剛進班的那些同學、剛開始學的,有可能他們會比我們學得好喔!因為這條路不一定越晚來的他會學得不好,有的時候他會像一匹黑馬,一下子衝到前面。&nbsp;<span style="color:rgb(42, 100, 150)">[04′52″]</span></p>
<p style="text-align:justify">  所以抱持著一個真的好好跟佛學、跟師父學、跟所有廣論班的同學學,乃至跟所有眾生學習的心,抱持著這樣的一個心,就不會動不動被「懂了、懂了!」這樣一個東西障礙住。而且常常覺得自己懂了,久了會不會生起驕慢?一旦生起驕慢之後,學得越久的人就越驕慢。資格老呀、什麼都看了啊、什麼都知道了啊!唯有什麼不知道?唯有心地不知道啊!這樣的話,可能就成了師父在此處所破的那種學習狀態。&nbsp;<span style="color:rgb(42, 100, 150)">[05′32″]</span></p>
<p style="text-align:justify">  所以越久的人越容易發生懂了,然後就變成忽略。在聽法的時候,心就非常浮浮地放在上面:「啊,我聽了,知道怎麼樣!」就沒有恭敬心了喔!沒有認真的一種狀態。如果沒有恭敬心、沒有認真的一種狀態,如何去體會字裡行間的深意?如何去體會在此處所指的內心相狀是什麼?我們怎麼會發現我們錯的、無明的部分呢?&nbsp;<span style="color:rgb(42, 100, 150)">[06′03″]</span></p>
<p style="text-align:justify">  師父在這裡邊就問:「<strong>結果你真的看破了嗎?你真的放下了嗎?你真的自在了嗎?我想仔細地檢查,不能說沒有,但是絕對沒有真的做到。</strong>」關於「仔細檢查」這幾個字,在聽嗎?仔細檢查,怎麼檢查呀?比如在聽一堂廣論課之前,你的聽聞軌理要不要做?有聽說過一個日本的劍道大師——宮本武藏嗎?他說:「勝負決定在劍鞘之內。」劍還沒有拿出來,那時候就決定勝負了。這一節課上得好不好,源於我們的準備、我們的發心。我們之前的準備很充分,這節課就會撈到大量的、很珍貴的法義;如果浮浮泛泛的一個態度,輕率地就開始聽了,沒有一個殷重、恭敬的心,那我們可能就浮浮泛泛了這節課。&nbsp;<span style="color:rgb(42, 100, 150)">[07′21″]</span></p>
<p style="text-align:justify">  所以聽聞軌理還在乎嗎?老學員還在乎嗎?記得我們一開始學習的時候,哇!聽聞軌理要特別特別認真地去準備,因為這《廣論》太深了,萬一都聽不懂怎麼辦?我們只是害怕我聽不懂怎麼辦?不會常常生出:「啊,這又懂了、那又懂了!」不會生出來這樣的心。那個時候是唯恐不懂、唯恐準備不周,所以在上課之前都拼命地思惟聞法勝利,再把自己的續流好好地安在——好像坐在一個說法的課堂上等著師父的身影出現。懷著那種非常恭敬的、期待的、萬分珍惜的心,不想忽略過他講的任何一個字。同學們還有沒有這樣的初心啊?自己好好地向內心檢查一下。如果發現自己的心都沒有當初那麼努力和虔誠了,那能說我們懂了嗎? [08′26″]</p>
<p>6P155R2 ~ P185R4</p>
<p>45A 27:02 ~ 46A 16:18</p>
<p>[45A] 27:02~29:27</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[27:02] 6P155R2</span></p>
<p><strong>法功德者。謂由敬佛而為因緣,應作是念,佛具無邊功德者,是由證修滅道二諦,除過引德,以為自性,教證二法,而得生起。</strong></p>
<p>因為我們由於前面知苦、求救,找到唯一可救的是佛!然後呢說佛有這麼大的功德,啊!一心皈投、景仰。那麼我們就想:佛有無邊功德,他這功德怎麼來的?說由於修道、證滅,這個兩樣事情。然後呢把所有的過失淨除,所有的功德都圓滿,經過「教」的認識,如理去「證」而獲得的,是這樣的!就像下面引證,經上面,</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[28:08]6P156L5</span></p>
<p><strong>如《正攝法經》云:「諸佛世尊,所有無邊無際功德,從法生起,受行法分,法所化現,法為其主,從法出生,正法行境,依於正法,法所成辦。」</strong></p>
<p>下面就是引那個經,簡單這個道理,就是上面所說的,十方三世一切諸佛的無量無邊的功德,怎麼來的啊?從法生起的,他接受佛法、照著佛法去修行,然後呢分分增長而成就的。說「法所化現」,這個是主要的是依為法,然後從法出生,這也是他修行正法,依於法,然後呢最後由於這樣而成辦所有一切功德,那個時候才成佛。哦!由於你敬佛、皈依佛,自然而然哪,同樣地會皈依到法。那麼這個地方,休息一下,下面我們繼續。</p>
<p>[45B] 00:00~29:21</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[00:05]</span>6P157</p>
<p>上面我們已經把它佛、法兩個說了一下。那麼現在呢再下面「僧功德」。</p>
<p><strong>僧功德中。</strong></p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[00:19]</span></p>
<p>這個僧的功德,所謂「僧」哪,</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[00:21]</span></p>
<p><strong>正謂諸聖補特伽羅,</strong></p>
<p>就是「補特伽羅」。這個地方關於「僧」,平常我們一般有四種僧 ─比如說《智度論》上面,然後呢《地藏十輪經》上面,《瑜伽師地論》上面,它都有不同的名字;名字雖然不同,大別都差不多。我在黑板上寫的兩類,前面那個所謂勝義僧、世俗僧,那個是出在《大智度論》上面的;下面這個地方,勝道沙門 ─這個是「沙門」兩個通下面 ─說道沙門、活道沙門、壞道沙門是出在《瑜伽師地論》上面的。另外還有呢,《地藏十輪經》上面的,另外那個《十誦律》上面還有一個叫別眾僧,所以列五種。不過現在一般來說起來,這個別眾僧呢,那是佛世的時候,這個我想大概我們都了解,簡單地說一下。所謂「勝義僧」,或者是勝道沙門,那就是有修、有證的那些聖者;那麼「世俗僧」呢,就是雖然沒有證得,可是如理、如法按照羯磨,然後這樣去做的清淨的凡夫。那麼這個說道沙門當中包含了第一、第二,有勝義,也有世俗,這樣。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[02:10]</span></p>
<p>那麼「啞羊」跟「無慚愧」兩種呢,那就很糟糕。這個啞羊、無慚愧有兩個不同的經論說法,恰恰相反:一個,是說他自己不知取捨,也不曉得說淨,也不曉得什麼,就是像啞羊一樣,一生這樣糊裡糊塗地過去掉了,這一種叫啞羊;還有無慚愧呢,雖然他知道,但是不慚愧,這個這兩類。那麼總之這個啞羊、無慚愧,那個都是墮落的,這個叫壞道沙門,壞道沙門。活道沙門呢,就是如法去做,然後呢這樣認真地,還是滿認真地去做,這個詳細的情況,在這個論上面。那麼這個地方,正告訴我們的就是「補特伽羅」,也可以說下面的幾類就是隨順。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[03:13]</span></p>
<p>所以《地藏十輪經》上面特別告訴我們,真正的這個經是指示我們,說作為一個修行人、出家人應該怎麼樣做。對我們普通一般人來說,我們不是拿這個標準去衡量別人。所以《地藏十輪經》上面特別說,你別看他是一個污道沙門哪!哪怕他是十惡不赦、破了戒,穿了這件衣服,你一個在家人,你只要能夠至誠恭敬地供養他,你還有功德。他又舉了個比喻,說再破爛的這個金器,再破爛的,哪怕那個金器裝了髒東西、臭東西,那個金器本身可是金器哦!這樣。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[04:00]</span></p>
<p>這一點,那麼對他們在家人尚且如此,現在如果說我們出家而修學的人,我們應該比他們高明一點哪!對不對?對在家人尚且要求這麼高的條件,那我們如果自命為出家修行的人,我們更不要隨便地、輕易地是非我們的同道,毀謗,萬萬不可以!處處地方注意,你之所以高,高在哪裡?因為你能夠如法行持嘛!他現在在家人要求這麼低的標準,你如法行持當然你的標準應該高一點嘛!你了解了這一點,這一種諍論、是非自然沒有了。有的是什麼呢?如果是你跟他相應的,那是出自善心地去規勸,錯誤 ─錯誤地方幫助人家,使他改惡向善。如果能夠這樣做到的話,啊!那個僧團一定和睦,佛法一定興旺,這個很了解的。然後呢對我們做的人來說,當然積聚無邊功德嘛!這是順便一提。現在我們看僧的特質。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[05:08]6P159R3</span></p>
<p><strong>此亦由念正法功德,由其如理修行門中,而為憶念。</strong></p>
<p>哦!那是為什麼來的呢?就因為他前面因為皈佛、敬佛,所以想到佛是由於如法修證而來,這個法有這麼好處,所以那我既然要學,我也要跟他一樣地如理修行。嗯,這樣的,所以這個僧是這樣的!那麼以這個方式我們去憶念。如果我們能這樣憶念的話,那就簡單了。是的,我們要皈敬佛,佛之所以成佛,是修行法;修行法的過程當中是僧哪!啊,我們現在也要去努力啊!你能夠想到這一點的話,你自然會覺得如法努力啊,是不會拿了這個法,去自己傷害自己。所謂拿了法自己傷害自己是怎麼講呢?就是不拿這個法自己反省、淨化,而拿這個法去要求別人,是要求別人就弄錯了。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[06:23]6P160L7</span></p>
<p>所以說修行是修你自己還是修別人啊?如果說你修別人,那不妨。<span style="background-color:#800080">像理髮師,跟人家理了髮,理完了以後,拿了一個鏡子讓他照照,讓他看,因為你代他理嘛,那沒有錯嘛!現在你修理,修理你自己,當然拿這個鏡子,自己看看對不對,這個很清楚、很明白。所以這個才是什麼?「而為憶念」,我們真正要念,是要這樣念的,要這樣念的。</span>如果我們就這樣念的話,那對了,那就對了!所以他後面會告訴我們,我們真正修行的人的話,啊!只看見自己的錯誤,拼命自己的修習。如果你能這樣地,看見自己的錯誤修習,那你就錯誤減少嘛!錯誤減少功德就增長嘛!然後呢痛苦就慢慢地遠離,快樂就慢慢地得到,這就是個自然的一個道理。下面引經,還是</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[07:17]</span></p>
<p><strong>《正攝法經》云:「於諸僧伽,應如是念,</strong></p>
<p>這個「僧伽」,應該這樣念法:</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[07:25]6P161L2</span></p>
<p><strong>謂說正法,受行正法,思惟正法,是正法田,受持正法,依止於法,</strong></p>
<p>哦!說這一個「僧伽」是什麼?那我們現在聽的那些佛法,都是他們那些出家人告訴我們;所以我們所以得到暇滿人身,必定四眾遊行,四眾遊行都是靠他們,他們來嘛,他們跑得去弘揚法呀!哦,這樣!然後呢一方面說,一方面自己接受,然後如法行持。然後呢行持的時候思惟、觀察,因為思惟觀察,一步一步深入。哦,這個正法都從這個地方出生的呀!所以叫「是正法田」,受正法、持正法,「依止於法」。</p>
<p><strong>供養於法,</strong></p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[08:14]</span></p>
<p>然後呢我們供養法,如法行持就是供養法。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[08:20]</span></p>
<p><strong>作法事業,法為行境,</strong></p>
<p>所做的一切事情都是跟法相應的,這個正法是我們所行的境界。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[08:30]</span></p>
<p><strong>法行圓滿,自性正直,自性清淨,法性哀愍,</strong></p>
<p>哦!這個是法的特質。法的特質,它是正直的、清淨的,這是哀愍的。說到這地方,我們又有一個最好的指標:這個法的特質如果你相應的話,看見別人不對,你憐憫他,你看見了憐憫他,然後呢你想辦法委曲婉轉地幫助他,我們就不會指責他。然後呢,</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[09:06]6P162L5</span></p>
<p><strong>成就悲愍,常以遠離為所行境,恆趣向法,常白淨行。」</strong></p>
<p>這個修行的人是什麼?「遠離為所行境」。我們現在是什麼樣啊?染著、貪污、難捨,一天到晚沾在這個上面,一天到晚沾在這個上面。真正說來不是沾在外境,沾在什麼?我們的染污心識啊,這個東西就不認識,這個東西不認識的話,你什麼都談不到,起心動念都是為它。唉,這個真糟糕啊!所以他真正要厭離的,從外面的境相開始,一直厭離到自己的內心;自己的身心你能夠認識得厭離了,那時候的厭離就差不多,是「遠離為所行境」。這個時候「恆趣向法」,那麼白而淨了!這個就是僧,僧的功德,我們要這樣憶念。我們這樣憶念,一方面是皈投、景仰,一方面我們自己是如理行持,當下你這個憶念本身卻是就在行持當中。那麼前面就是把佛、法、僧三寶的功德說明一下,說我們是這樣地憶念,這樣的道理去皈依,這第一個。「由知差別」,進一步,</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[10:43]P163L1</span></p>
<p><strong>由知差別而歸依者。</strong></p>
<p>那麼這個三寶當中,這真正地、細細地說起來,彼此間有不同的特質,這個說一下。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[10:53]</span></p>
<p><strong>如〈攝分〉說,由知三寶內互差別而正歸依。</strong></p>
<p>正式平常說皈依的佛、法、僧,它彼此間有什麼不同呢?它的別相,細緻的內涵,那麼按照著這個〈攝分〉說一下,分六部分。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[11:14]</span></p>
<p><strong>此中分六,相差別者,現正等菩提是佛寶相。即彼證果,是法寶相。由他教授,而正修行是僧寶相。</strong></p>
<p>這個三寶差別、不同的地方,這個。就是說眼前證得無上正等正覺的這一個人,就是佛;所證的果,就是法;證了果以後,把這個法教人家,照著去做的那些人,是僧。這個是三寶相 ─佛寶、法寶、僧寶,那是相的差別。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[11:56]</span></p>
<p><strong>業差別者,</strong></p>
<p>那麼它有什麼業用呢?做些什麼事情呢?</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[12:00]6P164L1</span></p>
<p><strong>如其次第,善轉教業,斷煩惱苦所緣為業,勇猛增長業。</strong></p>
<p>佛做些什麼事情?善巧地轉法輪,教化一切有情,這個是佛。那麼法呢?是說我們所緣,緣了這個法以後,能夠斷除煩惱跟苦;煩惱斷了嘛,然後這個業就斷;惑、業斷了嘛,苦就斷,那這個是法的功效。僧呢?「勇猛增長」,如理去做,勇猛精進,增長白淨之業。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[12:48]</span></p>
<p><strong>信解差別者,</strong></p>
<p>第三個,這是在我們修學的時候,如何信、如何解呀!</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[12:55]</span></p>
<p><strong>如其次第,應樹親近承事信解,應樹希求證得信解,</strong></p>
<p>對於佛,我們應該樹立這樣的「親近承事」,這個才是我們真正應該親近,應該真正承事的。這一點注意!我們現在親近的是誰?承事的是誰?現在我們平常親近的,在家嘛這個家庭啦、朋友啦,這樣;然後呢出家了,三寶,當然應該三寶。那麼這個地方仔細檢查一下:我們做到了沒有呢?所以平常的時候注意,我們常常告訴我們自己,我們要學佛,我們應該親近佛,應該承事佛。怎麼親近法?怎麼承事法?就是把你的心,一心想著他,一心想著他。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[13:56]6P165L2</span></p>
<p>現在我們想著誰呀?不問、不檢查還迷哩糊嚕不知道,仔細檢查一下就很難說。以我來說,我的經驗,我們平常親近的,親近「我」,一天到晚承事「我」:喔唷!頭痛哦,趕快!找一點什麼藥吃一吃。啊,什麼營養大概不好,昨天晚上睡覺都睡不好 ……。一天到晚忙它這個東西,這樣。不是說不要,要的,我們要它幹什麼?用來修行,這一點要認識。因為要它修行,所以你對它起碼的給養是要的。所以這個佛一再告訴我們,這個車子要它用的;欸,塗車的油要的,只是僅僅塗車的油啊,注意到!千萬不要被這部車子騙掉了。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[14:47]</span></p>
<p>我們真正應該親近供事的 ─佛,所以「承事」什麼?佛。然後呢,普通我們身口承事,比如說我們把那個常住啊、殿堂啊,處理得乾乾淨淨,弄得好;然後呢如法修行,身口意三業承事,這是我們應該做的。對法呢,「希求證得」,這個才是我們希求的、希望的,要想如法去證得。那麼,對於僧呢?</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[15:18]6P165R2</span></p>
<p><strong>應樹和合同一法性共住信解。</strong></p>
<p>如果你正式要修行的話,一定要有修行的同伴,這個修行的同伴就是僧團。別以為你一個人可以修得成功哦!不可能的,不可能的。就你眼前極短的時候來說,是;將來真正修成當中也需要有一段時候,譬如說你專門學止的時候,奢摩他的時候,就要寂靜的地方,是,你需要。在整個修行當中,你絕對不可能說一個人關起來修的。你自己沒有一個旁邊的人告訴你,你怎麼可能?然後呢我們生活當中共同 ─僧,有他種種的互相增上的很多好處在,這個以後慢慢地講。要想住在一塊兒,而要想那個的什麼?要「和合同一法性」 ─大家互相勸勉,然後呢互相策勵,互相看對方,而這樣地互相,相輔相成。這點太重要、太重要了!這個僧團之所以有種種規矩,目的無非在這個地方,這個以後下面會詳細講。實際上對我們這個團體特別重要,如果這一點把握不準的話,啊!那其他的都錯了,說修行,都恰恰相反,造了業。那麼,再下面:</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[16:49]6P166R5</span></p>
<p><strong>修行差別者,如其次第,應修供養承事正行,應修瑜伽方便正行,應修共受財法正行。</strong></p>
<p>前面是信解,了解了,然後呢下面是修行。修行的時候呢,對佛是「供養承事」,去供養佛、承事佛,這樣。然後法呢,「瑜伽方便」,了解了以後,進一步怎麼跟它相應。這個「瑜伽」就是相應,照著這個方法,慢慢、慢慢地行持,跟它相應。當跟正法相應的時候,那時候染污、無明就漸漸地淨化而遠離。然後呢你要修行的時候,必定要什麼?有共同的助伴、同伴,這個就是僧,所以共受財、共受法。「共受財」是資養這個色身,「共受法」是資養慧命;而我們所以能夠修行增長慧命,要靠這個暇滿的人身,要這個暇滿的人身,還有財,這個財就是世間之財。那麼由於這個世間之「財」,修行而增長這個「法」,所以這兩樣東西都是「共受」,要和合。修行的時候應該這樣。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[18:17]6P167L7</span></p>
<p><strong>隨念差別者,</strong></p>
<p>那麼平常的時候,經常憶念什麼?</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[18:22]</span></p>
<p><strong>謂應別念三寶功德,如云:「謂是世尊等。」</strong></p>
<p>這個經常隨念,這個前面說過了。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[18:32]</span></p>
<p><strong>生福差別者,</strong></p>
<p>最後一點,你這樣去做,有什麼好處?生起了這個福,有什麼不同?</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[18:42]</span></p>
<p><strong>謂依補特伽羅及法增上,生最勝福,</strong></p>
<p>是,對這個佛跟僧生的福,是依補特伽羅而生的;法,是依法而生的這個功德。那麼,雖然佛跟僧,都是「依補特伽羅」,都是依人,佛是一個人,說:</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[19:04]6P168L3</span></p>
<p><strong>佛及僧二是依初義。</strong></p>
<p>就是依補特伽羅。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[19:07]</span></p>
<p><strong>此復依一補特伽羅,及依眾多補特伽羅生長福德,以於僧伽定有四故。</strong></p>
<p>換句話說,佛只有一個;而「眾多補特伽羅」就是僧,僧必定是一個團,四人成眾,而增長福德,「以於僧伽定有四故」,這個道理我們了解。那麼,這個是知差別。那麼第三個:</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[19:28]</span></p>
<p><strong>由自誓受而歸依者。</strong></p>
<p>真正受皈依,自己誓願要受。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[19:35]</span></p>
<p><strong>謂由誓受依佛為師,依般涅槃為正修法,歸依僧伽為修助伴,由如是門而正歸依,如《毘奈耶廣釋》中說。6P168R1</strong></p>
<p>我們真實皈依的時候,一定自誓而受。說自誓:從此以後盡形壽,皈依佛 ─大乘是盡未來際;不但是如此,自己盡未來際,要使盡法界、虛空界一切眾生,也帶著他們使他們盡未來際。說皈依佛是我們的老師,不再皈依其他的;那麼法呢,就是「依般涅槃法」為正修的法;僧是修行的助伴。這個是平常我們,像平常我們皈依的《毘奈耶》,就是《戒經》上面,說得很詳細。最後第四個:</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[20:40]6P169L6</span></p>
<p><strong>由不言餘而歸依者。謂由了知內外大師及其教法,諸學法者,所有勝劣,唯於三寶執為歸處,不執與此相違師等,是所應歸。</strong></p>
<p>那麼,真正皈依,就是皈依這個了!不再言餘 ─皈依了佛以後,不再皈依其他的任何,乃至於大自在天等;皈依法以後,不皈依其他的世間的什麼等等這個。為什麼這樣呀?是說,因為了解 ─「內」就是佛法,「外」就是外道,所以叫外道的話,他不了解佛法的特質是在什麼地方,從外面去妄求的。所以內道的大師是佛,外道的大師的話,就是外道那些人,以及他的教法,以及諸學法者。換句話說,內道的大師就是佛,他的教法就是佛法,諸學法者就是僧伽;外道嘛也有他的外道的大師,以及外道所講的法,以及隨修的人。我們了解這個兩者當中的差別,一個是殊勝的,一個是庸劣的,庸劣的、世俗的。因為我們了解了,所以這個三樣東西啊真正寶貝、真正可貴,才是我們的皈依之處,而不再擇其他的,跟他相違的,我們不再皈依這個了!</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[22:19]6P170L3</span></p>
<p>在這地方有一點我們可以提出來,大家思惟一下:那個平常我們說,比如說講其他的外道,說他們只有皈依這個什麼等等,如果是從這個行相上來看的話,他們外道也會說:「欸,你們佛教還不是一樣,你們也說有你們自己的獨特的真言,同樣地也一樣地排斥其他的外道,對不對?那麼,請問你比別人強在哪裡呢?」大家的的確確,自然而然各說各的好,你也是這樣的一個嘛!所以就世間的眼光來看,倒是千真萬確的事實,碰見這情況,你怎麼辦?請問,碰見這情況,你怎麼辦?我們覺得我是超勝,他覺得他超勝,所以真正算起來,你們大家彼此彼此。是。你分得清楚嗎?在這地方,你能說得清楚嗎,跟他?大家說得清楚的請舉手。不同的在哪裡?這是一個重要的關鍵哦!就算你們舉了手,我也不會讓你們講,因為現在我要說下去。明天這個關鍵我會告訴你們,這個非常重要哦!這個非常重要!</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[23:54]</span></p>
<p>就是到現在為止,前面這個道理已經告訴我們了,不過比較概略一點,沒有這麼仔細。這個我們一定要分得清楚,佛法跟外道的真正的差別。你如果了解了這個情況以後,是,我們自己既不動搖,對人家那個責難,外面人家責難,我們可以對這個是非辨別得非常清楚,辨別得非常清楚,你決定可以把他說服。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[24:29]</span></p>
<p>不過有一點始終要了解哦,如果跟你蠻不講理,這種人不必講。不要說我們不必去講,佛在世的時候,他有一個最好的例子,碰見那個外道,那些人跟你詭辯的話,佛有一個辦法 ─十四無記,不開口。反正你跟他說了半天也沒有用,你說服了,他也會說:「就是你對,我就是不相信。」碰見這種情況,不談!如果真正講道理的話,這個地方有它完整、深刻的道理在,這是我為什麼在這個地方提一下,要告訴你們的。也同樣地告訴我們,為什麼我們不皈依其他的,要皈依佛,要皈依三寶。如果說這個佛弟子這一點都弄不清楚的話,那對不起,這個就談不到佛弟子;在家人還勉強可以,是出了家,這一點就應該自己認真地把握得住。下面繼續下去:</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[25:26]6P171R5</span></p>
<p><strong>此二所有差別之中,</strong></p>
<p>說這個兩個,人跟法兩個有什麼不同呢?</p>
<p>&nbsp;</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[25:35]</span></p>
<p><strong>師差別者,謂佛圓滿無邊功德,所餘大師與此相違。</strong></p>
<p>這兩者有什麼不同呀?說這個老師,就人來說,佛是圓滿的,所有無量無邊的功德;所有其他的所有的「大師」 ─是,還是稱他為大師,但是跟他相違,跟他不一樣。所以「相違」兩個字,這個很大的學問哦!相違是違背,換句話說,這兩個是敵體完全相反的。假定說,我前面曾經說過,我們往往在很多情況之下,留一個漏洞留在這裡,那麼結果留了一個漏洞,對不起,到那個時候,這個漏洞你就沒辦法補得滿它。他現在跟他相違,那換句話說 ─明、暗,這個裡邊,再沒有說半明半暗,什麼叫半明半暗?沒有這樣的事情,看得見就是明,看不見就是暗,就是這樣。所以所有的大師跟他相違的。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[26:40]</span></p>
<p><strong>《殊勝讚》云:「我捨諸餘師,我歸依世尊,此何故為尊,無過具功德。」</strong></p>
<p>我捨棄了所餘其他的一切的大師,一切的這所謂世間尊仰的人,而皈依世尊、皈依佛。為什麼呀?喏,只有佛是沒有一點過失的,只有佛是圓滿一切功德的,這個就是他的不同的地方。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[27:13]</span></p>
<p><strong>又云:「於餘外道教,如如善思惟,如是如是我,心信於依怙。如是非徧智,宗過壞其心,心壞者不見,無過大師尊。」</strong></p>
<p>除了佛以外,所餘的剩下來所有的一切的外道,以及他外教,你如果說真正地善巧地思惟的話,那個時候我就會找到一個結論:一定只有皈依。皈依什麼?這個該皈依、應皈依、可皈依之處 ─佛欸!其他的人所以不皈依,為什麼呀?「非徧智」,他不是徹底圓滿了解一切,解決一切的一切智者,那麼這種人,這種是外道。他外道這種宗旨,他那個宗旨就是教法,它是有過失的。有了這個過失,有這個過失,然後不圓滿;由於這不圓滿,染污;因為染污了,害了!所以「壞其心」。他心一被染污的話,就見不到正確圓滿的這個佛。所以那些外道跟佛唱對臺戲,我了解,我不皈依他,就是這樣。這個就是這個皈依的對象當中 ─人,佛跟外道的差別。下面呢,</p>
<p>&nbsp;</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[28:43]6P173R6</span></p>
<p><strong>教差別者,</strong></p>
<p>他們所說的教法呢?</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[28:46]</span></p>
<p><strong>謂佛聖教,由安穩道得安樂果,息生死流,淨諸煩惱,終不欺罔,</strong></p>
<p>教法呢,是佛告訴我們的圓滿的教法,它這個是正確的道路,安樂穩健;因為這個道是這樣的,所以得到那個果,也是安樂之果。這個安樂之果有什麼?嘿!能夠息生死之流。</p>
<p><strong>[46A] 00:00~16:18</strong></p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[00:08]6P177L1</span></p>
<p>這個生死有深有淺,淺的就是二乘的,深的就是大乘的。那麼把一切煩惱徹底地淨化,絕對沒有一點點錯誤。所以,</p>
<p>&nbsp;</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[00:24]</span></p>
<p><strong>樂解脫者,唯一善妙,清淨罪惡,外道教法與此相違。</strong></p>
<p>真正好樂解脫的,唯一的善巧微妙,這個法能夠清淨一切罪惡。外道所講的教法不一樣,跟它相違背,辦不到這一點,這個是兩者的差別。然後呢引證,</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[00:57]</span></p>
<p><strong>如《殊勝讚》云:「何故由尊教,安樂得安樂,故於說法獅,尊教此眾生。」</strong></p>
<p>為什麼要找這個呀?為什麼要皈依世尊的教法?因為他有前面說的「由安樂道得安樂故」。所以對說法師所講的這個教法 ─皈依,那麼照著這個,能夠幫助一切眾生解決問題。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[01:30]6P178L1</span></p>
<p><strong>《讚應讚》亦云:「謂應趣應遮,清淨及雜染,此是雄尊語,與餘言差別。</strong></p>
<p>那麼下面又說,這個佛所講的:清淨的應趣,雜染的應遮,「趣」就是我們應該照著去做的,雜染,應該遮止不做的。那個如理相應的這一種應趣應遮,正是我們的世雄世尊所說的,其他的世間的所餘大師跟他相違,這個是兩者的差別。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[02:15]</span></p>
<p><strong>此純顯真如,彼唯欺罔法,尊語與餘言,除此須何殊。</strong></p>
<p>那麼這一個,就是世尊所說的教法,「純顯真如」,完完全全一點都不錯地顯出真如,真如就是實相,正確無誤的。「彼」,彼就是外道,他們這個錯誤的,欺誑法。這個就是世尊跟其他外道教法的差別,除了這個以外,沒有什麼其他的,真正的差別就這裡。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[02:56]</span></p>
<p><strong>此專一妙善,彼唯障礙法,尊語與餘言,除此有何別。由彼染極染,由此能清淨,此即依怙語,與餘言差別。」</strong></p>
<p>這個很容易懂。所以佛法完全是妙善的,其他的因為染污,所以是障礙的,那麼兩者的差別就在這裡。他們那些東西因為染污的,是染污的輾轉地增上;這個佛呢是清淨的,是輾轉地超勝,兩者的差別就是這麼一點。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[03:34]6P179L1</span></p>
<p><strong>僧伽差別由此能知。</strong></p>
<p>那麼同樣的。當然佛、法如此,僧就是依法而行的,這就對了。下面</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[03:48]</span></p>
<p><strong>第四既歸依已,所學次第分二,</strong></p>
<p>前面是告訴我們皈依,那麼現在皈依了以後,說現在我們既然皈依了,皈依了應該做些什麼呀?最後說皈依已所學。「學」是有次第的,那個次第,分兩部分,</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[04:06]</span></p>
<p><strong>一</strong><strong>&nbsp;</strong><strong>〈攝分〉中出,二教授中出。 今初</strong></p>
<p>〈攝分〉就是相宗所傳,無著、世親兩位大師,兩位菩薩,〈攝分〉就是相宗;那麼教授就是性宗,龍樹、聖天兩位所傳下來。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[04:30]</span></p>
<p><strong>初中有二四聚。初四聚中,親近善士者,</strong></p>
<p>第一個四聚就是親近善士、聽聞正法、如理思惟、法隨法行。現在我們一個一個看下去。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[04:48]6P179R1</span></p>
<p><strong>親近善士者,謂如前說,善知識者,乃是一切功德依處,觀見是已而正親近,</strong></p>
<p>這個我們皈依了以後,正式開始學的時候,有這樣的幾個次第,有這樣的幾個次第。正式修學佛法,第一個是親近善知識。由於前面這樣地一步一步上來,那麼那時候我們了解,說這個善知識一切功德依處,一切功德都從這個上面來的。因為我們了解了這一點,那麼當然要去親近,當然要去親近。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[05:28]6P180L5</span></p>
<p>我們一開頭的時候也說親近善知識,到這個地方又說親近善知識,兩個有什麼不同?這個就可以比較一下。一開始的時候就提一個綱領,現在順著這個綱領,一步一步地次第下來,那個內涵卻有很大的不同。不同在哪裡呢?我們已經了解,說這個世間所有的一切都是要修行,要修行一定要現在,而且馬上要修,因為得到這個暇滿的人身是非常難得。然後呢正式開始修的時候,又告訴我們這個無常的道理,然後由於無常死了以後,說兩道當中到哪裡去,由於這些原因,所以你就找到皈依處。找到皈依處,那個時候就皈依了。皈依它真正的原因,就是說你要跳出來;要跳出來嘛,要照著去做;要照著去做,要跟著他去學。既然要照著去學的話,當然你所學的這個親近依止的這個誰啊?這個就是善知識。遵照這個次序來的時候,那個時候你對那個善知識,就會產生不同的內心上頭的認識。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[07:00]</span></p>
<p>所以這個道理,所以這個地方說一下,就是我們正修的時候就要了解,照著這個次第你一步一步地深入的話,那麼那個時候,你會產生不同的內心上頭相應的一種狀態。前面一開頭就告訴我們,說修行第一步要親近善知識,親近善知識有什麼好處,不親近有什麼過患,然後應該如何親近,善知識應該什麼行相,弟子什麼行相,乃至於最後沒有說清楚的,又總括起來說一下。現在了解了道理,你重新把那個道理,再運用到這個裡邊去的話,馬上對於前面所說親近善知識這一個修行的方法,有了一個具體內涵,有了一個可以行持的次第,有了一個下腳之處,這個道理就能夠一一地如法行持。你能如法行持,這個好處,馬上就得到。繼續,</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[08:14]6P181L7</span></p>
<p><strong>由歸依佛即是歸依示道大師,隨順此之正行,即是親近示道師故。</strong></p>
<p>說,你為什麼要皈依佛?因為這佛是指示你這一條道路的這個大師,所謂大師的話,那是圓滿無誤的。那麼你跟著這一個去做,「隨順此之正行」,佛不一定眼前我們找得到,那麼找跟佛相應的,那就是什麼?指示我們這一個圓滿道路的老師,這個就是善知識。善知識,為什麼要親近他?就是要懂得這個道理,然後如法行持。所以說,</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[09:08]</span></p>
<p><strong>聽聞正法,及如理作意者。隨其所應,謂當聽聞若佛所說,若佛弟子所說,法教諸契經等。</strong></p>
<p>這個是聽聞,那麼跟了善知識以後,然後「隨其所應」,就是換句話說跟我們相應的這個層次,如理如量、如其次第地來聽聞修學,佛說的、佛弟子所說的,若經若論等等,以及種種祖師的語錄,跟這個正法相應的種種。聽完了以後,</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[09:51]6P182L3</span></p>
<p><strong>及若作意何種所緣,能息煩惱,即應作意。由歸依法,於教證法應當現證,此即是彼隨順行故。</strong></p>
<p>那麼怎麼是如理作意呢?那你懂得了這個道理以後,然後你照著這個道理這樣去作意;「作意」就是提起我們的腦筋來,在這個上面去思惟觀察。你能夠這樣去的話,那麼照著這樣的話,能淨我們煩惱。這個是法的特質,前面已經說過了,法的特質是什麼?清淨染污相的。染污是煩惱,現在呢這個正對治是能靜息煩惱,這個才是真正的法,這個才是我們真正應該修學的。現在我們有幸親近善知識,能夠聽到正確無誤的,就應該照著它去做。你照著它去做的話,那個時候你能夠靜息你的煩惱,那個時候你才去做。這個時候靜息多少,你就淨除多少雜染,清除多少罪障,增長多少功德,得到多少法財,得到多少法喜,這個才是修行,這個才是修行欸!這個我們要了解的。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[11:24]</span></p>
<p>現在前面所有這些東西都是前方便,做的基礎、基礎,這個都需要的。可是假定你認不清楚的話,你把那個前方便以為就是的話,那個就害了,那個就害了,這個我們千真萬確要了解。所以常常說,小學,那是一個前方便;如果說更進一步,小學之前還有一個前方便的 ─幼稚園。所以先進幼稚園,它只是吸引你,讓你生一點歡喜,覺得離開了爸爸媽媽,歡喜到學校裡;然後到小學裡,然後到中學裡。你千萬不要說:「哎喲,我要學的東西,幼稚園就是對了。」那你就完了,那你就完了。你就總不能到那個時候,學了小貓跳小狗叫,來來來去去去,跑得去到社會上去賺錢吧!你這個東西怎麼能賺錢?那是開玩笑。實際上我們修學佛法也是如此啊,千萬注意。</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[12:22]</span></p>
<p>所以現在剛剛跑到廟宇裡邊來,學到一點規矩,會念一點經咒,那個是前方便哪!千萬不要拿這個東西就以為對了,去衡量別人等等。學到了正法都不能衡量別人,何況這個東西!這是我們應該了解。但是反過來說,你千萬說,這個不是、不對,那又錯了,因為你必定要從這個上面一步一步上來。所以這個概念也應清楚,前面已經說過,這裡順便一提。</p>
<p>&nbsp;</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[12:54]</span></p>
<p>特別是說,如理思惟的是思惟些什麼?說「法」。法的特質是什麼?能靜息煩惱。能靜息煩惱的法,那個時候才是我們真正應該擺在腦筋裡想的。我之所以提剛才這個話,為什麼要提?因為平常你把握不住,腦筋裡面一天到晚轉這種事情的話,腦筋裡既然為這些事情,不相應的擺在腦筋裡,你能思惟法嗎?趕快把那個以前那個垃圾把它撤出去,能夠垃圾撤出去,那個乾淨東西才能夠裝得進來,這才是我們真正需要的。</p>
<p>&nbsp;</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[13:33]</span></p>
<p>說「由歸依法」,因為你這樣地做的話,這個是真正皈依。於是呢「於教證法應當現證」,由教而證,教是告訴你怎麼做,懂得了怎麼做,然後照著去做的話,能夠證。現在這個就是「隨順行故」,如理地思惟,就隨順著這樣去做的;你能夠這樣地做的話,弄熟了你就可以去真正修行。所以最後的,真正修行了,叫</p>
<p>&nbsp;</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[14:07]6P184L7</span></p>
<p><strong>法隨法行者,</strong></p>
<p>對了,這個法,欸,你能夠跟它相應。</p>
<p>&nbsp;</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[14:13]</span></p>
<p><strong>謂應隨順般涅槃法,而修正行。</strong></p>
<p>經過了前面親近善如識,他正確完整地知道,你從這地方聽聞,如理思惟,然後呢修行,對了。</p>
<p>&nbsp;</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[14:33]6P184R</span></p>
<p><strong>由歸依僧,於趣涅槃補特伽羅應執為伴。其隨順行,謂應與諸趣解脫者,共同學故。</strong></p>
<p>那麼這個是最後皈依僧。皈依僧的話,說這個我們要修行,我們有一個共同的伴,共同的伴。那麼共同的伴這個隨順行,就是我們眼前的那些人,眼前那些人。你幫我忙,我幫你忙,共同扶持,我有錯了,靠你來規勸,靠你看見了來告訴我,這樣。所以這個地方我們了解,昨天已經說過了,是的,你看見了別人的不對的時候,那個時候我們要規勸,可是心理狀態完全不一樣,這個只要自己內心檢查一下就很清楚。如果說那個時候心裡面就是忍不住人家的那一些作法,他覺得不對,那個時候自己已經錯了,那第一件事情淨化自己。你做對了,發現人家不對,那個時候委曲婉轉說:「某人啊,你錯了!」然後輕輕巧巧地告訴別人,這個才對,這是眼前一例。</p>
<p>&nbsp;</p>
<p><span style="color:teal; font-family:arial,sans-serif; font-size:16px">[15:47]</span></p>
<p>當然真正的僧,不僅僅是如此,這個我們要了解的。真正的僧的特質,在另外講到的時候,會詳細地說。眼前這個狀態,只是就我們目前生活當中所發現的,應該了解怎麼去運用這個法,來產生共同和合與法相應的增上的功德。這個是我們大家要學的,這是第一個。第二個呢?</p>
說到這地方也許我們會想:哎呀,一點都沒錯啊,你看現在那些人都走錯了!你想到這個念頭,你已經不曉得錯到哪裡去了!不是管那些人,管自己、管自己。同樣地那些人你說他錯了嗎?你也可以說他錯,也可以說他一點都沒有錯。以我現在的了解的話,我不但沒有覺得他錯,我還感謝他們。我們今天所以能夠安安穩穩坐在這個地方,就靠什麼?就靠他們在外面,他們把佛法的種子廣布人間,然後人家信了佛法,曉得你們修行人,來送供養來。請問沒有這些人,我們今天能夠安安穩穩坐在那裡修嗎?你感激他都來不及,你還看他不對,是你顛倒得不曉得到哪裡去。如果你只管自己的,你必須感激他;如果你將來,覺得自己是個大乘行者,那到那個時候,你趕快努力來幫助他,這才是我們現在應有的態度。所以你說:「哦!我對了,那些人錯了。」那你比他更糟糕,比他更糟糕!他這樣去做的話,他還是可以幫助你,你這樣做你幫助了誰啊?[20:37]
所以我就想起來了,以前老師罵我這個話,我現在越想越對、越想越對。所以我現在我沒有這個力量罵你們,可是我不妨像收音機、那個留聲機一樣,敘述我老師的話:「你自己覺得修行了,請問吃的東西哪來的?憑什麼他要供養你?」唉!我現在越想越對,你還覺得人家不對,那個不對、這個不對,這是我們該好好地去仔細觀察。所以你看見外面這些人,你要感謝他啊,沒有他們,還沒有我們,我們不能安住在這個山裡好好修行哦!你真的這樣去觀察的話,欸,不管你怎麼弄,你的心裡面,總是策勵你去修行。所以你了解了這一點,你自然而然這種錯誤的概念都去除掉了,這個非常重要、非常重要,這是我們千萬要注意的!

==
[28:27]

所以那個時候,產生一個決心,產生一個認識。所以叫「誓願」是什麼呢?平常我們也想這麼,這個「想」的這個力量很虛浮的,沒有什麼力量;必定要照前面的辦法,認真地思惟觀察,那個時候你就產生一個強有力的、堅決地發誓:一定要這樣做!一定要這樣做!你有了這種強有力的這種誓願的話,它會推動你如實地認真去做。否則的話,你聽見了,虛虛浮浮,唉,聽見是聽見了,到那個時候就是提不起來,這個很可惜的事情。不過儘管如此哦,它還有好處的,這個種子種下去了以後,它遲早還會增長發芽。不過它增長發芽的時候,記牢喔!不是天上掉下來,一下讓你證了羅漢果了,或者一下讓你證了佛果了;''它增長發芽的時候,還是要拿出全部精神去、拼命去修。''所以我們總記得,''既然遲早你必定要這樣去做的話,你為什麼不趁現在努力而等到以後?因為等到以後,這個中間等的那段時候在哪裡啊?在地獄裡邊,這是我們要了解的,了解了然後你要真正地思惟去觀察的。太重要、太重要了!''這個事情。
[07:54]

''縱不即死,造作此事亦為善哉。''

是的,也許說今天你想了「今天死」,可是它不死。如果你能夠天天想到死,這樣的話,有什麼好處啊?你整個都在那兒積聚善法,積聚善法,在這種情況之下,天天不死正好嘛,你這個善法愈積愈多嘛!所以它真正的重心,不是說今天決定說猜它,像猜愛國獎券,猜得中不中;你如果說能夠執取今天必死那件事情的話,於是你努力修善法,努力修善法的話,那不是很好嘛!你天天積的善法,如果說不死的話,那更好啊!萬一你死的話,欸,你已經有準備了,這是我們要了解,它所以要告訴我們執今天必死的原因。


==
[10:37]

所以我現在養成這個習慣,不管任何事情,我一定寫得清清楚楚,我死了以後這些事情該怎麼辦,不但是錢帳、書籍什麼等等;而且每年因為隨時有改變,我都改變一次。譬如我在洛杉磯蓮社是這樣,我跑到講堂台北也是這樣,跑到這裡來又寫好,總是等著死。然後什麼事情反正都不去管它,剩下來幹什麼?趕快好好念佛,好好地念法、念僧,這個倒是千真萬確的一個事實。不要去忌,''我們要忌的就怕你念那個不死,這個才是我們真正要忌的。''所以現在我們真是完全顛倒、完全顛倒。尤其是修學佛法的人,信得過因果的人,你忌了,如果你忌了以後,如果逃得過的話,佛法還有什麼用?一點用場都沒有了。所以我們忌,該忌的不忌,不該忌的忌它,這個叫作顛倒。

==
[17:41]

''故日日中,定須發起必死之心。''

這個才是念死當中最重要的一個關鍵。所以我們每天一定要想:今天一定要死!早晨起來第一件事就想:啊!今天真大幸啊,居然昨天脫了這鞋子,今天又穿上了!那明天,明天一定不會再穿了,所以還有今天一天,趕快拼命努力啊!你什麼事情都不會去忙,啊,跑到廚房裡邊,稀飯也好,乾飯也好,什麼白菜也好,豆腐也好,塞飽了肚子趕快好,就是這樣。而剩下來所有的其他的事情,都是這樣,你會全部精神去修行,這樣修行還有不成功的嗎?
[02:05]

''是等門中而成死緣。故實不見有諸活緣,非死緣者。''

你不觀察,還覺得要求這個、求那個;你如果真的一觀察的話,你會發現眼前這個東西啊,沒有一個不是。我也記得有一位善知識曾經給我說過這個話,我現在記得很牢,當年聽起來覺得這個話很刺耳,我現在也不妨把它敘述一下:說我們現在啊,在這個世間真是可笑,幹什麼啊?自欺欺人,然後呢被人欺!他這話怎麼講?譬如我們大家見了面,大家說:哎呀,你好啊、我好啊,大家對面啊捧對方,我們也歡喜人家捧。結果問問自己心裡面:你真的在捧人家嗎?唉呀,阿彌陀佛!真的心裡想捧人家啊?不一定!結果我們還偏偏歡喜這個,這做什麼啊?[03:09]

''我們為什麼要大家來往?這樣,求活緣哪、求友伴啊,結果問他心裡面到底做些什麼?就是你做的當下本身,這個都是死緣。'' ,,(爲何這邊師父說是死緣?),, 當然這是世間一般的,唉呀,大家好的啊,今天我請你吃、我請你喝、求樂啊去酒家!為什麼?我希望從你地方多賺一點、多挖一點哪!不是很明白擺在這個地方嗎?那世間的朋友就是這個樣,大家還忙這個,這個顛倒啊!真是顛倒,人就是這個樣啊!但是叫他放掉還放不掉!所以人就張開眼睛往水裡「跳」!一個字,想想看,千真萬確吧!所以,不是佛法呀,它的的確確我們不了解這個道理啊!所以我們想到這個地方,要好好地覺醒啊,好好地覺醒啊!想到這裡,這佛法的珍貴,真是珍貴啊![04:10]

所以有的時候,我常常策勵自己,策勵自己。這是為什麼我覺得,對我這個始終感念我的善知識。當年在一起的時候,有的時候高興啦,就問候他幾句,他就喝斥我:「跑到這裡來,婆婆媽媽說這些話幹什麼!」我那時候也不大懂,後來以後聽見人家說了這個話,我現在想起來了,沒有錯!我們人世就是這樣自欺欺人,被人、受人欺。現在你出了家了,還做這個事情幹什麼啊?所以古來的大德一見面就問:「嗨!然後呢你這幾天在用些什麼功啊?」他瞪大了眼睛望你。我現在曉得,古人之所以成就,就在這裡。現在我們看見了:「哎呀,某人你好啊,你胖了,然後你瘦了,啊,趕快給你留補藥吃吃啊!」大家心裡覺得:好、好,這個好朋友。害你啊!不知道啊!這是千真萬確的事實。所以在這個地方特別告訴我們:不但死,而且就是活緣,這個活緣都是我們的死緣。現在我們要認識了這一點,所以趕快努力修行,這個時候我們就有機會了。

==[09:43]

''《寶鬘論》云:「死緣極眾多,活緣唯少許,此等亦成死,故當常修法。」''

這道理很明白,促成我們死亡的因緣太多,而幫助我們存活的非常少;幫助我們這些,也常常是促成我們死亡的一個助緣。所以我們了解了這一點哪,只有一件事情 ─修行!除了修行以外,別的什麼都虛假的,別的什麼都虛假的。你忙這些東西,就算它幫忙你,不促成你死緣,忙完了以後,兩腳一伸,什麼啊?還是一場夢,還是一場夢。這夢對你是一點價值都沒有,而是為了忙這個夢裡這個虛假的東西啊,造了種種的業,然後你去隨這個業受無量的苦,划得來嗎?所以我們唯一應該做的事情 ─修法啊!修法。

[10:57]

關於這一點最重要的就是,我們要建立正確的認識。你沒有正確的認識,我們處處地方覺得這個也不對啊,那個也不對啊!所以我們平常除了讀這個正文以外,一定要多看古人的很多傳記等等。你看那個古人的生活的艱苦,這種情況啊,嘿!假定像我們現在想像當中,說這個不行、那個不行,那種人統統早就死光掉了;或者絕對不會活下去,偏偏他們長壽的還很長咧!還很長的。虛雲老和尚活個一百多歲。不但是如此,不要說修行人哪,有很多普通的民間的,有的是這種人。他有什麼好吃、好穿哪?什麼都沒有啊!所以我們把那個精神都浪費在這個上頭,那是非常可惜,非常可惜啊!一天到晚跑到這地方來就忙這個事情,腦筋裡面轉那個事情,划得來嗎?這是千萬注意,千萬注意!你一定要自己努力去找到這個病根所在,從這個地方連根拔起。在這個地方儘管別人跟你講,講完了以後,你自己不相應的話,這還是多餘的。你還是苦苦惱惱,就算坐在這個地方,哎呀,你苦苦惱惱坐在那兒聽,那何苦來哉!

==[16:24]

''如《迦尼迦書》云:「死主悉無親,忽爾而降臨,莫想明後行,應速修正法。此明後作此,是說非賢人,汝當何日無,其明日定有。」
''
這個閻羅王他是不跟你講情面的,他要來就來了,所以千萬不要說:「哎呀,明天再說啊,後天再說呀!」要做任何事情,馬上就要做,馬上就要做。所以我們把事情拖到明天、後天,這個不是個正確的辦法,這個不是個正確的辦法。你們要了解,你怎麼可以確定說明天一定有?這個是千真萬確的事實。現在,我們所以生不起這種認識來的原因是什麼?就是我們無始以來的這個顛倒、錯誤,所以叫長夜無明。

[17:37]

這地方再提醒一下,關於這個長夜無明,形成無始虛妄的顛倒,只有一個辦法─作意對治。那麼作意對治的行相,詳細後面會說。這裡簡單地說,就是你腦筋裡面,的確提起來一種力量,說不斷地去觀察、思惟。不是像我們現在這樣,腦筋裡含含糊糊,這個是一個應該認識的一點。如果說大家對這個作意,已經有正確的認識了,應該馬上用功;如果對它還沒有了解的話,下面好好努力下去。我們現在對於修行的很多道理,也就是法相,也可以說很模糊,一點都不知道。大家講修行,修行固然不知道,乃至於還要跟人家去講,唉,真是!自己也不曉得說些什麼,自己也不曉得內容是什麼,這個真是 ……大家在這地方啊自欺欺人,自誤誤人。
<p><span style="font-size:18px">如《百五十頌》云:「若誰一切過,畢竟皆永無,若是一切種,一切德依處。設是有心者,即應歸依此,讚此恭敬此,應住其聖教。」謂若有一,能辨是依非依慧者,理應歸依,無欺歸處佛薄伽梵。由此亦表法及僧寶。如《歸依七十頌》云:「佛法及僧伽,是求脫者依。」應歸之因相分四,</span></p>
<p><span style="font-size:18px">初者,謂自即是極調善性,已能證得無畏位故,若未得此,則如倒者依於倒者,不能從其一切畏中救護他故。</span></p>
<p><span style="font-size:18px">第二者,謂於一切種,度所化機,善方便故,此若無者,縱往歸依,亦不能辦所求事故。</span></p>
<p><span style="font-size:18px">第三者,謂具大悲故,此若無者,雖趣歸依,不救護故。</span></p>
<p><span style="font-size:18px">第四者,謂以一切財而興供養,未將為喜,要以正行而修供養,乃生喜故,此若無者,則定顧視先有恩惠,不與一切作歸處故。總之自正解脫一切怖畏,善巧於畏度他方便,普於一切無其親疏,大悲徧轉,普利一切有恩無恩,是應歸處。此亦唯佛方有,非自在天等,故佛即是所歸依處。由如是故,佛所說法,佛弟子眾皆可歸依。由是若於〈攝分〉所說此諸理上,能引定解,專心依仰,必無不救,故應至心發起定解。由能救自二種因中,外支或因,無所缺少,大師已成,然是內支,未能實心持為歸依,而苦惱故。是故應知,雖未請求,由大悲引,而作助伴,復無懈怠,無比勝妙真歸依處,現前安住為自作怙,故應歸此。《讚應讚》云:「自宣我是汝,無怙者助伴,由大悲抱持,一切諸眾生。大師具大悲,有愍願哀愍,勤此無懈怠,有誰與尊等。汝是諸有情,依怙總勝親,不求尊為依,故眾生沉溺。若正受何法,下者亦獲利,能利他諸法,除尊非餘知。一切外支力,尊已正成辦,由內力未全,愚夫而受苦。」</span></p>
<p>&nbsp;</p>

<p><span style="font-size:18px">現法中速死不住,死歿之後,於所生處亦無自在,是為諸業他自在轉。<br />
其 業&nbsp;亦如《入行論》云:「如黑暗依陰雲中,剎那電閃極明顯,如是佛力百道中,世間福慧略發起。由是其善唯羸劣,恆作重罪極強猛。」諸白淨業勢力微劣,諸黑惡業至極強力,故墮惡趣,由思此理,起大畏怖,次令發生求依之心。</span></p>
<p><span style="font-size:18px">由惡趣等自生怖畏。深信三寶,有從彼中救護堪能。故若此二唯有虛言,則其歸依亦同於彼,若此二因,堅固猛利,則其歸依亦能變意,故應勵力勤修二因。</span></p>
<p>&nbsp;</p>





根本一:思決定死

# 不論何種身分、住何空間、處於何時、運用外力,從各種角度觀察,無有任何因緣能逃過死主的必定到來。
# 因為業報所感的壽量,自入胎以來正晝夜無停止的消逝,每一刻必定朝著死亡靠近。
# 捫心想想,人的一生再長,扣除睡眠、老病和無義銷耗的時間,真正能修法的餘暇所剩無幾。
* 決斷一:必須修行正法。
** 思惟上列的三因之後,由於肯定自己死亡的必然性,而生起決心在死亡來臨前修行正法的誓願。
根本二:思惟死無定期。

* 雖由死亡必來生起修行的決斷,然心念大多執持今日不死,相應於籌備現法的安樂。爲對治此的第二個修持根本,就是去思惟死期的無法確定,
# 南瞻部洲人的壽量不同於其他方的特色就是壽量無定,無論老少,皆不能預知自己的死期。
# 不論有情無情的外境或四大假合的自體,違害生命的死緣眾多,而助益生命的活緣極少,甚至會轉變成死緣。
# 身體並非想像中的堅實,其實非常微劣脆弱,無須大損即能壞命。
* 決斷二:從現在而修正法。
**在壽量的不確定、死緣眾多和身命脆弱三個因相的交織逼迫下,死亡隨時會來而且絕無定期可言。論中說這是三根本思惟中最重要的根本想法,由對死無定期的定解而能扭轉不願意修的心意,不再執常戀俗或恣意推託,定發日日必死之心,激勵現刻及時修行的決心。
根本三:思惟死時除法而外,餘皆無益。

* 最後,慎防死期隨時來到,發起即刻修行的定解與決心,還要以佛法為正修依歸,避免臨死戀著錯誤對象,反致盲修瞎鍊白忙一場。是故,第三個念死的根本法則,要去思惟死時除法而外,餘皆無益。
# 臨命終時,與親友間縱有再多的不捨,也無人能陪伴或替死。
# 窮盡一生追求的財物受用,死的時候絲毫都帶不走。
# 就連畢生珍愛呵護的骨肉身軀,到頭來死時也得棄捨。
* 決斷三:死時唯法是依是怙。
**現世擁有的親情、財富和身體,縱使圓滿美好,然死的時候卻與自己相互背離,是何等令人悲傷與害怕。因此除非對佛法生起深心定解,確認在孤寂的死路上真正可以幫助自己、究竟解決痛苦的,唯有依怙佛陀的正法。
<div class="tc-table-of-contents">

<<toc-tabbed-external-nav 'TableOfContents' sort[ind]>>

</div>
如對聖顏
思維師恩

<$list filter="[tag[廣海明月]]"> 
<div class="tc-link-info-item">
<$link><$view field="title"/></$link>
</div>
</$list>
<p>   上一次我們討論到看破、放下、自在,師父說:「你真的看破、真的放下了嗎?真的自在了嗎?我想仔細地檢查,不能說沒有,但是絕對沒有真的做到。」那麼現在又到了研討的時間,能否把心從忙忙碌碌的其他所緣上,迅速地緣到法上?可以用多快的時間把自己的心拉回來呢?也許在研討課之前你生氣了,或者你傷心了,或者你疲憊、有事情要忙、放不下等等等等,總之好像有很多讓你不能專心的事情。那麼我們要強迫我們自己——什麼叫強迫?就是拉著自己的心,把自己的心拉到應該緣的法上。 [01′11″]</p>
<p>   那麼就是要看我們平常轉心的速度有多快,有的人聽到法音立刻集中全部心力。在《略論釋》裡有講過,那種狀態就好像在曠野裡邊,晴空一聲霹靂,一個小動物突然牠就集中全力,說「猶如野獸乍聞聲」,全部都停了,牠就聽那個聲音;是那樣的一種聽法的狀態,其他的所緣都不見了,只有法的所緣存在在我們的心中,或者耳畔。 [01′48″]</p>
<p>   我還想到了一個譬喻,比如說飛機要降落到一個正常的機場跑道上,那個跑道應該有一、兩千米,因為它用那樣的速度在高空飛翔,下降的時候它會有一個習慣性的速度向前衝,衝、衝、衝,然後慢慢地變慢。你不能一下著陸之後馬上就停,這會出問題。還有聽說會有飛機在航母甲板上著陸的事情,但是飛機在航母上著陸的那個長度,據說只有三百米!三百米的距離,飛行員要把飛機停在甲板上。雖然說是三百米的距離,但是實際上可能是一百五它就要停下來,因為你要是到三百米停下來,就衝到海裡去了!所以這個中間就設一道線要拉著那個飛機。 [02′45″]</p>
<p>   因為我們很少人看過航母,不知道那條線是怎麼做的。那條線是要把飛機拉著,它才能夠快點停下來;要只靠飛機自己停,一定是衝出一、兩千米以上,是絕對不可能在三百米的距離停下來,或者在一百米的距離停下來的。所以那條線就非常地寶貴,那條線的材料就要非常非常地精密,因為它要讓一架高速奔跑的飛機停下來,你想想這條繩子是多重要!所以後來人們就給它一個名字叫「生命線」,因為它拉不住,那飛機就衝到海裡了,所以那條繩子很重要。 [03′27″]</p>
<p>   假如我們的心是那樣一架飛機的話,那麼什麼樣的一個拉力,會讓我們立刻停在這艘法的大船上呢?大家想一想我這個問題。可以迅速地從你攀緣的各種高空中,降落到聽法的這艘大船上,然後載著我們去無上菩提。你怎麼樣迅速地停靠,這也是一個練習。那麼那條讓我們迅速停下來的繩子,那條所謂的生命線到底是什麼?是上師的加持力?是我的信心?還是我的善法欲,還是什麼?大家可以想一想。你有沒有抓到那根繩子?有沒有看到那根繩子?因為它會在短時間內讓你迅速地停下來,專注在法上! [04′20″]</p>
<p>   現在我們的心可以專注聽聞了嗎?只有把我們的杯子倒空,才能真正去聽師父在講什麼。要全神貫注地聽!下面開始聽了! [04′40″]</p>
<p>   我們文字是懂了,但是我們懂得這個文字,就是我們以前在世間上面所認識的這個意義,於是你認識的是這一點,真正派上用場的,也是這一點。你所看破的,世間的一個標準是看破了一點,所以比起沒有聽見這兩個字,或者沒有經過這兩個字提醒的時候,稍微好一點。但是佛法真正要你的看破,你看破了嗎?我想這個答案是肯定的——沒有!當然,看也沒有看見,你放得下嗎?根本放不下,因為你沒有看破,沒有放下,所以你也不得自在。可是我們偏偏自己說:「懂了、懂了!」在這一種狀態當中,於是我們自己覺得學到了,所以這個學到的,真正說起來不是佛法。想想看,對不對?我以後經常會運用這個例子。 [05′41″]</p>
<p>   剛才有沒有認真聽啊?那我要提問題囉!第一個問題,說:「<p> 我們文字是懂了<p> 」,這裡邊的「文字」,絕對不是指我們只是認字而已啊!所以這個「文字」,一定是指經文或者論典上的文字,對吧?因為我們是在討論無上菩提嘛!我們懂得這個文字,師父說:「<p> 就是我們以前在世間上面所認識的這個意義<p> 」,在經典上的文字,和寫在世間書上的文字解釋,大家都知道有很大的不同。師父說:「<p> 於是你認識的是這一點,真正派上用場的,也是這一點。<p> 」那麼請問:文字懂了,到底是懂到什麼程度?這個問題前幾天僧團裡的法師們進行了幾輪的討論,他們都認為這一段很難,想要明了師父所指的界限到底是哪裡,什麼叫「文字懂了」? [06′48″]</p>
<p>   師父說懂了之後呢?注意!下面出現對比性——「比沒有看見、比沒有聽過,沒有經過這兩個字的提醒」,注意那兩個字,「<p> 稍微好了一點<p> 」。就是你聽到文字懂了之後,比沒有聽過和沒有被提醒過,「稍微」好了一點。那現在的「懂了」,師父界定的是什麼?是「比沒有聽見好一點」。這就是懂了嗎?那這肯定不是懂了,這是比沒聽見好一點。但是,我們通常會認為我們「懂了」的,其實就是師父認為的「比沒有聽見好一點」,應該是這樣吧! [07′34″]</p>
<p>   為什麼師父說比沒有聽見或者沒有提醒,稍微好一點呢?下面師父講:「<p> 但是佛法真正要你的看破,你看破了嗎?<p> 」我們就會不服氣:為什麼我聽懂了,只是比沒聽過好一點呢?所以師父就接著問:「好,你聽懂了,那要你看破的你看破了嗎?」我們可能就直接回答肯定是沒有!都懂了,為什麼還沒有看破呢?注意哦!出現矛盾了!然後師父接著說:「<p> 當然,看也沒有看見<p> 」,我怎麼沒有看見呀?我看見文字啊!而且文字也懂了啊!那師父為什麼說我沒有看見呢?還有什麼在文字之外要看見的東西嗎?或者「文字」所指的是什麼?大家有想這個問題嗎?文字一定有一個指向、有一個所詮,它所詮的應該是我們的心,對不對? [08′35″]</p>
<p>   比如在《般若經》上常常會聽到,當菩薩開始修習布施波羅蜜、忍辱、精進等等,修習六度的時候,如果不具備方便善巧的話,又不能迴向無上菩提,就會生起高心。高傲的心的「高心」。高心懂嗎?就是你覺得你自己比別人強嘛!這文字一下就懂了。但是《般若經》這裡邊講的到底是什麼呀?看得見了嗎?那個「高心」。而且是修布施的時候,因為沒有具備方便善巧所生起的高心,因為這個原因生起的高心,和平常那個沒有發心的人生起的高心,應該還是不一樣的吧!因為這裡邊所指的是菩薩呀! [09′27″]</p>
<p>   所以它這裡邊有很多細緻的內心相狀,需要我們嚴格地沿著論典所指的方向,去確認內心的所破是什麼。這個所破,沒有善知識的指導通常是看不到!有一句話說:「只是著在文字相上」;但是能著在文字相上,至少還聽了文字,比沒聽還好。所以「看也沒有看見」,這句話很重要! [10′00″]</p>
<p>   接下來師父又問一句:「<p> 你放得下嗎?<p> 」因為看都沒看見,放下什麼呀?根本沒有看到問題呀!我怎麼可能去解決問題,讓我自在呢?師父說:「<p> 根本放不下!因為你沒有看破、沒有放下,所以你也不得自在。可是我們偏偏自己說:『懂了!懂了!』在這一種狀態當中,於是我們自己覺得學到了<p> 」,所以學到的這個東西,師父下定義說:「<p> 真正說起來不是佛法。<p> 」因為它沒有讓我們看破、放下、自在,文字所指的那個心相也沒有看出來。 [10′44″]</p>
<p>   師父講到這之後,問我們:「<p> 想想看,對不對?<p> 」師父又說一句:「<p> 我以後經常會運用這個例子。<p> 」請問這句話是什麼意思?這一段已經講過了,為什麼還老講這個例子呢?大家想一想!是不是我們會常常犯這種錯誤?甚至可能學整本都會犯這種錯誤,所以師父就要常常拿這個例子提醒我們。 [11′14″]</p>
<p>   我再問大家一個問題:有的人想要來界定這個「懂了」是不是「聞所成慧」?那這個也要討論,聞到聞所成慧的界限是什麼?如果一個人覺得文字懂了,是聞所成慧,我認為師父在此處沒有講到聞所成慧這麼高的高度,對不對? [11′36″]</p>
<p>   那麼這一段究竟要講一個什麼?它會區分一個——文字上懂了之後,能不能深入。如果你覺得我懂了、我懂了!認為這就是佛法的話,其實佛法不是這樣修習的,不是這樣修鍊的。文字上懂了之後,你要順著文字的那個方向去看內心所指的行相,去看問題是什麼。文字所詮說的就像以指見月,用手指月亮,我們不能看手指頭,以為手指頭是月亮,這樣就錯兩個。因為那是手指,那不是月亮;同樣,月亮也不是手指。 [12′16″]</p>
<p>   那麼,在此處就提出了一個要求。說要求的話,大家會不會覺得:啊!佛法是不是很難呀?其實也不用太擔心,也不難!那一直都找不到懂了,好像怎麼修都不是懂了,會不會完全沒有成就感?不會呀!找到正確的方法就可以了,師父正在介紹方法呀!因為一旦我們輕易覺得我們懂了,那就是修鍊的話,就會嚐不到滋味呀!那就會跟讀其他的沒有什麼差別。關鍵是,佛法的要旨是要我們離開痛苦、得到快樂,是要調伏煩惱的。所以調伏煩惱的這門學問,它自然有它的規則、有它的法則。 [13′11″]</p>
<p>   那麼什麼程度叫「懂了」?可能一直學下去,大家會慢慢地理解。但是會不會一點成就感都沒有?不會啊!比如這一段,我怎麼獲得聽聞上的,或者上這節《廣論》的成就感呢?我至少知道文字懂了還不行!那要做什麼?要向身心上去觀察。要看得見文字所指的那件事——所謂的「看見」;看得見之後,要設法讓放不下的那個煩惱,或者痛苦、憂悲苦惱、焦慮等等情緒,瞋恨、貪心,要想法說服心裡的那個東西,用理路說服它也好、用什麼說服它也好,讓它經過什麼?對治!然後,放下是對治的結果。所以大體要經歷這樣的過程。 [14′03″]</p>
<p>   正因為是要求這樣的過程,所以我們如果運用這樣的方法,來習慣這個過程,那麼我們就自然會體會到什麼是看得見、什麼是對治,然後......有一點點放下嗎?比如爭名奪利呀、別人惹了自己不依不饒啊、一直記仇啊,還有二十年前的事就要傷心一輩子。要傷心一輩子嗎?為什麼放不下?因為佛法就是來對付痛苦的,所以在學習的時候,我們要準備把那些陳年舊帳——記錄別人過失的那個帳本,真的要把它——劃掉。用師父的法音、用《廣論》上字裡行間所滲透出來的慈悲與智慧,要把它融化掉。要把那些煩惱在我們身心上深刻的烙印平復掉,這是佛法帶給我們生命非常積極的意義、非常樂觀的一種狀態。 [15′08″]</p>
<p>   所以也不是沒有成就感,也不是什麼都不懂,讓一個學的人處在一種可怕的焦灼中,也不是這樣啊!你每天都可以獲得一種喜悅,因為你有累積更多的「知道」,破除了更多「無明」,比如對這一段的了解。有在聽嗎?不要走神,不要走神! [15′32″]
<p>   所以一開頭我特別強調,假定說在這個地方,大家沒有辦法真正地體會到的話,我們就不可能深入,不可能深入,這是個很重要的概念,這是個很重要的概念!所以,還是我們平常因為有這個概念,所以往往自以為認識就停在這個地方,你沒有辦法深入。那麼,在這種情況之下,始終還是繞著兩樣東西:一個,我的見解——嗯,我覺得對!你這個「對」是什麼?就是世間上面,以前不懂的文字,現在你懂得了文字相。這個文字是以世間的標準來說,有深刻一層的認識,這個是沒有錯,所以可以說你是一個知識分子。但是學佛差得十萬八千里,門都沒摸到——種下一個因。第一點。 [00′52″]</p>
<p>   師父強調了一個問題:「<p> 假定說在這個地方,大家沒有辦法真正地體會到的話,我們就不可能深入,不可能深入,這是很重要的概念。<p> 」什麼沒有體會到就不能深入?然後師父又強調一遍:「<p> 這是很重要的概念!<p> 」體會到什麼呢?往下想、往下看!師父說:「<p> 我們平常因為有這個概念,所以往往自以為認識就停在這個地方,你沒有辦法深入。<p> 」注意!懂了,懂了之後反應是什麼?還會繼續學習否?懂了這件事,還有什麼味道可以再鑽研的嗎?什麼都懂了啊!通常我們就會放棄探索,所以會導致我們沒辦法深入,在學習佛法上這是一個很致命的毛病。 [01′49″]</p>
<p>   那麼我們懂了,師父又繼續剖析:到底懂了什麼東西呢?「<p> 我的見解——我覺得對!<p> 」這個「對」是什麼?如果在世間上就是懂了文字相,比對世間的話他是稍稍深刻一點,這個是沒錯的;師父說:「你可以說知識廣博呀!但是學佛的話差十萬八千里」,注意到後邊那句話:「<p> 門都沒摸到。<p> 」請問門在哪?摸到門的人和沒摸到的人,會同時問門在哪嗎?什麼是「門」? [02′30″]</p>
<p>   在這一小段其實也不要想得太複雜,一想到:這說的什麼意思?就矇掉了。要想一想:又到了我的見解——我覺得這個對!一旦圍繞著我覺得對、我的什麼什麼、我的什麼什麼的時候,就出現了師父在前面講的——是來學佛的,還是來學「我」的?弄不好的話都是在學我,而且我見越來越強、越來越強,學什麼都會加強自己的我見——就是我愛執。我愛執越來越盛的話,生命就越來越痛苦。 [03′12″]</p>
<p>   所以所有這些經典上的文字,它就要指示——「我」,能看得到「我」嗎?我的錯誤的想法、我的錯誤的見解、我的錯誤的感受。是要在這上面釐清楚,要真正地了解苦樂的來源源自於我們的心,再進一步解釋——源自於我們對事情的看法。某一件事、某一件事發生了,那件事一定會產生那樣的苦樂嗎?為什麼有些人也發生了這樣的事情,他沒有像我們那麼痛苦呢?所以這件事上並不真正能代表苦樂,或者直接出生苦樂;出生苦樂的是源於我們對這件事的看法,有了那個看法之後,在我們的心上產生壓力、悲傷,或者滿足等等這樣的情緒。 [04′14″]</p>
<p>   所以要校正的不是正在發生什麼事,要是外面的事情的話,誰能阻攔啊?比如說:「我現在在修禪定,天空,你不要打雷!孔雀啊,你不要鳴叫!」這怎麼可能?或者說:「不要下雨,我正走在路上。」我們怎麼可能讓整個宇宙隨著我的心意而轉?怎麼可能做到?那麼我們這樣一個在大宇宙中,看起來又非常具有靈性,可是又自覺渺小的人類,要怎麼樣達到自己的快樂呢?所以寂天菩薩就在他的《入行論》裡說,如果你怕刺到腳的話,有一種人會選擇這種行為:把大地上的荊棘都鏟完,哪兒有刺腳的東西就去鏟平它;還有一種人非常地聰明,他就穿個鞋,叫「片革墊靴底,即同覆大地」。只是把自己的腳穿上了鞋,就等於你好像拿了一個皮革,把整個大地都蓋住了。 [05′21″]</p>
<p>   同樣地,我們覺得滿世界都是問題、家裡都是問題、滿學校都是問題、工作單位......滿滿的都是苦惱!每個人身上好像都有這些不愉快。但是實際上只要把心裡的問題解決掉,把我們對這個事情、對這些人、對家庭、對很多問題的認知調整一下的話,我們的感受也將會隨之調整、隨之改變,這就是佛法讓我們逐漸去體會的東西。它正因為是在研究心的,每個人都有一顆心,你可以觀察自己的心念,可以留心自己的感受。所以不是看看經就完全懂得了你自己的心,注意哦!是我們自己的心。每一顆顆的心,要透過經典來校對內心,在內心上完成離苦得樂的操作。 [06′14″]</p>
<p>   所以這件事不能以自我為中心——我的經驗、我的什麼,因為我們沒有離苦得樂的經驗啊!當一個悲傷的心情生起,當一個怨恨的心情生起,我們都覺得我們是很有道理的啊!他這樣對我,我怎麼能不傷心?他這樣對我,我怎麼能不怨恨?那怨恨和傷心,請問是負面情緒還是正面情緒?一定是負面的,負面的就是傷人的!傷誰?當然傷自己呀!我們傷自己卻覺得是非常有道理的,為什麼?因為他這樣對我,所以我傷心、我恨呀!可是傷心和恨,讓我們的生命不是更加跌落到痛苦之中了嗎?那麼用什麼辦法可以停止傷心和恨別人呢?一定要調整自己對這個事情的看法,所以叫「調伏此一心,一切皆調伏」。 [07′03″]</p>
<p>   到後面會慢慢接觸到兩個字叫——調伏。是向內調伏,就是調伏這個「我」。這個「我」比獅子老虎還可怕喔!而且好像它是隱形的一般,因為很多人都沒有時間看「我」。因為眼睛都看別人、耳朵都聽外面,每天走路都在看形形色色的事情,很少很少有時間專注在自己的身語意上。我的身體在做什麼?我的嘴在說什麼?我的心在想什麼?哪些是不正確的,會給我自己和他人帶來痛苦的?哪些是快樂的,會給自他帶來愉悅的?我們有多少時間在檢查這件事呢? [07′50″]</p>
<p>   還是那樣,最正確的事情忽略了!所以師父就提到,為什麼我們坐在這兒?我們就是要離苦得樂。師父說:「<p> 大家停一下,讓我們自己做個警惕:我們在這個地方,來幹什麼?修學佛法。你為什麼要修學佛法?說目的我們已經了解了,為了達到我們離苦得樂的目的<p> 」,注意!離開痛苦、得到快樂。有的時候我也想問大家:其實離開痛苦、得到快樂這件事,雖然是所有生命最本能的一個願望,但是努力了很多年之後,還有離苦的這種勇氣嗎?多半是在苦缸裡邊泡著吧!想不起來離苦了;快樂好像也就那樣,有的人活著都沒力了!是被誰摧殘的?是我生命遇到了什麼事什麼事、什麼人什麼人,還是我們沒有明了這顆心、沒有覺悟這顆心導致的呢? [09′04″]</p>
<p>   一旦我們發現:噢!問題的關鍵在於我沒有明了自心、沒有了悟這顆心,結果讓我沒有真正地離苦,會不會精神為之一振呢?因為所有的事情都出在別人身上的話,怎麼去左右別人?正因為問題出在自己的身心上,所以正好自己可以解決呀!這多方便啊!不花一毛錢,什麼都不用求別人!你聽了之後就拿這個在自己心上操作。哪有一個實驗室不花錢的?但是在你的心上開始實驗離苦得樂這件事,不用求啊!就自己開始操作了。師父說比騎自行車還方便呢!騎自行車你還要有個車子,這什麼都不用,你觀察就可以了! [09′46″]</p>
<p>   觀察,對我們來說鏡子很重要、燈很重要,那麼經典就是像鏡子和燈一樣的作用。在我們的生命中,善知識就指示這個方向,讓我們在生命中不要迷失、不要迷失!「樂在這裡呢、苦在這裡呢!不要顛倒了,到苦的地方去找樂。」所以佛法是非常非常嚴謹的,它離苦得樂的方式也是非常準確的。正因為嚴謹,所以準確,甚至精確。 [10′19″]</p>
<p>   所以我們常常這樣去訓練自己的心的話,就讓我們的心非常地有力量、非常地明晰,因為會常常處在一種抉擇和思辨的狀態之中。注意!當你的心靈動地抉擇和思辨的時候,你對你自己的情緒、你的看法、你對別人的方式會常常有一種警覺:欸!我現在在說什麼?我在表達什麼?我表達的東西會給自他帶來快樂嗎?比如我現在發生了一件事,我「咚!」的一聲,就掉到那個苦惱的河裡了,然後就沉在裡邊。可是學了《廣論》之後,至少會覺得:這裡是哪裡?這裡好像是傷感,我要趕快逃出來,不然會越沉越深!我必須要逃出來,我要游出來!哪怕淚流滿面、哪怕筋疲力竭,也要朝著岸上游!我不要待在這種很負面的情緒裡,因為不去對治的話,它會越來越難過、它會越來越深。 [11′14″]</p>
<p>   所以師父講的每一個字、每一句話,都告訴我們修行的門徑在哪裡,聽了文字之後,一定要懂得在心上去找到文字的所破,或者所立是什麼。佛法要在身心上去實踐,這樣的話,我們的腳步才走得非常地踏實。 [11′36″]
<p>   我們剛才談了一下前面一段,研討到這一段,不知道有的研討小組會不會整節課都在討論「門」是什麼?然後大家陷落一團,每個人都在說:「門是這個、門是那個!」實際上師父在這裡揭示一種學佛的方式。學佛的方式跟學世間的稍稍有不同,就是你文字上懂了之後,你不能認為你真的懂了,因為要向心上去看、要在身心上做功夫,要改變身心的。所以它是一種修鍊,它不是用一個「懂」字就能夠代表所有的過程。 [00′39″]</p>
<p>   在研討的時候,我們常常會糾結一些好像跟身心無關的問題,然後所有的人都卡在那裡、所有的人都諍論不休,找不到出口,所以廣論班裡就吵成一團。吵完之後,出去每個人的心裡都是問號,就這樣回家了。但是這樣會不會很錯誤呢?畢竟我們在吵佛法的門在哪裡、修行的門在哪裡,對不對?不是在吵什麼其他的名聞利養啊、什麼其他的門,所以相對於那些還是比較好的。諍論、諍論之後慢慢就尋到路徑,找到出路了! [01′16″]</p>
<p>   怎樣找到出路呢?師父在這裡邊說:「我們在無明中,我們的概念,我們的執著,我、我、我!這個東西都是錯誤的根本。唯有一個有正確認識的人指導了你」,他指導了你之後,注意!「你了解了你的錯誤」,了解了之後,師父下一個次第是:「心裡想排斥這個錯誤」,那麼在想排斥這個錯誤之前,一定是知道這個錯誤給自己的傷害。「不但如此,下一步還要認識怎麼樣是正確的,然後照著正確的去做,那個時候才能轉化得過來。」轉化得過來就是,從苦的感覺過渡到快樂的,你的心的感受力發生了改變。<p>   好!提到感受,大家接著往下聽! [02′08″]</p>
<p>   然後呢,你的感受,對不起,那了解都不了解,我的感受還是普通的習性。世間的來說,人家說文人,文人的習性是什麼?講起來,講得頭頭是道,做起來是一無是處,就像普通一般的愚夫愚婦一樣。那我們現在實際上都是這樣的,大家喊這個民主,大家喊這個、喊那個,看別人的時候,喊得清清楚楚,輪到他身上的時候,做起來是一樣地莫名其妙。現在我們修學佛法了,第一個難關就是這裡,想想看!所以這個地方提示了我們什麼?我們不要自己覺得懂了,要想真正得到好處的話,應該要深一層地,好好地廣學。不必說我們現在想,哎呀,學得想樣樣東西都學,你不要說,就是簡單地學念佛吧,學參禪吧!說實在地,還是不夠,這個以後再說,這個以後再說。 [03′12″]</p>
<p>   提到感受,師父說:「<p> 那了解都不了解,我們的感受還是普通的習性。<p> 」此處的「了解都不了解」,是了解什麼?是我們的感受對吧!那我們的感受還是普通的習性這一點,了解嗎?比如我常常訴苦,但是知道這是苦的感受嗎?當我們對好友或者對親人傾訴一件痛苦的事情的時候,我們會不會覺得痛苦好像在變低了?這是一種痛苦在減輕的感受,是透過傾訴的方式。那麼,這是不是屬於普通的習性?注意!當苦受生起來的時候,是否沿著善知識的指導,馬上認識到:啊!這是痛苦開始了。 [04′12″]</p>
<p>   在痛苦開始之前,是不是還有一個東西它又先開始了?就是我們的見解——我們以自我為中心的那個執著,對這個事情的安立,是安立成傷害我的啊,或者這件事情一無是處啊,那麼接著痛苦就來了。習慣性地把某件事情發生看成是痛苦的淵源,那麼只要這件事一發生,痛苦就來了。一旦我們認為,這件事發生也許對我的生命有所警示、有所提醒,甚至是給我的一個大禮,但是我還不知道怎麼收的時候,我們就會觀察這件事本身存在對我生命那個不同的價值是什麼。讓我注意到:我有忽略什麼嗎?我是應該透過這件事增長一些見識、增長一些耐力、擴大一下心胸,看起來一無是處的這件事,是否帶了很多我不知道的秘密在上面,等待我去了悟、等待我去經歷另一番的感受呢? [05′21″]</p>
<p>   所以師父說「文人」,注意哦!師父在說很多事情的時候,其實都是結合著內心。注意!這個「文人」,大家不要覺得是說世上的文人,要注意我們內心中的那個——定義是什麼?講起來頭頭是道,做起來一無是處的——自我。講是都會講的,但是一做的時候就完全都沒有樣子了。學了這麼多年《廣論》,應該對這點體會滿深吧!老學員?就是某些段落是很熟悉的,但是這個段落結合內心還是滿辛苦的,所以這是我們再開始一輪的意義呀! [06′03″]</p>
<p>   說:二十年了學一本書!是呀,二十年學一本書,文字懂了嗎?文字懂了之後,內心了解了嗎?所破、所立知道了嗎?所破、所立知道了,該破的破了嗎?該立的立了嗎?感受全轉過來了嗎?最大的問題是:生死了脫了嗎?來生能生善趣嗎?最初的道次第建立了嗎?一問這些問題,是否大家會心慌,覺得好像一無所成?但是我們學了好幾輪《廣論》之後,我們對很多事情的見解還是建立出來了,正知見還是有的。比如最普遍的不殺生,五戒的概念、八關齋戒、菩薩戒,這裡邊有太多太多對自他生命有著積極意義的正確見解,我們已經透過《廣論》、透過師父的講解學到了。這是一件很了不起的事情、很偉大的事情,所以要好好地隨喜! [07′01″]</p>
<p>   師父在此處講的是什麼呢?就是那種「看別人的時候喊得清清楚楚,輪到自己身上,做起來一樣地莫名奇妙。」注意!下面一句話很重要:「<p> 現在我們修學佛法了,第一個難關就是這裡。<p> 」第一個難關是哪裡呀?說起來頭頭是道,做起來能不能不莫名其妙,對吧?所以有句話說:三歲孩童都知道的事情,八十老翁行不得。師父說:「<p> 這個地方提示了我們什麼?我們不要自己覺得懂了<p> 」,注意下面的話:「<p> 要想真正得到好處的話<p> 」,什麼好處?這個好處當然要真正地得到,請問是什麼好處?學習佛法可以得到什麼好處?什麼好處?你們有回答嗎?快樂吧!離苦得樂吧! [08′07″]</p>
<p>   離苦得樂,注意那個「離」字哦!比如你坐在車上,說:「請你離開那個車!」你要準備離開車上的座位,你就要花力氣,對吧?如果一台車正在飛速地行駛,你要離開這台車就要跳車,跳車很危險,需要更大的力氣。那如果我們要飛向太空的話——也叫離吧!要離開地球——那你要多大的力氣才能超越地球的引力,要多少燃料?我們習慣於這種引力,我們習慣於在自我的感受、自我的見解、自我的苦這種苦水裡面泡著,這就是一種習慣,也是一種吸引力。所以要離開這種吸引力的話,要一種很大的力才能離開。那麼這個力要怎麼才能獲得?因為跟自己的習慣是反的,你怎麼樣拿出一個相反的力量逃開這種痛苦?所以談到離苦的「離」字,它一定是有一個力量,又有一個方向。 [09′14″]</p>
<p>   我剛才是解釋好處是離苦得樂。師父說:「<p> 要想真正得到好處的話,應該要深一層地,好好地廣學。<p> 」聽到了吧?就是不要聽到一點就覺得懂了,趕快去亂忙一通,然後忙完了又很失望,非常地混亂。要想真正地好好學的話,「要深一層地,好好地廣學」,就是要耐下心來,別著急!把離苦得樂的這些見解,次第、數量認真地學明白了,並且一邊學一邊在內心上觀察。 [09′52″]</p>
<p>   問大家一個問題:師父的立宗有沒有出現?那個覺得文字是懂了的,會不會故步自封啊?能不能完成廣學呢?那好!現在問五大論班的同學,五大論都學完一輪了,懂了嗎?五大論夠廣的,懂了嗎?大家都搖頭。那在上課的時候,不會產生懂了的感覺嗎?沒有。辯論場上懂了嗎?上辯論場你把對方辯得啞口無言,還不懂嗎?都是不懂。說到此處,問所有的人,應該沒有人說:「我懂了」。 [10′36″]</p>
<p>   這一段懂了嗎?這一段也沒懂。我的問題聽懂了嗎?該承認懂的還是要懂的,但是修學佛法就不能輕易地認為這個懂了,不往下去學。懂得怎麼上汽車、怎麼下汽車,這個都懂了喔!不能一聽說「不懂」好,「好!什麼都不懂。」這樣就太過了! [10′58″]</p>
<p>   注意!好幾天的課程總攝一下,師父提醒我們,學佛的時候要特別注意它的目的性,目的非常地明確,像射箭一樣。你的箭靶在哪裡?離苦得樂,這就是我們學佛的目的。離苦得樂一定要離開無明,無明就是對這個事情沒有正確的一個看法。那麼請問:我們對學佛的正確看法是什麼?不能輕易地文字上看一看就以為懂了,我們一定要經過善知識來教我們,在身心上認識到這個「我」——連帶所有的見解和情緒,其實正是所破。了解它的錯誤、了解它的過患,我們才能離開這個錯誤;離開這個錯誤,就離開了苦。錯誤跟苦和罪是在一起的,所謂的「罪」就是做錯的事情,對自己和他人產生傷害的事情。 [11′58″]</p>
<p>   所以學習佛法不能急躁,要耐下心來、要沉靜下來,把我們的節奏放緩。為什麼放緩?放緩才能看到內心啊!那麼匆忙,連眼前有個東西、撞樹上都不知道,怎麼能夠注意到心念這個問題呢?所以師父才要提到:「提到這個事情,大家停一下,讓我們做個警惕。」 [12′28″]</p>
<p>   所以這一整段都在告訴我們學習本論的一種方式,就是要廣泛地聽聞。那麼二十年都在反覆地聽聞,有沒有廣泛地聽聞呢?現在又很多同學開始學習五大論、學習《攝類學》了。學習《攝類學》的時候,我們就自然碰到一個名詞叫「所知」。所知,大家都知道是心的對境,凡是存在的,心都可以了解。其實這句話只有佛陀當得起,因為凡是存在的,他都了解,而且是最正確地了解。那麼我們對我們的心了解嗎?我們的心存在嗎?存在啊!達摩祖師說:「你的心在哪?」「我找不到。」找不到存不存在呢?找不到就不存在嗎?空氣你也找不到,存不存在呀? [13′16″]</p>
<p>   所以對於存在的,不是我們心的所知,雖然是心的對境,可是我們不了解它,那麼我們就要跟隨了解它的佛陀——徹底了解萬事萬物的規律,包括心的規律的導師佛陀,我們就跟著他來學。最幸運的是還有師父一行一行地講解,還有廣論班裡這些同學,都是同樣的目的來這裡討論,每天都討論。討論就是鍛鍊思辨能力,你站在那一方、我站在這一方,大家一起來討論。雖然有時候好像不討論還行,越討論越糊塗,問題越來越複雜了、出現的枝節越來越多了,但是總算我們打開思辨的路徑,開始思考了!這是一件非常非常好的事情。開始思考、開始思辨,對我們人生的問題產生思辨,要去問為什麼。 [14′04″]</p>
<p>   所以師父揭示的其實也是個聞思修的過程,但是師父沒有提聞、思、修三個字。[14′12″]</p>
<p>   我有講清楚嗎?大家有聽懂嗎?還有人回答聽懂嗎?如果你們都聽不懂,我要再重講一遍嗎,這節課?再把所有的話倒帶重講一遍嗎?你們如果答聽不懂,我就一直講下去,永遠不下課!看你們怎麼辦? [14′37″]
<p>   好!又到了我們繼續研討的時光了。不知道大家的心態有沒有準備好?一定要記著有一個大乘的發心。就是不停地訓練我們生命的方向,讓我們所造作的業都隨著菩提心的方向;因為菩提心是佛子因,最後才會匯聚為成佛的方向。成佛才是徹底地離開一切痛苦、得到最圓滿快樂的方向。現在我們只能說,我們一直在提醒自己造作這個方向,終於有一天,它會在我們的心續裡邊,經過長期的串習、觀察修、止住修等等,成為我們心續裡堅固的續流,直到一剎那也不會間斷的續流,那個時候就太美了! [00′52″]</p>
<p>   所以不要放棄每一節課對動機的安立,雖然這可能只是短暫的一個心念的操作,但這個操作對整節課來說是非常非常重要的。甚至對於我們這一生、對於我們生生世世宗旨的把握也是很重要的。因為我們常常串習,重串習的業就會先熟。如果我們一直串習生命的最高宗旨,或者我們最迫切的生命願望——成佛,這就會真實地成為我們生命的方向、生命的意義,就會動用起我們全部的心力為這個目標努力,不達目標絕不停止! [01′37″]</p>
<p>   上一節我們討論到什麼樣是真正地能夠得到佛法的好處啊?然後一定要向深處學呀!要向深處學,首先要確定我們是來學佛的。為什麼學佛?要離苦得樂。那麼為什麼離不開苦呢?師父說是因為無明,我們對事情沒有正確的認識,所以導致了痛苦。其實這也是一個很深的概念,難道所有的問題都出在我的認知中嗎?把「我的認知」這個問題解決掉,是打開所有痛苦的結的一個鑰匙嗎?從這樣的一個角度說,認知事物就變得很重要了。 [02′23″]</p>
<p>   那現在就問大家:對每天上課要發心的這件事,我們的認知正不正確?認為是可有可無的、認為它麻煩,甚至久了之後就不以為然、麻木了?還是你會覺得,最開始的發心實際上關係到我們這節課的方向去哪裡。就是忙了這麼半天,秋天能不能收到東西?收到哪裡去了?會不會成為自己受用的那個果?所以發心是不容忽視的,發心、迴向都是不容忽視的! [02′56″]</p>
<p>   今天我們繼續來聽下面師父講的這一段。在聽之前我想講一個問題,因為有很多同學寫了回饋,我有看!其中有的同學問:「這個全廣的進度出現了,是不是班裡原本的進度都要改?」如果你想要聽我的想法的話,我比較建議你班裡的進度可以不用改,抽時間可以再聽一下全廣,是不是這樣會比較好? [03′26″]</p>
<p>   還有一個同學問到關於次第的問題,比如次第可不可以改變啊?為什麼是這樣?我會覺得要了解次第到底是怎麼回事,就是要耐下心來向下學。比如說次第,請問腳下的第一步是什麼?那也是次第吧!腳下的第一步就是聞法。那聞法的第一步是什麼?前行。前行的第一步是什麼?思惟。思惟什麼?聞法勝利。其實這也是在大的次第中有很多細膩的次第。每天如果我們能夠稍事注意到一個聽法前的準備,那麼對這節課來說,可能你會收穫良多。 [04′10″]</p>
<p>   還有一種狀況是:你只要一聽到法,立刻就全部都準備好了。就是你已經非常熟練,不會有什麼其他的雜音啊、之前做的事情一直出來干擾,你的方向性、你的意樂也非常地純粹,就是為了無上菩提。如果這樣的話,還會不會在意串習聞法勝利呢?除非聞法勝利已經進入到你的心續了,那你再串習的也是你的心續。 [04′37″]</p>
<p>   我還有收到同學的回饋,是他們在高鐵上聽,好像有的是坐在車上、走在路上都在聽。坐在車上的還好,走在路上聽的時候要注意看路!或者你最好站著聽,一邊走一邊聽的話要注意交通安全。我是滿開心的!大家能用這樣的時間來學習。希望能夠感受到不管相隔多遠,這個課堂就把我們連結在一起,我們很開心地在此時此刻開始研討! [05′10″]</p>
<p>   好,那我們開始聽! [05′12″]</p>
<p>   那麼在這一個地方,我順便也提佛經上面的一個公案來說明一下。這個《法華經》,我想我們大家都了解的。佛出世了以後說了很多經典,在這經典當中,現在流傳下來的,有兩部經典,通常說圓教經典,換句話說,最圓滿的。一部是最初說的《華嚴》,一部是最後說的《法華》。這《法華》很有意思,它最後告訴所有的弟子,你們每一個人到最後都成佛、都成佛。先開始說那些小乘的阿羅漢們,平常已經證了羅漢果了,他以為就到此為止。欸,佛告訴他:不!這是方便法門,最後你要成佛的。所以一一授記。最後呢,乃至於說任何一個人,你只要隨便地念一聲佛,跑到廟裡邊,合一個掌,鞠一個躬,乃至於小孩子玩,拿了這個泥沙造一個塔了——塔就是寺廟了——欸,覺得這樣,都會成佛! [06′27″]</p>
<p>   這一小段應該非常地明晰,就是師父給我們介紹了《法華經》和《華嚴經》,這一段主要是介紹《法華經》。師父說:「<p> 《法華》很有意思<p> 」,什麼意思啊?就是它告訴所有的弟子最後都會成佛。先從小乘的阿羅漢,說證得阿羅漢果了之後還要繼續向前走,最後要成佛,一一授記。最後說到:「乃至說任何一個人,你只要隨便地念一聲佛,到寺院裡合一個掌、鞠躬,乃至小孩玩,用那個沙子造了一個塔,都會成佛!」那根據《法華》的授記,我們二十多年廣論班裡這些同學,不管學得怎樣,是都會成佛的,對吧?因為我們不知道都合了多少掌、念了多少佛了,而且有同學也會造塔、供僧等等。所以根據佛陀的授記,現在在聽《廣論》這些同學都會成佛的,對不對?開心吧! [07′35″]</p>
<p>   以前有一個老居士,他非常非常尊崇《法華經》,非常地有信心,所以他對《法華經》一字一拜。那時候我去問他:「《法華經》到底講的是什麼?」他說:「你別講那麼多,你就拜就是了。」我說:「要拜多久才能明白《法華經》的意思?」他說:「跟著我拜!」後來就跟著他拜。他非常非常認真,從早拜到晚,非常非常虔誠,還有很多念誦《法華經》的居士們。《法華經》有說,念完了之後會口中出蓮花的香味,有種種不可思議的感應。  [08′15″]</p>
<p>   再說一遍:記得喔!現在不管是新學員還是老學員,佛陀在《法華經》裡授記了,我們一個合掌、一聲南無佛,「<p> 皆共成佛道<p> 」,都會成佛的。開心吧!這是佛授記的哦! [08′31″]</p>
<p>   那接著聽下一段:<p>   當然這個成佛的時間很遙遠,不過這裡呀,我現在要提示給大家的是說,他授記大智舍利弗尊者等等,就說:「最後你要成佛的,你還要供養兩百萬恆河沙多少諸佛,多少時間以後成佛。」看一看喔!大智舍利弗尊者是佛弟子當中智慧第一的,而且我們看那個經論上面,已經無量劫來跟著佛,生生世世跟著他,有這樣的因緣,這一世證了羅漢果了,到最後成佛還要轉了個大圈子,這個是圓教經典。可是另外一部圓教經典有意思咧!《華嚴》,這善財童子,他是個十信滿心,結果他最後也成佛,他的成佛的時間上面是一生取辦——說這一生可以成就,所以他最後以十大願王導歸極樂。這兩個之間,雖然同樣成佛,這個時間,那完全無法想像,完全無法想像!那是個天文數字,天文數字都無法形容。 [09′51″]</p>
<p>   好!問大家:這一小段師父在說什麼呀?是不是在說成佛的時間呀?說了兩種時間對吧?一種是什麼?是天天跟著佛、生生世世跟著佛的這個例子,誰呀?大智舍利弗尊者對吧?是智慧第一的。說這一世就證得羅漢果,最後成佛還要轉一個大圈子,我們可以想像這是示現的。還有另一部經典《華嚴》,就是一生取辦——當生就成佛,這個速度簡直是不能想像的。最後他以十大願王導歸極樂。說:「這兩個之間雖然是同樣成佛,時間是無法想像的」,師父用了「天文數字」。 [10′45″]</p>
<p>   我們都會成佛,但是接下來這一段揭示的是——速度。都會到那個目的、都會達到徹底離苦得樂的那個地方,但是快和慢是天文數字。接下來聽! [11′01″]</p>
<p>   假定說這個成佛這麼差別當中,我說沒有關係,反正你到那時候,生了天上人間,舒舒服服,到那時候,突然之間,一下成了佛了,那我倒還是願意等一下。因為成佛很辛苦嘛,所以我等了半天,到那時候成佛了,不是就等等嘛!不是的呀!實際上,這個無量阿僧祇劫,在這裡面大部分時間是都在受苦,受無量無邊的苦。那羅漢將來走到佛,還要苦,凡夫的話那更不談,大部分時間都在三惡道當中輪轉,痛苦得不得了,這第一個事情。第二個事情呢,轉了大半天你最後成佛的時候,他不是說到那時候,那個佛自然地掉在你頭上,你還是要經過這樣地努力,一點都不能少的,這個我們必定要了解! [11′52″]</p>
<p>   這一段講了兩件事情,對吧!第一件事情是什麼?首先師父說:「假定這成佛的差別中」,注意!是說那個速度的差別。「反正到那時候生了天,舒舒服服的,哎!突然一下成佛了」,快和慢都沒關係,因為都很舒適、過程很享受,那多長都沒關係!師父說:「<p> 那我還是願意等一下。因為成佛很辛苦嘛,所以我等了半天,到那時候成佛了,不就是等等嘛!<p> 」師父說這個速度不是等的問題哦!是什麼問題呢?是「<p> 無量阿僧祇劫<p> 」,同樣是天文數字,「在這個裡邊大部分時間都是在受苦」,而且受多少苦呢?「<p> 受無量無邊的苦<p> 」。「<p> 大部分時間都要在三惡趣中流轉<p> 」,這是指凡夫喔!都要在三惡趣中流轉。新學員可能剛剛接觸到三惡趣,你們可以稍稍了解一下,地獄、餓鬼、畜生就叫三惡趣。 [13′03″]</p>
<p>   佛教認為當我們這一生的生命結束之後,心識並沒有停止,它在繼續向前。怎麼樣證明人有前後世呢?在《釋量論》裡有廣泛的討論。因為心識是由前一剎那、後一剎那這樣一直相續不斷的一個續流,所以它是不會停息的,它總體是不會停息的。你下一輩子要去什麼地方,完全取決於自己這一輩子所造善惡業的考量。如果善淨之業多的話,就在人天道;如果是惡業為首,又重串習、天天想惡念的話,那可能就會到惡趣去。所以師父說:「大部分時間都在三惡趣中流轉。」為什麼大部分時間?因為一旦進入惡道,很難脫離。 [13′54″]</p>
<p>   比如有的畜生道的生命,牠就是要靠吞食其他生命來維繫牠自己的生命,牠活一天就要殺很多生命。你說這樣的業,牠怎麼從那個道裡脫出來?所以是很可悲的,牠已經失去了抉擇能力。有的只要張嘴就可以吞掉很多生命,所以牠沒法持守不殺生戒,也沒法聽聞;遇到佛法之後能知道嗎?頂天就是被放生呀!可能有的生命這樣的機會也得不到。所以一入惡道是非常難以脫離的,一旦進入惡道之後,成佛是很遙遠哪!不知道該有多遙遠,全都忘記了!所以師父說:「<p> 痛苦得不得了啊!<p> 」 [14′41″]</p>
<p>   那麼這些該受的惡報都報了,轉了半天,到最後成佛的時候,是不是一下子很輕鬆地成佛了?不是的!還是要經過這樣的努力,一點都不能少的!該做的善都要做、該斷的惡都要斷,一點點都不能少!不能說因為我們從惡趣裡都轉完了,上來之後我們就少了很多。而且從惡趣上來之後,不知道還帶著惡趣的什麼餘習,更麻煩!所以這件事就是一件非常費力氣、非常辛苦,要經歷過難以想像的艱辛才能達到的,就是那條成佛的遠路。注意!師父揭示了這件事情。 [15′23″]
<p>   好!我們接著聽下一段。 [00′03″]</p>
<p>   有這樣的因,有這樣的果,那到最後成佛還是要,為什麼呢?為什麼呢?因為我們要真正成佛,要做兩件事情。哪兩件?一個呢,要所知障徹底地淨除,煩惱障徹底淨除,兩樣東西。那個東西你沒有淨除之前,不行!換句話說,那個債在那裡,你沒有還清之前,就是負債的;還清了,什麼時候還清了,就對。還有呢,你要做那件事情就要做那麼多,什麼時候做圓滿,什麼時候就對,這樣。結果呢,前者走這麼長的路,完了以後,同樣還要付出這麼大的努力去完成;後者一下就達到,他也達到了。這兩個比較,對我們有極重要的一個概念,大家記住!為什麼?為什麼?我想如果說我們自己肯努力在這個方面追尋一下的話,沒有一個人例外的,這一定願意走善財童子這一條路。喔,這個太冤枉了!走這麼長時間太冤枉,因為這個吃了冤枉苦頭嘛,對不對?這個概念在哪裡呢?看下面,這個就在這兩部經上面說得清清楚楚。 [01′18″]</p>
<p>   諸位,你們在研討這一段的時候會怎麼研討呢?比如這裡邊提到了成佛要斷除的所知障和煩惱障,是不是很多心力都花在去了解所知障和煩惱障?但是這一段,師父要我們了解的是什麼呢?一個是前面走了那麼長的路,那麼長的路都在惡趣!完了之後,同樣還要付出這麼大的努力才完成;後者一下就達到了。 [01′52″]</p>
<p>   所以這個快和慢,師父說:「<p> 這兩個比較,對我們有極重要的一個概念<p> 」,然後師父接著說:「<p> 大家記住!<p> 」記住什麼?就是我們要去比對快、慢。說:「這還要比對嗎?一個那麼長、一個這麼快,這不很明顯嗎?」這樣的念頭是懂了的意思嗎?懂了這個快、那個慢,懂了三十天比一天長,然後呢?最重要的是為什麼走三十天?為什麼走一天?為什麼走無量阿僧祇劫?為什麼一生取辦?對吧?師父說:「<p> 大家記住!<p> 」接著師父就問:「<p> 為什麼?為什麼?<p> 」連著兩個。 [02′48″]</p>
<p>   這兩個為什麼,到底是問什麼的呢?師父接著說:「<p> 我想如果說我們自己肯努力在這個方面追尋一下的話<p> 」,哪個方面呀?就是為什麼走那麼快、為什麼走這麼慢,中間都經歷了什麼。注意!師父用了「追尋」,這裡邊就是開始有可能你摸不到什麼,一直在探索、一直窮追不捨,一直在探索這件事。而且師父後面說:「<p> 追尋一下的話<p> 」,看起來也不太難。接著說:「<p> 走這麼長時間太冤枉,因為吃了冤枉苦頭嘛!<p> 」師父在這講的時候有點在笑。「<p> 沒有一個人例外<p> 」,師父說:「<p> 如果你追尋一下的話,沒有一個人例外的,這一定願意走善財童子這一條路。<p> 」善財童子的路是什麼路呢?就是一生取辦——最快的成佛之路。但是一定要去追尋其中的義理和要去探討為什麼。 [03′56″]</p>
<p>   我現在問大家一個問題:師父為什麼在講一講離苦得樂之後,就講到這兩部經了呢?你們在回答嗎?為什麼講這兩部經了呢?講這兩部經要引出什麼呢?兩條路,對吧!一條快的路、一條慢的路。那麼引出這兩條路要幹什麼呢?是要你我選擇嗎?是要你我追尋嗎?師父的心意是什麼?師父把兩條路打開,說:「諸位呀!我所關心的你們,請走遠路吧!」是他的心意嗎?遠路太苦呀、太苦呀!師父心疼我們。 [04′43″]</p>
<p>   說:「如果這麼認真去追尋一下,沒有一個人例外,就一定願意走善財童子的路。」師父對我們是多大、多深的期望。只要我們願意探尋,我們的心就會非常欣樂地走上一條快速的離苦得樂之路,這個道理完全說得通的,對不對?痛苦的日子快點結束比較好、快樂永遠不要結束比較好,這不僅僅是人之常情,所有的生命都是這樣的,苦都想要快點離開。但是為什麼還有人選擇那麼遙遠的離苦得樂之路呢?這裡邊有玄機嗎?一定要探索一下。 [05′24″]</p>
<p>   注意!師父把一個非常大的命題、一個非常大的問題,推到你我眼前了。這個問題就是:選吧!有兩條路——快的和慢的。不加思索的,你我當然會說:「我要選快的。」但是那快的是怎麼走上去的?一定要探索!不然就會發生我以為走的是快的,結果我走的是慢的。因為不清楚的緣故、因為可能遠離了引路者的緣故,或者中途退心、換路等等諸多的方式,還有人事的不和合我們也會不想朝前走,很多很多理由都會走上岔路。所以師父是以這樣一個非常非常殷重的態度,微笑著、笑咪咪地給我們講這兩部經典的意趣,就是希望我們能夠選擇一條快速的路,是吧!你也是這樣想的吧? [06′31″]</p>
<p>   會不會覺得在《菩提道次第廣論》第一盤 B 面的時候,師父居然就把成佛的兩條快、慢之路指示出來了,精彩吧!而且被誰聽到啦?就是被正在聽的你聽到了,有快、慢兩條路。這兩條路聽到了之後,如果有人因為聽聞這部經典走上了快路,那你省掉了多少受苦的時間?就是因為聽聞到師父給我們說法。 [07′04″]</p>
<p>   所以你說聽聞可以離苦嗎?聽聞可以縮短受苦的時間嗎?由於聽聞,我們可以改變命運嗎?因為我明了了哪條路是錯的、哪條路是對的,哪條路是苦的、哪條路是少受苦,甚至是很快可以得到快樂的,那我在一開始的時候,就可以做一個非常非常明晰的選擇,然後踏上去。不是胡亂地就開始踏步走,沒看清方向就走了。 [07′34″]</p>
<p>   常常會遇到那種事,說:「某人某人!請你幫我做一件事。」那個人說:「好!」走了。過一會兒他回來說:「欸,你要我做什麼?」常常會發生這種事情喔!沒聽清楚要幹什麼,也沒聽清楚次第,第一步、第二步、第三步都沒聽清楚,人已經出發了,所以他自然要回來重新問路,這樣就浪費時間!如果他一出門就掉到坑裡了,還得去找救護車啊什麼把他救出來、療傷,療完傷了再過來問路、再能啟程。所以是很折磨的! [08′09″]</p>
<p>   那麼這件事重不重要,在我們的生命中?我們常常去研究很多讓自己心情變好的方式、讓自己的心變得輕鬆的方式,那麼這個很多生都會輕鬆的方式,會不會引起我們的注意力?我們會不會非常非常在意師父用兩部經典作為依據提出的這兩條路?難道這不是十方諸佛的心意嗎?十方諸佛的心意,如果沒有善知識來告訴我們的話,我們即使閱藏,看了很多大藏經,能不能結論出:啊!有一條快路、有一條慢路。能不能這樣明晰地下結論?所以說:「聽君一席話,勝讀十年書。」有的讀了很多年不知道有兩條路;或者知道了,但是怎麼走的、次第是什麼,也是不明了的。而且知道了之後,會選擇那條快路嗎?有勇氣選擇嗎?還是就甘居遠路?自己給自己下定義了,因為並沒有了解遠路上的心酸啊! [09′18″]</p>
<p>   所以這要何等的勇氣給什麼也不懂的我們上課,一開始就揭示成佛,然後就把無明的概念揭示出來。要揭示正確學習佛法的方式、要結合內心,還要提出結合內心也要有兩條路:有一條是最快地把心中的痛苦都去掉、快樂都圓滿,還有一條很慢地才能達成這樣的目標。絲絲入扣地把我們引入到一個對正確之路的抉擇上。非常地明晰,師父的講說非常地明晰、非常地簡潔,讓我們聽起來心裡是乾乾淨淨的、明明白白的,沒有什麼玄而又玄的道理,非常地清楚。怎麼選?有沒有得選?一個那麼苦、一個一生取辦,這還需要選擇嗎?假如你稍作探索,都會這樣去選擇。關鍵就是要明了如何是快速之路! [10′25″]</p>
<p>   提到這一點的話,我做一個小插敘。當我們跌入到一個痛苦情緒之中的時候,我們知道快速地從中出離的辦法嗎?就是從一個不好的情緒裡、一個負面的情緒裡要用最快的速度出來,還有一種用很慢的速度出來,這也同樣是涉及到速度。習慣繞遠路,和習慣抄近路,就是走兩點之間最簡捷的路,其實這也是一種習慣——習慣迅速地離開痛苦,不留戀痛苦。提到這點,說:「哎呀!怎麼可能留戀痛苦呢?」自己想一想吧!一件事想了很久也想不明白,在那個胡同裡轉呀、轉呀,就是轉不出去,因為沒有對這件事有一個正確的認識,所以放不下心中的重擔、放不下痛苦,就是被痛苦糾纏啊! [11′28″]</p>
<p>   以前在研討《廣論》的時候,也會常常聽一些居士講家裡的痛苦。一開始的時候聽一遍,後來還是聽、還是聽,可能半年的時候還是聽,後來我發現:就是那一模一樣的痛苦嘛!重複了很多遍,還是那個!她是很痛苦的,她一直講,因為她想不開啊!因為對方沒有改變,所以她一直很辛苦。有一天我就跟她說:「這類事情你已經跟我講了半年了,都是幾乎同類的事情。講了之後你心裡稍稍有一點舒服,但是回去之後又開始發作了,是不是我們得找到一個究竟讓你不再這麼痛苦的辦法?」所以我就跟她說:「那我們就聽師父的帶子吧!」 [12′15″]</p>
<p>   傾訴可以讓內心輕鬆,但是傾訴可不可以解決苦因?你能不能諒解你認為傷害你的那個人?怎麼樣發生諒解?我們必須去吸收新鮮的理路。注意!「必須」是自己給自己說的。必須去用一個嶄新的觀點來看待這件事,尤其是要承認自己對自己的痛苦有責任。你為什麼要讓自己過得這麼痛苦?別人那樣對你,你就痛苦嗎?這件事是確定的嗎?一個有毒的食物和一個有機的食物,我們當然會選擇吃有機的;那別人給你一個有毒的食物,你為什麼要大口吞下,而且要承受中毒的痛苦呢?你要設法清楚它、設法辨認。 [13′08″]</p>
<p>   所以很多道理都在說:真正的苦樂,其實操縱者是在於我們自己。佛法就是在告訴我們這些,如何操作內心讓它生出快樂、遠離痛苦,所有的道理都直接指向操作面,最先操作過來的一定是自己的認知。所以,聽了今天師父用《法華經》和《華嚴經》揭示了這兩條路之後,可以想一想:當下我可以心情變好嗎?我可以對別人微笑嗎?我可以對我的親人、朋友或同事說出感恩的話嗎?還是就讓自己的心泡在苦水裡,也不願意出來?不願意出來會習慣的,而且串習久了會得抑鬱症。要非常地小心自己的負面作意、負面情緒,千萬不能耽著得太久,要快快地、快快地離開那種情緒,要走一條快速的離苦得樂之路! [14′07″]
<p>   再問一個問題:有一條快路、有一條慢路,請問誰將走上慢路、誰將走上快路?這兩條路是給誰展示的?是我們,是吧!那麼誰將走快路、誰將走慢路,是誰在決定?是別人決定我離苦得樂的快慢,還是我自己決定的?如果我自己能夠決定快慢的話,我何必受那麼多苦呢? [00′46″]</p>
<p>   所以師父處處都在揭示:我們是否能夠明了我們要主宰自己的身心?談主宰太不容易!我們的心就像一匹脫韁的野馬,很難控制,所以才會在悲傷的海裡不停地沉淪,主宰不了。所以才說佛法難,難就難在哪兒?開始對付心的時候,就沒有像聽懂感覺那麼好了!因為最先遭遇的就是先要認識到這個痛苦、這個痛苦對自己是有傷害的,接下來你要想離開它。 [01′31″]</p>
<p>   比如說壞心情,早晨起來你就莫名其妙地心情不好,由於作了惡夢,或者身體不舒服,或者其他的原因,或者今天的事情多等等,或者你突然想起了一段事情,總之就心情不好。那麼心情不好之後,是否延續一天?是否把這種態度帶給遇到你的所有的人?還有一種就是假裝很快樂,其實心裡那傷口越來越深,都是一種自我折磨的方式。但是我們是不是很習慣這種方式?還是習慣發現了自己的負面情緒和負面的思路——注意!我說「發現」兩個字——思路一出現的時候趕快停止它,這是不是最快速的當下離苦?當下轉! [02′20″]</p>
<p>   我再說一遍:如果能夠主宰快和慢的話,誰願意走慢路?那麼為什麼不能夠主宰?是天生不能夠主宰,還是缺乏訓練?武林高手是怎麼出現的?小的時候都有一段跟著師父非常艱辛的訓練過程,對不對?一般都出現什麼大雪的時候也練、酷暑的時候也練、被師父修理、什麼都學不會,然後冥思苦想武功祕笈......經歷那個過程,最後就練成武林高手了。沒有什麼其他別的東西! [03′04″]</p>
<p>   就像一個賣油翁,哎呀!那個賣油的人特別厲害,他在那個瓶口上放上一枚銅錢,然後他就把油從那個銅錢的孔——古式銅錢的孔,四方的那種,就透過那個孔,倒到買油人的瓶子裡去。然後那個銅錢的邊緣是不會沾上油的,厲害吧!有人問了那個賣油翁說:「這太了不起了!這是怎麼練出來的?」那個賣油翁說:「無他,唯手熟爾。」沒有什麼其他的,只是我熟練罷了! [03′44″]</p>
<p>   所以離苦得樂之路要從當下開始練起,不要讓壞心情、壞情緒、壞的思路牽絆你,一定要快點把它斬斷,快點離開它!真正地說,當煩惱生起的時候,我們要像抖落跑進懷裡的蛇一樣,可是有多少人把自己的壞心情看成是進入懷裡的蛇呀?有那麼害怕嗎?通常壞心情生起的時候,我們就待著、就靠著、就瞇著眼沉在裡邊;沒有覺察、沒有覺知、沒有覺照,所以就越沉越深。沉到很深的時候發現:哇!透不過氣來!再想跑出來,費盡了辛苦。所以速度,速度!最先覺知——看到它,然後扭轉它。 [04′41″]</p>
<p>   所以「速度」這兩個字,是不是我們這節課學得非常重要的一個概念?平常也學速度啊!但是離苦得樂的速度是什麼呀?就是要我們對我們的心快速地了知它在幹什麼。如果它在痛苦的話、在攪煩惱的話,那要停! [05′03″]</p>
<p>   有在聽嗎?有在聽嗎?要試著在苦樂上去獲得稍微一點的主動權,要試著去操縱這個方向。那些修鍊地非常非常成功的高僧大德,就是勤苦練習呀!師父在他的日記裡,每一篇都是勤苦地練功夫啊!所以在心上練功夫即是!不要慨嘆佛道難啊,大家一定要好好地努力哦! [05′35″]</p>
<p>   好,師父舉了這兩部經典說有兩條路,就是快路和慢路、近路和遠路。那問大家一個問題:從這兒到某地某地,怎麼走是近的呀?我們去問路的時候會問誰呢?是問走過的,還是問沒走過的?一定是問走過而且很熟練的。他說:「我家就在那邊!就這麼近,你朝這條路走吧!」我們從小到大一定都問過路,問路的時候,有沒有遇過那種指路給你指說:「一直往前走,左拐、右拐!再向前走,再左拐、右拐!」拐拐你就迷失了,你就不知道怎麼走了。但是有的碰到好的指路的,他就給你講,講完他發現你一臉困惑之後,他說:「那我帶你走吧!」這個時候可能有人會跟著走,可能有人會害怕不知道被帶到哪去。但是給我們講這兩部經典的是佛陀,他已經究竟地離苦和究竟地得樂,而且他有慈悲心要幫我們,他的方法是正確的,所以跟佛去問怎麼樣成佛是快路、是遠路,應該是最好的。 [06′54″]</p>
<p>   所以走上快路和慢路最根本的那個條件是什麼呢?誰知道此路快、誰知道此路慢?一定是走過的人。那你說走過的人,他一定是走過了慢路,才知道那條慢路嗎?一定要被火燒到,才知道火會燒人嗎?遠遠地看著它烤就可以了吧!認知毒藥的人,你不能說被毒死了所以才認知,不是這樣的!因為聽爸爸媽媽說、聽老師說、聽科學家說這是有毒的,所以就不靠近。 [07′34″]</p>
<p>   姑且不討論這個。再問一遍:誰是知道近和遠的人?如果那個知道近路和遠路的人,決定要帶我們走近路的話,我們要跟著走嗎?當我們遠行、當我們不知道路,我們需要嚮導嗎?如果這個嚮導對我們伸出了慈悲的手,我們願意把手伸出去,跟著他嗎? [08′02″]
<p> 【聽聞前行】<p>   在研討《廣論》的時候,我常常都比較強調:希望大家能夠仔細地聽師父的錄音帶。因為在師父的講說中、在師父的語氣裡,還有他投入的情感,我們可以聽到師父比如說他特別贊同什麼、他特別擔心什麼,還有特別期待我們怎麼做......,好像師父陪在我們身邊。聽久了之後,就不會產生那種疏離感。尤其是我們這些年輕一輩的,一開始有人會覺得聽師父的口音聽不懂,這是源於什麼呢?就是不太熟悉。其實師父的發音是滿清楚的,一旦熟悉了師父的語氣、他的表達方式之後,我們就會覺得講得是滿清晰的。 [00′59″]</p>
<p>   在聽帶子的時候,其實可以訓練我們一種專注的能力。因為我曾經問過一些廣論同學說:「你聽師父帶子的時候會不會走神呀?」問了很多人,都說:「會走神。」「那走神多久會發現呢?」常常說:「走了一大半才發現。」然後我說:「那你發現這一段聽了走神之後,你會不會補聽呢?」有一些同學就聽過去了,有一些會補聽,但是回頭補聽的時候又走神了! [01′31″]</p>
<p>   我們也在班上做過這樣的一個調查,就是同一段看你聽多少遍才會不走神。結果有一個同學聽七遍到那裡都走神,非常非常奇怪,一到那個地方他思想就飄忽了。他覺得很驚訝,為什麼這一段他反覆地都聽不到,就是到那一段,好像什麼東西障蔽住了一樣,後來就自己起名說「業障」。但是說業障就能聽到了嗎?所以在這個部分,大家聽聞的時候還是要聽仔細,因為我們很多人的習慣,就是聽別人說話的時候,其實也是聽不仔細,通常就聽個大概,然後匆匆忙忙聽完了,就覺得領會別人的意思了。如果這樣學教典的話可能會滿吃虧的,所以大家要認真地聽聞。 [02′25″]</p>
<p>   所謂的認真,也不一定很吃力,只要把心專注在上面,養成習慣,慢慢地訓練自己,到後來只要師父的法音一響起來,我們就會全神貫注地聽。而且如果你累的時候,你真的可以緩解疲勞;如果你憂傷的時候,當你把心緣在師父的帶子上,你很快就忘記了你的憂傷,甚至有人病得躺在床上起不來的時候,我還建議他聽師父的帶子提心力,這樣他會有勇氣撐住在病床上的時光。還有失眠根本沒法睡的,他來找我說:「老師,怎麼辦呀?」我說:「那醫生都說怎麼辦啦?」他說:「醫生也都想辦法了,還是睡不著。」我說:「如果你也不願意吃安眠藥,覺得吃太久了也不行,那試試聽師父的帶子。」結果他就開始聽師父帶子,聽了一段時間,聽著聽著就睡著了,後來師父的帶子就變成他的催眠曲了!然後他就過來跟我說:「這樣會不會很有罪過?一聽就睡著了。」我說:「師父講的法就是為了安慰我們心中的各種痛苦。如果你有失眠的痛苦,那麼一聽師父的法就睡著了,你睡了一段時間,好了之後,你大概就不會睡了,所以就把它當做藥吧!」果然一段時間之後他好了,他聽師父的法就不會睡著。 [03′49″]</p>
<p>   很多人聽師父的帶子或者學《廣論》,感覺生命中有一顆偉大的心在陪伴。我們生命中有很多問題需要討論。有很多人很孤獨,沒辦法討論內心深處的問題,也不知道該怎麼討論;有的時候跟別人討論之後,還反而陷入更深的矛盾之中,所以也提不起來、也放不下,也不知道該怎麼辦。這個時候很多事就不妨不了了之,就來聽帶子。聽著、聽著、聽著,可能是師父非常輕描淡寫的一句話,他就熱淚盈眶或者痛哭流涕,突然觸及他內心深處最深的一個痛,別人也不曉得是怎麼回事,總之就是他被觸動了。 [04′33″]</p>
<p>   每個人都有可能在《廣論》中找到自己被觸動的點,或者自己心靈深處的傷被癒合或者被撫慰的那個點,其實那就是佛菩薩的慈悲吧!當接觸到這個偉大和慈悲的心的時候,我們的身心就會被那如慈母般的佛菩薩的慈悲所撫慰。我們在生命的過程中所受的所有創痛能夠早一點好起來,然後我們依然能夠健步前行,依舊可以給自他創造一個幸福的感覺、幸福的氣氛,甚至是為自他生命的提升帶來很大很大的饒益。所以大家要打起精神來聽帶子,然後聽帶子的時候絕對要努力——不要昏沉、不要散亂! [05′26″]</p>
<p>   雖然說這幾個字輕鬆地講出來:「不要昏沉、不要散亂。」大家都知道一聽帶就昏沉的人,真的是一打開帶子就昏沉,然後什麼時候聽完了,他就醒過來了。但是我們這麼一小段、一小段聽,應該你想睡的話,也睡不了多久就會被叫醒;散亂的話,也會被迅速地叫回來。所以慢慢地養成自己要知道自己的心在散亂、昏沉,「欸!我在昏沉!」要能覺察到,覺察到之後立刻就拉回來,立刻就把心力提起來。這樣的話,提升我們聽聞水準,我們就能夠更清晰地了解師父的心意。所以聽聞要聽得準確,然後要反覆地聽、重複地聽是滿重要的!尤其是在這麼忙碌和浮躁的這種狀態之中,如果真能夠靜下心來,好像整個宇宙中只有師父的聲音,師父就坐在自己的面前——「如在目前、如對聖顏」,好像就為你講《廣論》一樣。那樣的時光也是滿美妙的。 [06′38″]</p>
<p>   我們生命的正在進行式,說「人生不如意事十有八九」,這是我們常常都會講的一句話。所謂的不如意,就會給我們的心中帶來很多失落呀、悲觀呀,還有焦灼、無可奈何、徬徨等等諸多的這些痛苦。實際上每一天、每一天,如果我們已經脫離孩童時代了,我們就將面對成長後的很多煩惱,這些煩惱有的也解決不了,就是一直在進行。那麼如果在這個心續之中隔出一個小小的空間,在這個空間裡,就好像我們走進師父在鳳山寺的辦公室,跟師父請益一樣。那個時光就是,我們突然從一個喧囂的塵世中走進了寺院,然後走到了一個非常非常親切、非常非常熱情、目光很深邃的這樣一位老和尚的面前,坐在他的面前聽他說法。 [07′56″]</p>
<p>   這樣,對我們的生命是不是一種充電、補給,還有靈魂深處的一種給予?因為你會發現師父他對我們最大的所求,應該就是希望我們幸福、希望我們快樂。他字裡行間滿滿的心意,都希望我們能夠剎那剎那都擺脫痛苦,達到一種無憂的生命境界。所以如果能夠常常感受到這樣一顆心,在這個宇宙間他滿滿的慈悲在關照著我們,一直在試圖跟我們的心靈對話,一直在講給我們聽,一直在講。這樣的話,是不是可以你自己遇到問題的時候沒有那麼孤單和無助?因為至少會想起來:哎!我還有師父的法可以聽。在聽他的法音的時候,不管有多少難纏的心事,在那一刻都彷彿寂寥無聲,只有他的法音和我滿滿的信心,人生的很多問題看起來也沒那麼艱難了。 [09′13″]</p>
<p>   為什麼?因為「法」會提醒我們正念、正知、正行、正能量,會讓我們從情緒的陰霾中走到陽光下,聽一聽佛菩薩他對事情的看法,他對這個事情的思路是什麼,我們就隨時會調整我們看一件事情的角度,甚至每天都在調整。如果你憶念師父的法,每時每刻都可以調整自己的心,就像一個座標一樣,可以幫助我們一直調整,因為我們會常常偏離,就要調整。調整到什麼方向呢?就是正確地離苦、正確地得樂,早一點把自己從非常負面的、很糟的一種心境中解救出來。其實沒有什麼比法更快的,或者說更實用的,而且也不需要費什麼代價,就只要心緣在上面就可以了! [10′14″]
<p>   好,那麼我們來聽下一段。大家要注意聽,注意聽! [00′10″]</p>
<p>   所以,如果說你們將來真正要學本論的話,我之所以把課排得比較少的原因,你們要肯學,好好地要去找各式各樣的經論,自己證明。《法華》上面說得清清楚楚,說:我啊,無量劫以來,就把那圓滿的教法告訴你,告訴你了以後,對不起,你就聽不進我的話,總是急急忙忙照你配你胃口的去做,結果就因為這樣,你以為得到了,沒有,沒有得到。所以它中間說了一個什麼比喻,叫〈化城喻品〉,大家還有印象吧?這個〈化城喻品〉,我現在完全用最平常的方式,來說明最重要的意義。就像說,我們現在要去到某一個地方求寶一樣,這一條路是滿長遠的,大家一直跟著那個大商主——大商主就是我們的佛陀,他是完全了解的——去走。哎呀!走在路上是又渴、又熱、又累,大家跑了個半天,又跑不到,眼看著要退心了。 [01′23″]</p>
<p>   那個佛陀就曉得這些人的心量太差,所以這個地方現一個化城:欸,到了、到了!大家覺得好歡喜。結果進了城,喝了一點水,吃飽了覺得很高興。佛陀就說:大家精神振作了,還沒到喔,下面還有路哦!那個時候,他就跑起來,就對了。我想在座的,一定有很多同修,念過《法華》,曉得這個公案;沒有念過,好好地去看一看。 [01′52″]</p>
<p>   這一段在字面上應該沒有什麼難懂的,對吧?那我再提幾個問題。第一個問題:師父說:「<p> 如果你們將來真正要學本論的話......<p> 」有個「真正」二字。然後可以稍作思考一下:為什麼師父要放上「真正」兩個字呢?比如可以說:「如果你們將來要學本論的話......」為什麼要強調「『真正』要學本論的話」?你們有答案嗎?什麼答案? [02′29″]</p>
<p>   通常我們跟一個人討論問題,說:「你給我一點建議。」有人會說:「你要聽真的還是假的?」然後說:「我要聽真的!」說:「那我說了!你是真正地想聽真的嗎?我要說了!」就是說,你是不是真正地要學《菩提道次第廣論》?如果真正要學的話,師父接下來講的話會對我們非常非常地重要,應該說就是這樣一條路! [02′59″]</p>
<p>   所以這裡邊,師父希望我們能懷著非常殷重的心,開始學習《菩提道次第廣論》——那就是一個「真心」,把自己的真心奉獻出去的這樣一種學習。把心投在裡邊,不是浮浮泛泛,或者走馬觀花,而是整個生命投下去的這種力量。 [03′27″]</p>
<p>   接著師父就提出說:「<p> 把課排得比較少<p> 」,然後又說一遍:「<p> 你們要肯學<p> 」。其實,就說「你們要學」就可以了,師父又在「要學」中間加了一個「肯」字,「你們要『肯』學」。肯學是什麼?你願意學呀!要心甘情願學呀!如果是這樣的話,就「<p> 好好地去找各式各樣的經論,自己證明。<p> 」 [03′55″]</p>
<p>   然後有的人說:「哇,這麼多年學一本論!」不是的!學了這本論之後,我們會在這本論裡聽到好多經典!比如說現在就聽到《法華經》,一開篇就聽到《法華》、《華嚴經》。這樣的話,因為《菩提道次第廣論》的原因,很多人就開始讀《法華經》了。誦一遍經也是功德無量,如果把《華嚴》誦一遍的話,哇!那個《八十華嚴》很厚,但是會非常非常歡喜!非常非常燦爛、輝煌的一部經典,大家可以去讀一下。未必讀得懂,但是你讀進去的話是很美的! [04′31″]</p>
<p>   我最初知道《楞嚴經》,就是去一個阿姨家,聽到有人在讀《楞嚴經》。但那個時候我不知道是在讀佛經,就一直聽到說:「阿難!阿難!阿難!」聽到裡邊有個人一直在說:「阿難」。我就離開那個座位跑到她門口,說:「為什麼是阿難?」我就打開門衝進去,我說:「你在說:『阿難』,誰是阿難?」然後就從她手裡把《楞嚴經》拿過來。那個正在誦經的姐姐非常驚愕,可能有點被我嚇到——我哭了。然後我說:「為什麼這個名字聽起來這麼熟,誰是阿難?你在讀什麼?」我就把那個《楞嚴經》拿過來開始自己看,在她面前自己看,好像那個姐姐不存在一樣。 [05′18″]</p>
<p>   如果你認真地誦一本經,誦經的時候,不知道你會利益到多少有情呢!也許還有像我這樣莽撞的人,有一天聽到了突然善根被啟發了,然後就找到了他的皈依——找到了佛陀。 [05′34″]</p>
<p>   所以師父在這裡邊說:「好好地去找各式各樣的經論,自己證明」,就是你要看。證明什麼呀?證明《菩提道次第廣論》上講的,是不是有依據的、是不是佛說的。 [05′47″]</p>
<p>   所以接著師父又講說:「<p> 《法華》上面講得清清楚楚<p> 」,清清楚楚的什麼呢?下面一大段還記得嗎?師父就說:「<p> 我啊,無量劫來......<p> 」這是誰的語氣呀?說:「<p> 我啊,無量劫來......<p> 」,「無量劫來」是多長時間啊?無盡的,從過去到現在,無盡的。「<p> 就把那圓滿的教法告訴你<p> 」,告訴誰呀?我們可能說:「在《法華經》裡,是告訴《法華經》裡聽到《法華經》的那個人。」但現在我們也聽到《法華經》了,所以就把那圓滿的教法告訴我們。「<p> 告訴你了以後,對不起,你就聽不進去我的話,總是......<p> 」注意哦,看!告訴了之後,對不起,聽者聽不進。聽不進的選擇了什麼行動呢?「總是」,注意有個「總」字,不是說一會兒這樣,他總是、一直是——「<p> 急急忙忙<p> 」——那狀態,急急忙忙。幹什麼呢?「<p> 照你配你胃口的去做<p> 」。什麼叫照自己、配自己胃口的去做呀?習慣的、熟練的,對吧?想要的、自己願意做的,然後就去做了。「<p> 結果因為這樣,自己以為得到了,沒有,沒有得到。<p> 」 [07′17″]</p>
<p>   可能很多年齡小的,不知道讀這一段是不是會沒有感覺?但是如果你曾經帶過弟弟妹妹的話,其實你也會清楚。你把一件事告訴他很多遍他不聽,他非得照著他自己的習慣。比如你跟他說:「欸!你不要跑、你不要跑,你跑不穩!你不要追、你不要追我!」他一定在後面追你。咔!倒了,然後膝蓋流血了;哇!哭了,然後你就給他包紮。你下次告訴他說:「你不要跑、你不要跑!」又是趴在地上。我們小時候也是這樣。 [07′50″]</p>
<p>   像以前我小的時候,口袋裡裝滿了那個爆米花,我的姐姐們從院子裡衝出去之後,那時候我比較小,我覺得我也要衝。她們一邊衝、一邊回頭對我喊,說:「你不要跑啊!你不要跑,小心你的爆米花都灑出來!」我在想:我才不管!我四個口袋都裝了爆米花。然後就開始衝,衝、衝、衝,我都不知道怎麼回事就突然趴在地上,然後就開始大哭,滿地都是我的爆米花,結果我所有的那些姐姐們都回過頭來要撿。撿完了之後也不能吃了,然後我就開始哭;大家也玩不成了,就一起哄我。所以從一個小孩很小的事情,都可以看到不聽勸! [08′28″]</p>
<p>   所有的老師大概對這句話都感觸頗深。尊敬的老師們,你教學生的時候,你會覺得學生會聽你的嗎?但是不能因為學生不聽就不教,還得繼續教,我們就是送走一屆一屆的學生。看佛陀無量劫來,就不停地把圓滿的教法告訴我們;還有父母親,小孩不聽,也不會停止說呀!對不對?所以這幾句話可以看到佛陀的悲心啊、耐心啊!他無量劫來,在不可稱數的時間內講同樣的教法。 [09′03″]</p>
<p>   學過《廣論》的同學知道在善知識德相裡有一個什麼?「<p> 悲體離厭應依止。<p> 」就數數地宣說法要,就重複地講一件事情。講久了之後你的激情還在嗎?有的人在一件事上講久他就麻木了,但是佛陀的悲心是從來沒有減弱的。因為他已經達到一個圓滿的程度,他剎那剎那都不會間斷,就給我們講圓滿的教法。所以這樣想一想會不會覺得:儘管我們在人生中會遭遇各種各種痛苦,還有師父心疼我們、還有佛菩薩心疼我們,一直想要把我們從自己不停地錯誤的習慣中拉出來、拉出來,一直講、一直講。 [09′47″]</p>
<p>   大家對「急急忙忙」自己有感覺嗎?焦躁的心,趕快找個東西趕快做,然後急於求成啊!對不對?做什麼都是急於求成,沒有做周密的規劃。而且急急忙忙,還要去找一個一定是配自己胃口的去做,結果沒有得到。所以揭示了這樣一個現象,就是佛菩薩的現象是慈悲地一直講;那麼我們的現象就是一直聽不進去,急急忙忙做自己那一套,然後結果就一直在這個苦難中。 [10′27″]</p>
<p>   所以雖然說經典是深奧,但是在我們的生命中林林總總到處都是這樣的例子。但是這樣的例子很多很多之後,我們會不會反思呢?我們會不會由這一個一個的例子,昇華自己的生命呢?就是改掉那急急忙忙配自己胃口的習慣。如果想:「改掉這習慣多困難呢!我不是處處跟自己作對嗎?」我們想要求樂,卻得到痛苦,難道不是作對嗎?與其最後發現作對了,還不如一開始對治自己的習氣,那哪一條路更輕鬆呢? [11′04″]</p>
<p>   道理是可以這樣講,但是真正做起來的時候,就回到師父說的那句話:「真正要學本論的話」、「要肯學的話」,就是真的要聽佛菩薩的話。因為求取無上菩提之路,我們並沒有成功、我們並沒有經驗,就佛菩薩有經驗。所以你不聽過來人的話,自己就是一根筋衝出去了。欸!那到最後又跌得頭破血流,不停地、不停地跌倒爬起來、跌倒爬起來。雖然一直向前衝,但是真的是受了很多傷,耽誤了很多時間。 [11′40″]</p>
<p>   所以面對這樣的一個狀況——不停地講、那邊不停地做自己的,怎麼辦呢?結果居然下面講了〈化城喻品〉!大家走著、走著,不走了——只要遇到困難,我們的常態行為就是:那好,不走了!困難太大所以停止。面對這樣的,師父給個定義說:「心量太差!」但是我們會這樣形容自己嗎?我們會覺得什麼?「不是我心量太差,我已經努力了!是困難太大!」或者說:「周圍人沒有配合我!」或者說:「他沒有理解我!」或者說:「在我該得到你援助的時候你不援助我,我怎麼走下去呀?」我們絕對不會把這個原因歸結到自己身上,說我心量太差。那也許還有一種方式:「沒錯,就是我心量太差,所以我不走了!」就像小孩一樣耍脾氣:「我不想吃飯,爸爸媽媽你能把我怎麼樣?我就不吃!」不吃以後就會長不好,自己受苦,一輩子身體不好。 [12′46″]</p>
<p>   所以在〈化城喻品〉這裡邊講了之後,大家就可以看到,佛陀是用怎樣的心,安慰著這樣的一群弟子們——還沒到地方,佛陀就化了一個城說到了。這個譬喻是譬喻什麼呢?其實無上菩提路可以一直走到那個目的地,但是走著、走著有一些人就說走不了了,然後佛陀就說:「啊!到目的地了。」所以佛陀為我們示現了一個方便。那我們想不想要在化城停呢?還是想要一路到最後的目標? [13′23″]</p>
<p>   在這個〈化城喻品〉裡,我們會不會覺得佛陀好貼心哦!再對比一下我們自己,我們遇到心量差的、不肯配合的,甩掉他就可以了,把他從團隊裡開除;帶著他總是走不遠,總是一路抱怨、一路叫苦,永遠都不行,那把他開除!佛陀什麼?欸!變個化城,說:「你到了、到了!」然後給他喝點、吃點、安慰點、鼓勵點,啊,來勁了!下面又可以走了!所以看到這邊覺得滿溫馨的。但是也是在想:一直要佛菩薩化城給我們嗎?如果能夠徹底地信任佛陀、徹底地信任佛菩薩,就一直走下去,你要走多遠就走多遠,真的會累死嗎? [14′09″]</p>
<p>   所以當我們不停擴大我們的心量之後,其實我們會發現:我們的心到底能承載多少東西呢?我們還有多少腦細胞有待開發呢?我們大腦的容量到底有多大?這一輩子使用了多少?為什麼都覺得做不了了、沒有慧力了?那麼多的細胞都睡著,根本就沒有把它喚醒!這是科學家說的吧? [14′36″]</p>
<p>   所以要把那麼聰明的,比一個特別特別、宇宙最厲害的計算機還厲害的——我們的慧力激發的話,那你說我們到底這一生能成就多大的事情呢?但是,是不是就甘於眼前的痛苦、甘於這樣的現狀,沒有去用一個非常圓滿的設計,為自己的人生有一個非常美妙的規劃,然後去衝刺?拘泥在現狀的痛苦之中,不敢去奢望更美好的未來。 [15′07″]
<p>   好,大家再聽下面一小段。<p>   這個地方,我不強調後面的,只說明什麼?說明我們真正要想學這個佛,應該一開頭的時候,先心平氣和,耐下心來,把佛要告訴我們的,正確圓滿的教法認識了,然後你開始去一口氣走的話,這個就是一生取辦。否則的話,你急急忙忙去做的話,這條是遠路,這條是遠路。究實說來,在我們沒有正確了解之前,因為我們畢竟是個凡夫,自己我也一樣地感覺:哎呀!叫我去一聽見那個佛法這麼難走,這麼長遠,誰都會害怕。但是如果你有了正確的認識,正確地了解以後,誰都會取後者,因為你害怕的結果,並沒有因為你害怕而省力呀,反而讓你吃盡千辛萬苦啊!這是個真實的內容。所以真正重要的,假定說我們能夠如法地去了解這個完整的內容,然後去走的話,倒反而來得省事。 [01′18″]</p>
<p>   這是非常小的一段。我想問大家第一個問題,就是:急急忙忙要去找配自己胃口的去做,然後結果以為得到,後來沒有得到,這種毛病怎麼治啊?有在這一段找到治療的藥方吧?「<p> 說明我們真正要想學佛,應該在一開頭的時候<p> 」,師父講了四個字,什麼啊?「<p> 心平氣和<p> 」,心平氣和前面有個什麼?「<p> 先<p> 」心平氣和,別著急!別著急!然後「<p> 耐下心來<p> 」,你看急急忙忙的不就是老著急、不心平氣和嗎?說耐下心來做什麼事情呢?就是「<p> 把佛要告訴我們的,正確圓滿的教法認識了。<p> 」 [02′12″]</p>
<p>   「佛要告訴我們的正確圓滿的教法」,注意!這裡邊出現了「正確」,又出現了「圓滿」。所謂的圓滿,就不是支支節節的,它是沒有殘缺的、一路上去的。所以「認識了」,注意!這個認識,比如說:「欸!說起某某人,你見過他嗎?」說:「沒見過、不認識。」那說:「你鄰居的臉,你記得清楚嗎?」「清楚。」「你姐妹的臉清楚嗎?」「清楚。」「爸爸媽媽的臉清楚嗎?」「那不僅僅是清楚,太熟悉了!」認識了之後,我們就一口氣開始走上去的話,師父說:「<p> 這就是一生取辦。<p> 」三行字哦!就把這麼大的一件事情交代清楚囉!想一想我們要描述一個這麼難描述的事情,豈能三行字解決啊! [03′02″]</p>
<p>   所以,先是一個心平氣和的狀態,要了解的對象就是正確圓滿的佛陀的教法,一口氣開始走上去的話,這就是一生取辦。注意!下面反方出現了。「<p> 否則的話<p> 」,如果不這樣做的話,我們會變成什麼樣呢?又是老毛病發作了,「<p> 急急忙忙地去做<p> 」,就是又配自己胃口的,覺得做得挺來勁、挺開心,但是「<p> 是條遠路<p> 」。 [03′30″]</p>
<p>   接下來,「<p> 在我們沒有正確了解之前,因為我們畢竟是個凡夫<p> 」,師父說:「<p> 我也一樣地感覺,叫我去聽見佛法這麼難走,這麼長遠,會害怕的<p> 」。「<p> 但是如果有了正確的認識,正確地了解之後<p> 」,注意!又出現了正確——正確的認識,正確地了解,師父接下來的結論是:「<p> 誰都會取後者。<p> 」是這樣嗎?有疑問嗎?正確地了解了之後,我們就會取一生取辦嗎?為什麼?為什麼?你們有看手抄吧!誰答一下? [04′16″]</p>
<p>   (弟子回答:「<p> 因為你害怕的結果,並沒有因為你害怕而省力,反而讓你吃盡千辛萬苦!這是個真實的內容。<p> 」) [04′21″]</p>
<p>   所以我們害怕這條路遠,對吧!然後覺得:我想那個可能是比較省力的。因為他在這裡邊一定是不願意照著佛陀一口氣走上去,就說太累了,我要找一個省力的辦法。為什麼要省力呢?因為我缺力、沒力,所以你要我跑那麼長遠的路我跑不到。師父說這種害怕的心,反而讓我們吃盡千辛萬苦。注意哦!真的嗎?真的嗎?我們能信任這句話嗎? [04′54″]</p>
<p>   我們都是為了躲避恐懼的那個結果,所以選擇當下的行為,結果選錯了之後,反而讓我們更害怕,而且比原來還吃盡千辛萬苦,這種事情很多吧?不會因為我們害怕,然後急急忙忙選擇那結果,我們害怕的就不會出現,反而會更加地辛苦。是真的這樣嗎? [05′18″]</p>
<p>   問完了之後,接著師父下面那幾個字是:「<p> 這是個真實的內容。<p> 」師父後來又結論說:「<p> 所以真正重要的<p> 」,就是破那種急急忙忙的狀態,「<p> 真正重要的,假定說我們能夠如法地去了解這個完整的內容<p> 」,又出現了!前面說圓滿正確,現在又出現了完整的內容,「<p> 然後去走的話,倒反而來得省事。<p> 」就是一開始不要忙著去做,先把整體的作戰規劃搞清楚,看一看我們無量劫來的生涯規劃是什麼,我要走到哪裡?先把這個成佛的地圖看清楚。 [06′02″]</p>
<p>   我常常說空照圖。誰拍的呢?佛菩薩拍的。然後又有嚮導,先搞清楚這所有的路,然後再開始走。不要路在哪兒都不知道馬上就上路了,那肯定不知道走到哪裡去了!你要走東山,可能不知道拐到北山,或者拐到不知道多少莫名其妙的地方去了。因為什麼呢?沒有具備正知見眼,所以行的時候就會有偏差,而且絕對是一條千辛萬苦的路,絕對不是省事的! [06′39″]
<p>   大家好!我們現在開始一起學習、研討《廣論》。在開始之前還是請大家觀察一下自己的相續,看一看自己的呼吸是否很平穩?心是否是有些亂、有些慌張?我們在觀察我們內心的時候,常常會發現:啊!好多念頭像流水一般向前趕去,像一個無法停歇的跑馬場。但是至少我們可以看到是什麼念頭在奔跑,它們跑向哪裡。這時候我們會發現:啊,有一些念頭可能應該停了,應該專注到《廣論》上。 [00′56″]</p>
<p>   為什麼要專注到《廣論》上呢?師父說了,人生的頭等大事就是要考慮:究竟什麼是離苦、什麼是得到快樂的那條最究竟的路?次第是什麼?因為生生世世都是在尋覓著如何離苦、如何得樂的這件事。如果在此時此刻、在研討《廣論》之前,我們能夠再一次地問問自己的心:什麼是真正的離苦得樂之道?究竟離苦得樂的那個果位就是佛果,那麼成熟它的因是什麼?成佛的因是什麼?這個因,我們怎麼才能夠得到、才能夠知道呢?當然要聽聞,要從聽聞得到。要聽聞的話,我們就必須知道怎麼樣聽聞——首先要了解聽聞的勝利,乃至如果不專注聽聞的話,會有什麼過患。 [02′08″]</p>
<p>   這些可能學過的老同學都知道,新學員可能還不太清楚。只不過現在還是要注意到那個問題:為什麼來上這節課?就談到了發心。發心會牽引我們的心朝著一個方向走去,然後也會朝著那個方向成熟為未來的結果。所以我們今天還是要再再地策勵自己——哪怕是造作的也可以——為了利益無窮無盡的有情,我必須去成佛;為了成佛,我要來聽聞《菩提道次第廣論》。所以這一節課無論時間多長、多短,我所造作的業都是為了成就無上菩提。那麼對我們來說生生增上,它的未來,時間是非常地悠遠,有一個無盡的精進的過程,所以想起來還是滿令人歡喜的! [03′05″]</p>
<p>   那麼接下來我們要聽師父講的這個譬喻。可能這節課你們都預習了,因為常常跟你們說,在我們研討之前,一定要把師父講的原文預習一下。預習的時候,你們就會提到問題,或者有一些什麼樣的感覺。這樣的話,我們今天再一起研討的時候,就是再一輪、再一輪,它就會有不一樣的提升,所以事先聽聞非常地重要!而且事先你找幾個同學一起研討一下,大家各自的難點都不一樣,各自的著重點也不一樣,實際上是非常興趣盎然的一個探索。我希望學習《廣論》是非常非常令我們生歡喜心的一節課,是一個減壓的課,是一個把心中很多很多糾結逐步打開的這樣一節課。所以請大家要專注地聽聞,下面就可以聽師父的帶子。 [04′09″]</p>
<p>   那麼在這個地方,我來說一個比喻,說明這件事情。比如說,我們現在來造房子吧!這麼說,我們覺得要造個房子,那麼,夏天太熱受不了,冬天太冷,颱風的時候......造個房子。急急忙忙造一個房子,簡單一點,只要可以住得進來,只要弄個鐵皮釘一釘,是,什麼都不要。到了那個時候發現,不是的呀,這個房子不夠呀!你要真正地要想達到圓滿,不是這樣。那麼這個比喻什麼?就像我們現在覺得很苦惱,那麼我們趕快要找一個安樂的地方躲起來呀。結果我們發現,真正徹底圓滿地要躲掉這個痛苦,得到這個安樂的地方要佛,像造個房子,要造一個摩天大廈一樣,所以那個時候你要重新改建。 [05′05″]</p>
<p>   這一小段大家剛才有注意聽吧?我來提個問題哦!很多同學這一段可能已經聽到好幾十遍,或者很多遍了,就是造房子和重新造的問題。那麼在一開始的時候,師父用建造房子這樣一個例子,首先說了為什麼要造房子——當然為了抵禦很多痛苦,比如寒冷啊、酷熱呀、颱風啊!然後接著師父說了「<p> 急急忙忙造一個房子<p> 」,注意這四個字「急急忙忙」造一個房子。然後下面又出現「<p> 簡單一點<p> 」,然後又出現「<p> 只要可以住得進來,就弄個鐵皮釘一釘,是,什麼都不要!<p> 」所以可以看到這是一個解決急需狀態的人,對吧?因為他想要趕快地離開痛苦,離開這些颱風啊、什麼酷熱、寒冷啊,就用鐵皮釘一釘,就是鐵皮屋吧!他需要一個鐵皮屋,在鐵皮屋裡邊可以讓自己舒適一點。 [06′17″]</p>
<p>   注意哦!下面我提的問題就是說:你是要一個鐵皮屋嗎?你的精神深處只需要一個鐵皮屋,然後你就得以安靜地休息在其中了嗎?或者安靜地愉悅在其中了嗎?鐵皮屋可不可以讓我們的心真正地達到徹底的愉悅呢? [06′42″]</p>
<p>   師父下面話鋒一轉說:「<p> 到了那個時候發現,不是的呀,這個房子不夠啊!<p> 」到了哪個時候發現?哪個時候呀?有答案嗎?到了什麼時候他發現:這些東西還是不能夠令我的精神達到徹底的大自在,達到究竟無憂無慮的那樣一個狀態?就是這一個鐵皮屋實際上不能滿足我的需求。當人們發現了這一點之後,可能要重新來過。所以師父說在這裡邊比喻,說:「<p> 現在很苦惱,趕快找一個安樂的地方躲起來。<p> 」趕快找一個安樂的地方躲起來,他這個安樂是對比於原來的痛苦,是安樂一點點。但是師父說:「<p> 結果我們發現,要真正圓滿地躲掉這個痛苦,得到這個安樂的地方要成佛。<p> 」「<p> 結果我們發現<p> 」,注意哦!他這裡邊有好幾個轉折了,說:「<p> 到了那個時候<p> 」,然後「<p> 結果我們發現<p> 」,這都是什麼時候呢?為什麼他到那個結果他發現了呢?說這個佛果就比喻成一個摩天大廈,所以那個時候你要重新改造。 [08′07″]</p>
<p>   在這裡邊我要提的問題是:只有錢蓋鐵皮屋,會想要摩天大廈嗎?有幾個人一開始就會想要摩天大廈?他會覺得鐵皮屋就是我全部的夢想,有了鐵皮屋就滿足了。從鐵皮屋到摩天大廈的嚮往是怎麼發生的?為什麼這個一開始用鐵皮屋就可以滿足的人,後來卻想要摩天大廈了?因為這樣才要改房子,如果從始至終只要鐵皮屋,他就不會想改房子。為什麼?為什麼他想要摩天大廈了? [08′49″]</p>
<p>   如果他要摩天大廈了,那我再問大家一個問題:是不是他從心裡邊真正地需要摩天大廈?需不需要?他發現了他內心的這個需要。那麼為什麼他發現了內心這個需要呢?他一定是看過摩天大廈,哇!發現這裡邊什麼都具足,又避震啊,還有很多,可能什麼功能都具足,而且夏天不熱啊、冬天不冷啊! [09′24″]</p>
<p>   當然這裡可以譬喻,我們這個成佛的路上,比如說有親近善知識法,然後念死無常、三惡趣苦......所有的法類,讓我們的內心生起證得的那些類別,全部都具足。如果只了解部分的道次第,比如說只了解一個念死,甚至連念死的次第都不知道怎麼修,你就是得到那點東西——也是沒錯——但是你一看到這麼琳琅滿目的寶物、這麼壯麗的摩天大廈的時候,是不是內心中才會生起那個志向,說:「我要摩天大廈!」否則是不知道世上還有比鐵皮屋更好的東西,我覺得我得到的可能就是全部了。 [10′09″]</p>
<p>   所以這個人就說:「不是這樣!」然後到那個時候還有說:「結果我們發現......。」這過程需要他視野的一個開拓、心胸的一個開拓,他已經站在一個很高的地方瞭望過了遠景,然後他發現他那個起點好像放得不太對。所以這個時候,這鐵皮屋就成了障礙了!就是這個人進步了,他發現他最初的那一步是障礙;如果他沒進步,他發現他一開始沒錯,可能還沾沾自喜說:「我那個小鐵皮屋還是不錯,因為比沒有好。」現在不是說鐵皮屋跟沒有比,是鐵皮屋跟什麼比?跟最圓滿的、心中的自我的生命狀態要達到的那個境界相比。所以這個人志向出現了,他的志向!如果他的志向一出現的話,那豈是這個地方能圓滿他的呢?所以接下來可能麻煩就來了。 [11′12″]
<p>   好,現在我們來聽下一段。<p>   不過這個地方我們往往有一個問題就來了。那你改建,第二次改建的時候,這個老房子嘛,拆掉重來,拆掉重來一趟還可以。我們往往有這個毛病,說:「哎呀!現在這個一間不夠......」因為我們南普陀就是最好的典型,一間不夠再加一間,一間不夠再加一間;東加一間、西加一間,往東面加一間,往上面加一間,往那面加一間,加得非常凌亂,到後來,你簡直不曉得它怎麼辦是好!不過,好在我們現在這個架子向兩邊還寬;實際上它不是,它是個高樓大廈。我說一層,然後呢,二層,對不起,你造三層的話,這地基不穩,不行的。怎麼辦呢?把它拆掉重來,所以我們往往說造了三層,造一層的時候,覺得馬馬虎虎,造了再說。要造二層,還可以,造到三層的話,把三層全部拆光,地基重來。然後呢,造了四層、五層,到了那時候,你又全部拆光又全部重來,我們常常做這種事情。 [01′04″]</p>
<p>   剛才說當我們有了一個志向之後,我們的問題就來了,請問是什麼問題呀?師父的原話說什麼呀?「改建」是吧?改建。改建是什麼意思啊?就是把老房子拆了重來對吧?然後師父說:「<p> 拆掉重來一趟還可以,我們往往有這個毛病<p> 」,看起來這件事就不是一趟,是不停地重複的,就是拆房子、蓋房子、拆房子、蓋房子......,我們蓋的東西就是為了將來拆掉,是不是這樣?我們不停地蓋、不停地蓋,只是為了把它拆掉,要蓋更好的。 [01′48″]</p>
<p>   如果一個人這樣蓋房子,就覺得他家好像滿有錢的,把蓋的房子打掉,比如說一層樓打掉,再打個地基,再蓋兩層樓;過一段時間他又蓋更高的,把二層樓和二層樓的地基全毀掉,再蓋更高的,看起來是非常非常有錢的,因為他不停地折騰。但是他為什麼這樣不停地折騰呢?為什麼他想要越來越多、越來越多?為什麼越來越多? [02′13″]</p>
<p>   還是那句話——隨著聞思的視野的擴展,我們越來越發現我們想要佛果,我們很想希求那個佛果,因為只有那個佛果出現,我們才能夠去利益所有所有的如母有情。一開始可能是看到佛法了,非常非常地殊勝,我們只想在這個佛法的大海中取一瓢水,自己解一下飢渴,然後坐在岸上休息一下疲憊的身心,就心滿意足了。但是我們放眼看去,看到越來越多的生命比我們生命的現狀可怕得太多,這個時候就不能滿足於自己被滋潤的這種樂受,我們就要去幫忙那些還沒有找到一滴水的,甚至就要渴死的,我們還要從這裡邊把水送給他。 [03′08″]</p>
<p>   所以隨著我們視野的遼闊,想要利益更多更多的人的時候,我們就發現我現在有的真的不夠、我所學的根本不行,一去幫忙別人馬上就碰壁。那怎麼辦?就得加強自己的力量。要加強自己的力量,就得要「聞多、思廣、修行深」,因為任何的阻礙都跟慧力的高度有關係,智巧才能無憂嘛!所以我們想要去利益別人、想去幫忙別人的時候,就會想要自己變得更強大。變得更強大,不是為了名聞利養,而是真的能夠幫助那些我心疼的人,我不忍心看到這些事情,我不能背對著他們完全裝作沒感覺,也不能裝作我很快地又遺忘,這些都做不到,那我就自己要變得特別特別地強。那利益眾生最強的、最強的導師到底是誰呢?我們天上人間找來找去、找來找去——那還是佛陀!最終我們還是會選擇一定要蓋摩天大廈,所以一定要去成那個佛果。 [04′22″]</p>
<p>   可是開始亂修的那些——今天在這兒修一下、明天在那兒修一下,最重要的是我們修出了一點覺受之後,就會在那止步不前,而且為那點覺受沾沾自喜,看不到前方更遠的路,也看不到自己的局限。如果我們不請一個非常非常了知這條路的嚮導,去詳細地詢問的話,也許我們在山腳下就以為自己在頂峰了。要對比一下才知道:哦!原來我那是一個鐵皮屋,原來還有高樓大廈。 [04′57″]</p>
<p>   所以,師父講的這個重建的過程是非常非常辛苦的,因為你會發現,你辛辛苦苦建的,最後你又要把它拆掉,費了更長的時間、更多的辛苦。而且,注意哦!這個人有這個毛病,他就喜歡趕快建一間、趕快建一間,然後過兩年趕快拆掉。其實他重建一間和趕快拆掉的動作都同樣地快,因為什麼?沒有總體設計圖。為什麼他沒有總體設計圖呢?可能沒有那種設計高樓大廈的總工程師跟他做朋友。而《菩提道次第廣論》,就是一個成佛總體道次第的藍圖,師父就像一個工程師一樣,把這所有的藍圖怎樣、怎樣設計的詳細地講給我們聽。然後我們開始對成佛這條路產生了熱烈的嚮往,所以就會看到:哦!原來我對佛法那點見解可能連鐵皮屋也不夠,所以這時我們就想拆,但拆完了之後到底會不會急急忙忙又建一個? [06′00″]</p>
<p>   我的意思就是說:道次第、道次第,最初的次第應該是打地基,對吧?最初的次第是打地基,但是一層樓有一層樓的地基、七層樓有七層樓的地基。像去年我們就想把一棟房子改建,就是跟師父說的一模一樣,因為什麼呢?出家人住不下。想去改建的時候,去問那個設計師,設計師說:「這個樓房完全不可能加高,因為它的地基就只有兩層樓。」怎麼辦呢?好吧!那把陽臺再做一個房間,可能還能住幾個人;然後陽臺又住滿了,又住哪呢?想要再往前改;前面一挖會挖到那個管線。所以想來想去還是想把它蓋高,想把它蓋高,又涉及到地基的問題。 [06′49″]</p>
<p>   其實師父舉這個例子非常非常現實,因為城市的人很少有自己想蓋房子,都是拎著行李箱搬進了新家,不知道所有蓋房子的過程。我原來也是不了解的,來到了加拿大之後,跟很多法師一起研究蓋房子的事情。然後我發現有的房子真的是需要拆掉,但是那不是我們蓋的,是別人蓋的,它就在中軸線上,影響整體設計,一定要把它拆掉,可是你又捨不得。後來我們就去問:有沒有一種技術可以把整個房子都搬走的?結果還真問到了!說有一些房子可以從地面上切掉,然後放在一個車上,拉到一個地方再把這房子挪下來,座落到一個新的草坪上。我們就是這樣搬了兩棟房子,其實費用也不是很低,但是總比重新蓋要好一點,所以就把那個房子整個地搬家了。房子搬家那天,我覺得很新鮮想去看:欸!是什麼樣的車可以拉走一棟房子?其實也就是那樣,就是大車嘛! [07′56″]</p>
<p>   當時我就想到師父在《廣論》上講的這個拆遷的公案。拆遷的過程是很辛苦的,比如說你去問一個設計師,說:「我要接一棟房子,怎麼樣再接出一間?」設計師通常都說:「你不能打掉重蓋嗎?」打掉重蓋誰捨得呀?關鍵是那是你的心血蓋的,你捨不得。就像你的覺受,如果一個老師說你的覺受是錯的,你肯聽話的話,還肯改,因為是錯誤的修行方式導出來錯誤的覺受;如果是不愛聽話的,就不敢去找老師了,然後就自己偷偷地還是把自己覺得那個鐵皮屋好的感覺一直留著。 [08′35″]</p>
<p>   所以很多人沒有蓋房子的經驗,我也不能說我有,但是我已經參與了很多建設的過程。在我們僧團如果這樣的話,那肯定環境很快就被我們破壞掉了,因為東加一間、西加一點——啊!這個班來了加幾間,那個班來了加幾間,很快一個寺院區就全部亂掉了,所以它一定要有整體設計圖。 [08′58″]</p>
<p>   那麼對我們的人生來說,我們基於現實的需要:啊!現實需要這個,我趕快去了解一下,學點這個,然後過兩天過關了又不要了。零零碎碎的,忽而東、忽而西,忽而上、忽而下,就這樣,對自己的所學沒有一個總體的次第和一個究竟的目標。花了很多時間東學、西學,但是到底對改變自己的身心上的習氣毛病,甚至建立正確的聞思修的一個習慣,有多大的扭轉?基於眼前的需要而去學的,還是基於眼前乃至長久的需要去學的,這兩者完全是不一樣的。基於眼前的需要學的,你可能很快這個難關過了,你就不想要了;基於無限生命的角度,我們來求取無上菩提,我就知道這個地基一定要深深地打,因為我要建立的是佛果那樣的摩天大廈,那麼它一開始的地基一定是要為那個佛果而建立的。 [10′09″]</p>
<p>   請問:那個地基到底是指什麼呀?為鐵皮屋不用打地基嗎?在地面就好了。那麼可以說這兩個人都在建房子,一個建摩天大廈、一個建鐵皮屋,但是鐵皮屋有可能最後被改掉,這兩個人他們的次第完全是不一樣的。注意哦!現在你們可以想想,一個是要鐵皮屋,一個是要成佛的摩天大廈。這兩人同時建房子,然後鐵皮屋很快就出現了,那個蓋摩天大廈的,可能只是打地基還沒打完,上面什麼都沒有,但是它是非常非常紮實的。那麼為什麼這個人會建到摩天大廈,而這個人只建到鐵皮屋呢?注意!為什麼你會覺得你想要摩天大廈,你不滿足於鐵皮屋?這說明志向! [10′57″]</p>
<p>   志向從哪裡來的?志向從哪裡來的?一般都是老師教的,是吧?我們作為人,怎麼可能行於天地間沒有志向?那麼行於天地間的人就都有志向嗎?志向對我們到底意味著什麼?就是我們對所有生命的那一份責任感,我們對所有的生命離開痛苦、得到快樂的那一份承擔,或者說你的那一份熱衷。如果你覺得:啊!學佛原來可以把我的心變成是這樣子,可以又幫到自己、又幫到這麼多這麼多的有情,那你就要非常小心地編排自己修學的次第。 [11′42″]</p>
<p>   那麼是自己編排呢?還是跟著過來人看一看?所以師父講的是建了一層、拆了一層;建了二層、拆了二層;建三層,想要往上蓋的時候,他連三層都拆掉。這個人就是建多少、拆多少,直到有一天他的地基是為摩天大廈打的時候,他就不用拆了。但這個摩天大廈的地基到底是什麼?是否是一開始走這條路的發心呢?發心就是志向,對嗎?可以這樣理解嗎?就是我想要成佛,和我只是解決眼前問題。如果是只想眼前問題,可能就是不停地拆;發心就為求正等菩提,那麼你的所學都會為自己的這個願力所攝持。 [12′33″]</p>
<p>   不知道你們聽得怎樣?是不是走神了?應該不會吧! [12′39″]
<p>   好,現在我們來聽下一段。<p>   我想我們眼前這種感受很多,我們跑到馬路上,那是剛造好,過兩天又挖一個洞,原來這個還沒弄好;過兩天又挖一個洞,原來那個東西還沒弄好,我們總覺得不方便。現在我們修學佛道也是如此,所以在這個地方不是,我們一開頭時候,先把那個基礎穩固。說我們要造一個摩天大廈,雖然現在沒有這個力量,但是沒有關係嘛,我一步一步來,我一定要從那個基礎造好。如果我有了正確的認識,一開始有這個規劃的時候,你第一步,就把那基礎造得非常穩固。到那個時候,然後再一層樓,到那時候一層樓,你一直造上去,一直造到個摩天大廈。當你一步一步造上去,不是說非常辛苦,當你造了一步的時候,你可以說造好了,你可以安住在一樓;再造了,可以安住在二樓;再可以造上去,安住在三樓。你這樣地層層上去,到最後圓滿的時候,整個的金碧輝煌那個大廈都起來了。這個裡邊的差別,差得天差地遠。 [01′03″]</p>
<p>   這裡邊師父提到了一種心態,說:「<p> 我們要造一個摩天大廈,雖然現在沒有這個力量......<p> 」其實這句話可以對境用在很多很多事上。我們現在不單單是對於成佛覺得沒有力量,我們甚至對著活著每一天要遇到的事情,當壓力太大的時候,我們有力量去承擔嗎?我們還是沒有力量的。那麼,當沒有力量的時候,師父說什麼呢?師父說:「<p> 但是沒有關係嘛!<p> 」我們沒有力量的時候,我們會說什麼呢?會說:「我要退了、我要逃跑了,你來吧!」或者說:「我不管!」很多很多時候,有沒有把師父的這句話想一想,說:「現在我沒有力量,沒關係嘛,我一步一步來。」注意!下面的希望又再一次地出現——「我一步一步來!」 [02′06″]</p>
<p>   我沒有力量,難道是我什麼都沒有嗎?我走一步的力量都沒有嗎?我生起一個善念的力氣也沒有嗎?實際上,還是有的。因為任何看起來很絕望的境界、絕望的事情、令我們絕望的人,我們還是可以在這個對境上,讓我們的心生起一個希望。希望的燈,哪怕像豆粒那麼大,那麼大的光亮,還是可以成為光明的。那也許就是我們腳下的第一步,就是我們踏出的第一步,叫「一步」,然後再一步、再一步,一步一步來。所以在心上是不能輸的,無論是成就無上菩提,還是對於每天面對的大大小小的這些煩煩擾擾的事情,如果自己放棄了去追求一個更完美的、更圓滿的生命狀態,那我們就是真的輸了。 [03′09″]</p>
<p>   所以到底有沒有說「我沒有力量」這件事呢?有的,說:「<p> 雖然現在沒有這個力量<p> 」。但是很多很多時間過後,我難道不會有這種力量嗎?為什麼很多年之後我會有力量呢?因為我一步一步地打著基礎、朝上面走。所以現在我沒有力量這種現狀的下手處是什麼呢?師父說:「<p> 沒有關係嘛!<p> 」我們會覺得「沒有力量」這件事沒關係嗎?沒有力量這件事非常嚴重啊!會造成我們生命的混亂,乃至我們參與到幫忙別人的事情上,也會造成別人生命的混亂,因為我沒有力量,所以滋生了太多太多的問題,甚至是災難。沒有力量這件事,怎麼可以這樣輕輕地說:「沒有關係嘛!」這麼大一個事情,為什麼這樣一位高僧他說:「沒有關係嘛!」大家有思考過這個問題嗎? [04′14″]</p>
<p>   師父他老人家不僅僅是這樣講的喔,他也是這樣做的。在每一次、每一次遇到各式各樣的問題去問他的時候,總沒有絕境的時候,總沒有無路可走的時候;總有一個希望、總有一個落腳處,甚至總有一個令你歡喜的點。所以,當我們遇到覺得自己的力量不足的時候,師父在此處教我們這個理路,可不可以用得上呢?「<p> 沒關係嘛!<p> 」前面那些絕望、沒有力量,可以接到這句話。然後注意:「<p> 一步一步來!<p> 」請問當下的我應該幹什麼?應該馬上轉變由於覺得沒有力量而產生的什麼?很多的像瀑流水那般的非理作意。 [05′05″]</p>
<p>   比如說法師剛去承擔教小班的同學,你怎麼樣上課小孩才能不走神呢?你講的道理,他們聽起來是很親切的,還是很高遠的呢?一講沒講好,就覺得自己沒有力量,沒有力量就可以退嗎?如果大家都退了,誰來培養沙彌呢?還有俗眾的事業也是呀,甚至在一個家裡也是。比如說做一個飯,大家都知道初次學做飯的時候可能都是滿慘的,要不然弄著火了、要不然米生了。我第一次做餅的時候,那個餅就是用牙咬都咬不下來。其實用很大的力氣,要把那個麵餅弄成那樣子都是很困難的,我現在想一想都成了笑話。小的時候第一次烙餅還請我們同學去吃,然後她就用牙咬著那個餅,晃著頭咬都咬不下來,那不僅僅是因為我倆小的原因。把一個麵餅做到那麼硬,刻意那麼硬可能都不容易,所以那錯誤就是那樣的。如果那時候就覺得自己沒有做飯的天分的話,也許以後我見到你們的時候,就不能給你們煮湯喝了。我現在會煮很多種湯,還會炒菜,都是源於我覺得我沒有力量的時候就可以練。其實你們都有這樣的故事。 [06′27″]</p>
<p>   所以這個理路,雖然師父是在蓋房子這個例子裡邊寫下的,但是記住這個理路,終身受用無窮,甚至生生世世受用無窮。當你沒有力量的時候,就想到師父的這個理路——請問當下一步該做什麼?積蓄力量啊、打基礎啊、慢慢強大呀!而不是退怯。 [06′48″]</p>
<p>   所以師父說,注意下面又有一句話說:「<p> 如果我有了正確的認識,一開始有這個規劃的時候......。<p> 」注意!又提到了「正確的認識」。對於沒有力量這件事,我們對它的正確認識是沒有的——沒有力量嘛就退,而不是「沒關係」。 [07′10″]</p>
<p>   所以有了這個計劃之後,把基礎打得非常穩,而且下面師父講了非常令人喜出望外的一件事情。就是有了這個圓滿的計劃之後,我們開始走的時候,一層樓就有一層樓的功夫的喜悅,一層樓亦有一層樓聞思修的光景。有一句話說:「像芝麻開花一樣,節節高。」都是一步比一步更加地喜悅,而且我們每走那一步成功,就可以看一下當下的風光。 [07′44″]</p>
<p>   在跟隨師父學習的時候,也常常會聽到法師們請問師父問題,然後師父回答。那個時候我也在心裡想一個我的答案,然後聽到師父的答案。我就在想:這到底是差距在哪裡?要怎麼學習?那時候我驚訝地發現:無論是什麼類型的問題提給師父,師父一定會告訴這個同學當下的一步是什麼;絕對不會給你提一個跳懸崖那樣的一件事情,你根本就不敢做,或者你根本就覺得腳下是空的。所以師父給我們的理路是非常踏實的,他說:「在可進可退的時候,一定要進一步。」為什麼進一步?進一步那個是很踏實的。師父認為後面是沒有退路,後面是虛著的,前面是踏實的。 [08′32″]</p>
<p>   注意喔!如果把這個理路記住的話,你還可以把它布施給很多很多覺得自己力量不足的人。這個可以一輩子不停地反覆地用,而且越用我們就會覺得:當我力量不足的時候,沒關係嘛,當下一步是什麼?然後馬上找到當下的落腳點開始改。至少要有一個積極的看法吧!要有一個積極的看法。 [08′56″]</p>
<p>   比如說我們聽聞《廣論》這件事,你說把這麼厚一本書聽完,甚至到後面〈毗缽舍那〉會不會有問題呢?有沒有很多困境呢?有啊!但是你當下的一步是什麼?就跟著全廣聽啊!每天這麼點時間,聽、聽、聽,就全部都聽完了,你就創造了一個奇蹟:聽聞了宗大師最殊勝的那本論著——《菩提道次第廣論》!而且在這本論著裡還有那麼多的經、那麼多的論,甚至將來法師們還會在這個全廣的推廣過程中,再加入一些五大論的課程來一起討論。這個學習的課堂是非常非常地豐富多彩的,所以不要中途逃跑唷,那你損失就太大了! [09′37″]</p>
<p>   所以在這裡面說:一直造上去、一直造上去,每上一步不是說非常辛苦。當你造了一樓的時候,你就可以安住在一樓;再造了,又可以安住在二樓;然後又安住在三樓,每一個次第都有每個次第的無限風光。所以成就佛法,也就是去了悟自己內心的真諦,對自己所有的內心的一切都看得清清楚楚。每多看到一分就去掉一分無明;每多看到一分,沿著看到的一分去取捨,我們就會多一分喜樂、少一分罪苦。這真的是離開痛苦、得到快樂的過程,是很美的一個過程。所以也非常恭喜大家、隨喜大家,正走在這樣的一個過程之中。 [10′26″]</p>
<p>   你們聽了,現在在微笑嗎? [10′29″]
<p>   好,上一節課我們學到:我們想要建一個摩天大廈,但是「雖然現在沒有這個力量,但是沒關係嘛,我一步一步來,我一定要從那個基礎造好」。所以當我們沒有力量的時候,師父給出了「沒有關係嘛!」這樣一個雲淡風輕的回答。那麼「沒有關係」之後的路是什麼呢?居然是「一步一步來,從基礎造好」。那我就會問說:一步一步來,我就會有力量嗎? [00′40″]</p>
<p>   然後師父下面又回答說:如果你造好了第一層樓,你就可以在第一層樓上安住;如果造好了第二層,就可以在第二層安住。實際上在我們的內心中,當我們修習善法的時候,注意到腳下的次第:首先學會觀察,觀察點在於觀察我的心朝著什麼樣的造業方向,我的思路是什麼?彷彿有一面明鏡,我們攬鏡自顧,會看到:哎!我的臉是怎麼回事?我心靈的臉孔是愁雲慘霧,還是朝氣蓬勃?面對這種狀況,是不是總有路?是不是每一次都是可以看到腳下?實際上師父告訴我們的經驗是,每一次你覺得絕望的時候,腳下都有路的,永遠都有路的,而且那一條路是一條好路!一定要踏上好路,才能越來越好、才能越來越有爆發力,我們的心才能越來越強大。 [01′42″]</p>
<p>   所以上面師父用了挖馬路啊、重新蓋房子啊等等這些喻。那接著再聽一小段:<p>   剛才那個比喻,雖然是好像很可笑,實際上,我想我們人人感受得到。那麼,現在我們修學佛道,也是如此。所以宗喀巴大師在這個地方示現給我們看,他們很多當年印度的大德,都是這種風格。所以我們目前,我在這地方要特別說明這件事情的道理,也就是這樣。在我們開始的時候,我覺得我們就應該對這個教法,有一個完整的認識。不過,這個地方並不是告訴我們說,我們要學宗喀巴大師這樣——他是一個密的,我們也是要密。不!這個意思是說,你對整個的教法有了圓滿的認識,把你的目標確定好了以後,那時候你進一步選你現在相應,應該走的路。比如對我們現在來說,我們應該走的淨土,那時候,你才是走淨土,一門深入。 [02′48″]</p>
<p>   師父說:「<p> 剛才那個比喻,雖然是好像很可笑<p> 」,我想在最開始聽第一輪的時候,可能聽到這裡,很多同學也會覺得很可笑。想一想聽第一輪的時候,會不會有可笑的感覺?但是再聽的話,聽到師父說:「雖然好像很可笑」的時候,就會汗毛直豎。為什麼呢?剛才師父用那個譬喻呀,其實就在說一條成佛的近路和成佛的遠路。這涉及到我們在輪迴裡,到底經歷怎樣的曲折、怎樣的痛苦,才能達到離苦得樂的究竟目標?還是有一條直路,用最小的辛苦、最小的代價,就可以走到那個最美的地方?實際上,聽這樣的事情是不可能覺得好笑的。 [03′43″]</p>
<p>   但是如果只聽師父舉這樣的例子——挖馬路啊、造房子,我們會覺得:這個人怎麼會這樣做呢?自己蓋好的房子又拆掉。但師父說:「<p> 實際上,我想我們人人都感受得到。<p> 」就從這樣一個我們可以看到、可以感覺到,但聽起來有點不正常的例子,讓我們注意到我們內心中,自己覺得很合理,實際上拿正理去衡量,會覺得好像瘋了、好像傻了一樣的那樣一個認知——對自己離苦得樂之路的目標的那種認知。所以今天讀到「雖然好像很可笑」,我心裡的感覺是反的,一陣酸楚啊!如果沒有師父透過這樣一個平凡、司空見慣的例子,來講這麼深的一個道理,我們如何能從《菩提道次第廣論》一開始的時候,就意識到要成佛的這件事啊! [04′45″]</p>
<p>   所以師父又舉了說:「宗大師在這個地方示現給我們,當年印度的大德也都是這種風格。」請問:哪一種風格呀?你們有思考嗎?大家小組研討的時候,有沒有討論是哪種風格呀?後來師父說:「<p> 在我們開始的時候,我們就應該對這個教法<p> 」,注意!「<p> 我們開始的時候,就應該對這個教法,有一個完整的認識。<p> 」對教法有一個完整的認識,怎樣能做到呢?比如說一本《菩提道次第廣論》,你怎樣對它有一個完整的認識呢?一定是把它都看過吧,把它都讀過。你不能說翻了其中的一頁你就完整地認識了,所以一定是有一個經年累月這樣長期學習的過程,然後才會有一個完整的認識。完整的認識之後,師父在這裡邊說:「<p> 對整個的教法有圓滿的認識,把你的目標定好了之後<p> 」,進一步才選相應的,說淨土啊還是學什麼呀,再選相應的。 [05′54″]</p>
<p>   請問:看了這整本的《菩提道次第廣論》,對這個教法有圓滿的認識之後,就能確定目標了嗎?為什麼我們對於教法有了圓滿的認識,就可以確定目標呢?那沒確定目標的,都是沒有對教法產生圓滿的認知嗎?你們的討論是怎樣的?那麼為了確定目標,我們才對整個教法要有圓滿的認識嗎?有在聽問題嗎?還是這三個問題粘在一起了?沒有吧? [06′28″]</p>
<p>   所以,又開始出現了!你看看,師父從舉那個鐵皮屋、鐵皮釘一釘,到摩天大廈,到這裡又出現「把你的目標確定好」,所以目標可以認為是一個人的志向嗎?那麼是否是對整個教法有圓滿的認識之後,我們就可以有志向?因為聽了那麼多、看了那麼多,當然要選最好的!當然要選對自己和對我所有愛護著的人們、愛護著的生命一條最好的路啊!因為離苦得樂就是我們的本能嘛!一定要去選一個最好的,因為最好的才不虧了這一生乃至生生世世我對真理的追求啊!所以從這個角度來說,我們對教法有一個完整的認識、圓滿的認識這件事,和目標息息相關! [07′24″]</p>
<p>   所以讀聖賢書才能立什麼?立志做聖賢,對不對?那現在我們是讀聖賢書吧!此時此刻的你,是不是在讀聖賢書?那會不會立聖賢的志向?那麼聖賢的志向,一定不只是為了讓自己離苦得樂的,只管自掃門前雪,那肯定當不了聖賢,一定是兼濟天下的。他的認識、他的才華、他的才能,不僅僅是饒益自己而已,而且成滿很多很多有情離苦得樂的願望,去幫忙他們,跟他們做同行善友,去幫助一切,這才是聖賢的志向! [08′10″]</p>
<p>   那麼再反過來問大家:這個志向好像很難立,但是如果有一個願意幫忙所有的人,還有一個只願意顧自己的人,那你願意跟誰交朋友呢?你覺得跟誰交朋友你會比較賺呢?一定是樂於助人的那個朋友,你比較願意交吧!因為萬一到了什麼為難的時刻,那個朋友一定會對你伸出援助之手,甚至他會為了你捨卻自己。一定是這樣的摯友最難忘吧!最可交!所以看起來我們喜歡這種人,而且我們從骨子裡熱愛這種人,因為這種人在生命裡多好呀!到什麼時候他都是我們的力量、都是我們的溫暖呀! [09′04″]</p>
<p>   所以並不是因為菩薩或者佛道之難我們沒有去選,是不是我們沒有對整個教法有圓滿的認識,所以沒有確定好目標?師父在這一小段,是否揭示了一個這樣的道理?那麼這樣的道理說明什麼?就說明了在確定志向的時候,我們讀經典、學經典是非常非常重要的事情!所以這就是為什麼再一次要跟大家每天研討全廣,因為很多人學了很多年之後,認為《廣論》是否都學完了,沒什麼好學的了。但是真的是沒什麼好學的嗎?還是我們的學習停滯不前了?那麼學經典既然這麼重要的話,無論我們多麼忙,是否應該在自己的生命中把學經典這件事固定下來?讀經典、讀聖賢的書、學做聖賢,這件事是不是我們生命的頭等大事?如果是的話,而且你也這樣做了,那你想想師父該多開心啊! [10′09″]
<p>   在每一行字、每一行字,師父都在引導著我們的志向——千萬不要淹沒在個人的喜怒哀愁之中,一把琴只為自己的苦樂而歌唱,應該去看到更多更多的有情。而且當我們完成幫忙別人的時候,注意哦,注意!有時候你突然發現,其實是那個人幫了你,你心裡怎麼也過不去的那個坎兒、那個糾結,在幫他的過程中,不知道為什麼你穿越了。 [00′37″]</p>
<p>   我提一個反的:「哎呀!我沒幫人還好,越幫人是非越多,我這生命是過得越來越痛苦啊!」事實是這樣的嗎?你們在點頭嗎?我沒有看到。是在點頭嗎?有人點頭、有人搖頭。 [00′56″]</p>
<p>   那麼可能你在幫別人,越幫你自己問題越多,為什麼呢?因為原來你不出去看看隔壁家在做什麼,後來看隔壁家:哇!老人要養;又隔壁家,小孩要帶;後來看到在前面人家,那個寵物狗狗生病了,我還得帶牠去醫院。你開始幫忙很多很多人,這時候你發現什麼?你亂了,你步伐亂了、心亂了,所以你的苦也就多了。你的苦多了是為什麼呀?因為你承載了比你自己原來多的重擔。但別忘了,這個時候你的心也比原來強大了。一旦你突破了這個關口之後,你就會去承載更多的人;或者你可以站在此處欣賞自己,你發現:哎!我已經超越原來了。因為終究只為自己活著,不是什麼愉快的事吧! [01′48″]</p>
<p>   所以就像師父說的,你沒有力量承載那麼多——注意哦!現在考試開始了,你有沒有意識到我在考試啊?「哎呀!幫忙幫這麼多,越幫越苦啊!怎麼怎麼......。」接著說:「我沒力呀!崩潰!」「爆掉了!」對吧?什麼東西爆掉了?正念爆掉了嗎?那你就慘了!我們要把那種虛弱爆炸掉。所以還是那樣,沒力了,沒力了怎麼辦?想想師父說什麼來著?「啊,沒關係,一步一步來!」那請問:我們幫很多人覺得痛苦,這時候你的第一步是什麼呀?奠定自己的發心。不要認為越幫別人我的生命就越亂,問題不是出在我們幫忙別人,而是出在我不太會在幫忙別人的時候調整自己。 [02′35″]</p>
<p>   那麼腳下的第一步是什麼?要調整自己,而不是幫忙別人這個方向錯了。因為早晚我們都要選擇幫忙別人,幫忙別人自己才能夠沒那麼「我愛執」,才能夠最終地從一個「我」中徹底地脫殼出來,才得到自在呀!所以最終會選擇這樣,最終會學習從利他中,我們體會到前所未有的歡樂。 [03′02″]</p>
<p>   所以是幫忙別人錯了,還是幫忙別人的時候我不會調解自己?那我就學習調解自己、調整自己就好了,而不要放棄這正確的方向。譬如一個小孩上學他很有壓力,他每天很有壓力,他說:「那我不要上學了!」還是去調整這個壓力,跟老師談啊、跟父母談啊,或者怎麼樣去調解這個壓力?因為終歸得上學嘛! [03′26″]</p>
<p>   不知道你們現在聽了怎麼想?每個家裡都有點為難的事吧!如果聽到此處的話,家裡的那個難事在進行著,但是你一個生命裡的偉大的目標也在進行著,這就是什麼呢?這就是學習《菩提道次第廣論》、學習文殊的教法,而且有師父這樣這麼細密的解釋,完完全全要我們一次、再一次地針對內心。 [03′53″]</p>
<p>   其實我曾經跟師父不只一次地問過,我說:「師父,《廣論》的講解方式,師父為什麼是採用這樣的方式講?」師父說:「要講到大家能夠體會得到,不然用不上,沒感覺,大家會學嗎?會想學嗎?」那麼我們怎樣才能從沒感覺到有感覺、到產生強烈的希求心?就是真的要拿這樣的理路,來調整自己的內心。 [04′24″]</p>
<p>   所以學這一小段的時候,我希望大家收攝為:如果能夠對教法進行圓滿地認識,我們終究會確定生命的正確目標;確定了正確的目標,我們就走出非常正確的一步。 [04′41″]</p>
<p>   那我們說:現在還沒確定,或者現在正在確定的怎麼辦啊?那就正確地聞思下去。就是每天要來聽,要繼續地到這個時間,打開、聽、開始學習!這樣經年累月地學習之後,我們對教法聞思的習氣就會養成。然後從一本《廣論》下去,我們就會想要翻很多很多教典,比如說你可能去看《華嚴經》啊、《法華經》啊、《楞嚴經》啊,很多經典、很多論。尤其是我們現在寺院的法師學五大論,以後大家會聽到很多很多論。很多很多的經論裡,都再再地會重複這個主題,那個時候我們就會建立一個思惟的習慣性。就像師父說的:現在沒力氣怎麼辦啊?沒關係嘛!開始走腳下的一步。 [05′30″]</p>
<p>   走腳下的一步就會慢慢變成有力嗎?會的!因為我們的腿——我們的思惟,經過強力地訓練之後,它會越來越清晰、越來越有力。為什麼呢?因為「心無自性,法爾如是」的道理。朝著什麼方向去就會有什麼,朝著什麼樣的力度去串習就會出現什麼,這就是「如是因結如是果」的道理。如果是苦因,就會結苦果,樂因就會結樂果。那麼大家想一想:現在你聽聞教典是個苦因,還是樂因呢?如果是樂因的話,那你就該很歡喜呀!那麼再想想平常生活的時候,就不要種苦因啊! [06′13″]</p>
<p>   所以在整本的《廣論》,在師父字裡行間的講解中,都再再地提醒我們要注視到當下的一步在種什麼?就是要看著那個陌生人,那個陌生人是誰呢?就是自己呀!要辨認出自己當下的腳,在朝著什麼樣的方向。怎麼樣去確定這個方向呢?每天聽《廣論》來確定啊!不停地透過教典的聞思,這樣來確定當下的一步對不對。 [06′42″]</p>
<p>   所以對我們的心來說,永遠都有朝向最完美方向的這樣一條路,希望大家好好走下去!無論你現在對你自己滿不滿意,你都可以找到一個當下的一步,紮實地踏上去,開步走!有困難解決困難,不要動輒談放棄、談逃走,因為那不是解決問題的辦法,因為業力不是用逃來解決的。比如說惡業要修懺悔的、善淨之業要去造作的,各有各的對治法。逃跑能逃到哪裡去呢? [07′23″]</p>
<p>   所以非常非常地隨喜大家能夠一起學《廣論》,不管你在哪裡,都好好地加油!謝謝! [07′31″]
<p>   大家好!很開心又到了我們一起研討《廣論》的時光。非常希望大家在全廣共學之前,把師父的帶子自己先聽幾遍。因為這樣聽過之後,跟同學研討,你會在其中提出一些問題,也會聽到其他同學的觀點,這樣你對師父所闡述的這一段的意思,就會有一個了解,其中的疑問也非常清楚,甚至對這一小段思路到底是怎樣延展的,就會有一個思擇的方向。 [00′40″]</p>
<p>   有很多同學回饋說:「啊!先聽了之後,再聽全廣的時候,會發現有的時候思路的方向是不一樣的。」發現思路不一樣的時候,大家就會鎖定:欸!這個有什麼不同之處呢?你會發現,每一節課都會在你原來的研討和理解程度上,有一個更深入的思考。 [01′07″]</p>
<p>   非常希望大家把你思考的議題寫信給我,因為我都可以看到你們的回饋。有很多同學寫了很多回饋,我是非常非常感動的。這麼多年學習《廣論》,信仰已經深深地根植在很多同學的內心。發現大家對師父所宣講的《廣論》,有這樣始終如一的熱忱,在我們這個共學的大班,我也會滿懷熱情地一直研討下去。 [01′37″]</p>
<p>   好,今天還是要注意發心,要把我們的續流慢慢地靜下來,發心為求無上正等菩提,為了將無窮無盡的有情從生死的流轉中救拔出來,我必須去成佛;為了成佛,一定要種成佛的因;成佛的因,必須聽聞佛法才會了解。 [02′07″]</p>
<p>   聽聞的時候最重要的事,大家記住——要專注!因為通常都在忙別的事情,一下子把教典打開的時候,可能無法將你的續流專注,但是這個是可以訓練的。訓練到你從一個忙碌的頻道,一下子進到學習教典的頻道,頃刻間就可以全神貫注,其他的就拋開了,這是可以訓練的。訓練久了之後,我們只要一聽到師父說法的聲音,立刻就全神貫注。 [02′42″]</p>
<p>   好,那麼現在我們再來聽一段。注意哦!注意!不要走神,開始! [02′50″]</p>
<p>   那你會說,同樣是淨土,你這個淨土,跟我這個淨土有什麼不一樣啊?不一樣,差得很大。平常我們現在念佛的人,聽見了念佛,趕快!往往就說,我只要念得去就好了,弄個下品下生。結果你念了半天,下品下生都不一定去得了,這是個事實。現在這裡我們說,萬修萬人去,這個法門,對不對?對!淨土法門是萬修萬人去,可是現在,一萬個人修,有幾個人去啊?找不到幾個,這是個事實。那麼現在照這個法門做,有什麼好處呢?你有圓滿的認識了以後,第一個是萬修萬去;第二個,要去的目的也不一樣。我本來說,我只要去就行了,現在不是,我要成佛,不但要自己解決,而且幫助一切人解決。可是為了要達到這個目的起見,選我現在最相應的念佛的路子,這樣的情況,所以我要去! [03′46″]</p>
<p>   很快就聽了一遍,不知道大家會不會有印象?第一個問題,說:「<p> 同樣的是淨土,你這個淨土,跟我這個淨土有什麼不一樣啊?<p> 」「我這個淨土」是什麼意思啊?想一想有什麼答案。這就要回憶上節課師父講的,那你在手抄上就要看上一段,對不對?哪種淨土啊?不知道你們的答案是什麼?因為上節課學了「摩天大廈和匆匆忙忙地蓋一個鐵皮屋」這兩個喻。說我們一開始的時候,就應該對整體的教法有一個完整的認識,完整的認識之後,確定了目標,然後進一步選自己相應的,就是淨土。對教法有整體完整的認識,確定了什麼目標?成佛的目標,對吧?所以「我這個淨土」,師父是指這個。 [04′56″]</p>
<p>   然後接著說:「<p> 不一樣,差別很大!<p> 」一個沒有廣大聞思、沒有確定目標,另一個是確定了目標,進行了對佛法總體的認知。下面師父說:「<p> 平常我們現在念佛的人,聽見了念佛,趕快!往往就說,我只要念得去就好了。<p> 」注意!「趕快!」就是匆匆忙忙的心態。他說:「為什麼要趕快呀?來不及了!生命無常,剎那剎那地向老死奔逐啊!能夠知道阿彌陀佛萬德洪名,能夠對極樂世界生起這樣的嚮往和信心是件非常不容易的事情,趕快念!」所以就開始念。他生起個什麼樣的志向呢?「我只要去極樂世界就好了,哪怕下品下生。」還有說:「哪怕在極樂世界的邊地都行,只要能去極樂世界,當然就逃開了生死輪迴了!」就立一個這樣的志向。 [05′57″]</p>
<p>   注意哦!他的志向是什麼?下品下生也行!對不對?甚至我們討論過,有的居士說:「邊地也好啊!」想要去下品下生,甚至邊地都可以,只要去了就好。注意!「<p> 結果念了半天,下品下生都不一定去得了。<p> 」我們懷著這樣的志向,可是我們卻沒有達到這樣的志向。師父接著說了一句話:「<p> 這是個事實。<p> 」 [06′25″]</p>
<p>   實際上這件事就會問一問:有多少人能在生死關頭提得起一句佛號?就像我們老學員學過的皈依那樣——「晝夜見世依」,就是白天、晚上、病中、苦中,或者難以忍受的疼痛,還有跟家人的愛別離苦等等很多很多痛苦交織在一起的時候,也沒有多少力氣,有的是受盡了病苦的折磨;那個時候提一句佛號、提一個皈依的心——對阿彌陀佛的信心。那個時候功夫能不能用得上?所以萬修萬人去的法門,師父說:「到底有多少人去呢?」這是一個現象。 [07′21″]</p>
<p>   接著師父說:「<p> 那麼現在照這個法門做,有什麼好處呢?<p> 」哪個法門呀?就上節課師父立出的宗——先對整體的教法有廣大的聞思。對吧?「<p> 有什麼好處呢?<p> 」看看師父又給我們看好處,說:「<p> 你有圓滿的認識了以後,第一個是萬修萬去。<p> 」欸!實現了,淨土法門萬修萬去。聽到此處大家會不會有疑惑:真的是有圓滿的認識就會萬修萬去嗎?為什麼呢? [08′03″]</p>
<p>   這就涉及到對佛法的圓滿認識到底是什麼?比如說首先極樂世界到底是什麼?阿彌陀佛他有多少功德?我們對我們的皈依處,我們最後要去的極樂世界依正莊嚴的淨土,到底有一個什麼樣的了解?對阿彌陀佛的四十八願,乃至念死無常、三惡趣苦,然後皈依,全部都了解了?皈依的時候有皈依二因,兩種因如果堅固的話,那麼我們皈依所獲得的利益就會非常非常地殊勝和圓滿。所以師父在這裡說「萬修萬人去」,真的嗎?難道說有了圓滿的認識之後,第一個就萬修萬人去,後面還有不一樣的嗎?注意哦!這是大德高僧說的,他不是隨便講講的,我們可以帶著這個疑問,然後向下學。 [09′08″]</p>
<p>   在這裡邊我再提一點:學了經論十五年到二十年,對於所有成佛的次第、對經論大大小小的差異性,乃至很細微的抉擇都了然於心的這樣一個人,他念一句阿彌陀佛會不會是不一樣的?有了圓滿的認識之後,他是怎麼念的?首先要知道念的時候不要昏沉、散亂;再一個,知道什麼叫「發菩提心念佛」,跟阿彌陀佛的願心相應。因為阿彌陀佛建造極樂世界,不是為他自己建的,是為了芸芸眾生早日離苦、早日得樂而建的。如果能夠學經論,知道成佛的核心就是菩提心,那麼和阿彌陀佛相應的心一定是菩提心!雖然阿彌陀佛的淨土裡邊,不發這樣的大菩提心也可以去,但是阿彌陀佛的本願是這樣嗎?那麼佛陀的希願到底是什麼?善知識的希願到底是什麼?所以就談到了「目的性」。注意聽,不要走神哦!不要走神! [10′20″]</p>
<p>   「<p> 第二個,要去的目的也不一樣。<p> 」注意!談到了目的。欸!去極樂世界還有其他的目的嗎?不就是早日脫離生死輪迴嗎?目的也不一樣!說:「<p> 我本來是說,我只要去就行了!<p> 」對不對?只要去極樂世界就能逃脫生死輪迴,因為生死輪迴所受的六苦、八苦、三苦,實在是苦不堪言!所以去極樂世界就好了。注意哦!師父又說了:「<p> 現在不是,我要成佛。<p> 」注意!目的出現了。開始沒有廣大聞思的時候,目的是我只要去就好了,後來有了圓滿的認識之後,他產生了轉變——為什麼要去極樂世界呢?因為要成佛。為什麼要成佛呢?「<p> 不但自己要解決,而且幫助一切人解決。<p> 」這就是阿彌陀佛的一片慈悲之心啊!對芸芸眾生深刻的、慈悲的情懷呀!是為了學習佛陀對眾生的大悲心和智慧,為了成佛去極樂世界的。看看哦!他有了這樣一個轉變。所以「<p> 不但自己要解決,而且幫助一切人解決。可是為了達到這個目的起見,選我現在最相應的念佛,這樣的情況<p> 」,師父說:「<p> 所以我要去!<p> 」去哪裡?去極樂世界。 [11′55″]</p>
<p>   所以看看這個前後的差別是非常非常明顯的,一個是只要去了就好;後來是變成:「NO!我要為了成佛而去,不僅僅是要自己去,而且要幫所有的人去。」所以廣大聞思,打開了他生命的視野,讓他站在一個非常高的角度上,意識到自己生命的價值、對其他眾生的責任感。看到了這一點之後,對阿彌陀佛建造的極樂世界會有更深刻的了解,然後會對阿彌陀佛的悲智有難以想像的信心。生起那難以想像的信心,那我們一句「南無阿彌陀佛」,跟往常那種又昏沉、又散亂,拿個念珠拼命撥,都不知道念到哪裡去了,只是「颼、颼、颼!」這樣拼命念,心裡不知道在想什麼,跟那個當然是不能比的! [12′50″]
<p>   想一想,師父為我們講《菩提道次第廣論》,今年(2018 年)滿三十年了。多年前,應該很多很多居士、很多很多出家人都念佛,我也念佛。那個時候拼命念佛,比如說可不可以晝夜十萬?就是一天一夜念十萬佛號,能不能做到?然後就開始拼命拼命念。那時候碰到很多很多居士也都是在拼命念佛,大家是非常非常精進的,對阿彌陀佛有難以想像的信心。所以當剛開始學《廣論》的時候,很多居士都非常在乎師父提到淨土法門、師父是教我們怎麼念佛的。甚至我們在研討班裡討論討論,有的居士就站起來說:「欸?師父好像不贊同我們念佛!」然後我說:「師父是非常非常贊同念佛的,師父沒有說你不能念佛,師父只是說怎樣去圓滿我們往生極樂世界的願望,而且是最高程度的圓滿,是立一個什麼樣的志向;一個萬修萬去的法門,是怎樣真正能夠做到萬修萬去。」 [01′21″]</p>
<p>   後來我在跟師父學習的時候,也有認真地請問過這個問題。然後師父他說:內心深處也確實是想,講《菩提道次第廣論》能夠幫到各宗各派的修行人。大家如果選擇他相應的法門,一定要對整體的教法有全面的認識,這樣的話就會真正地做到一門深入。 [01′46″]</p>
<p>   現在要調整自己的心!現在我們要開始聽了。別忘了大乘發心!聽的時候注意要全神貫注。全神貫注呢,有一個譬喻:在曠野裡邊有一個小動物牠在奔跑,或者在走路,突然天空一個霹靂,「喀!」一個霹靂,那個小動物就立刻停下來——「猶如野獸乍聞聲」,那就是一個聽聞的狀態。能想像嗎?就是那樣的一個狀態,其實心裡是沒有雜念的,是全部在聽。 [02′32″]</p>
<p>   好!我們再聽一下師父的帶子。 [02′37″]</p>
<p>   所以你剛開始去的時候,你要求的就是上品上生,乃至於有一個人就求無上乘,說我要去現在去念的是要求什麼?要求這個寂光淨土的上品上生,上品上生還分四土九品的。那個時候,當然,我們現在的條件,不一定真的能夠達到「寂光」的上品上生,乃至於「同居」的上品上生都得不到。那沒有關係,你可以得到上品中生,上品下生,至少你可以很穩。還有一點,因為你的願心這樣的,將來一去,見到了佛,你所追求的圓滿的東西,很快,這條直路。這是我們要了解的。 [03′20″]</p>
<p>   所以在這個本論我一開頭說明,我並不說建議大家要學哪一個宗派,或者哪一個法門,完全不是!這個宗派法門,這是你們自己選你們個人自己相應的。而是一開頭的時候,我們要了解佛法的整個圓滿的內容是什麼,你有了正確的了解了以後,然後把你的目標一開始的時候,規劃出來。從這一個認識當中,選取找到你自己相應的路,然後你走上去的話,千穩百當,而且是最省事、最快速、最圓滿,念佛照樣地念,參禪照樣地參。 [04′07″]</p>
<p>   不知道這一段大家在研討的時候是怎麼研討的?首先師父在這裡邊提出:已經改了,不是說只要念得去就好;原來是趕快,只要念得去就好了,下品下生也行。但是如果是想要去下品下生的話,結果就是下品下生也去不成。這裡邊不是喔,是要上品上生的,而且求無上乘。我要去念要求什麼?「<p> 要求寂光淨土的上品上生<p> 」,所以是非常高的目標!以這樣的目標、以這樣的志向去希求的話,不一定能夠得到寂光淨土的上品上生,但至少中品也可以呀,乃至同居土的上品上生也行!但是如果連同居土的上品上生都得不到,也沒關係呀,因為可以上品中生、下生啊!至少,注意!「<p> 至少可以很穩<p> 」,就是一定去得了。淨土宗的大德也非常強調這一點,說:「你不能發心下品下生,那一定去不了。」所以發心於上,然後取法於中,才能夠去得了。 [05′30″]</p>
<p>   那麼,為什麼人敢發這樣的心呢?他一定是了解了這些發心的勝利,對教典進行了聞思,他會反覆地琢磨這一件事情,然後請問善知識啊、跟別人探討啊,所以才能夠發這樣的一個心。發這樣的一個心之後,至少可以很穩。還有一點,師父說,因為我們的願心是將來去見佛,我們所追求的是最圓滿的佛果,所以去極樂世界幹什麼?不是去天天散步啊、看花呀,不是這樣的,是「鳥樹虛空明」,都在說法、都在修行呀!沒有一處的緣起不在提醒我們修行,跟著佛陀好好地修行啊,走無上菩提之路。如果你為了學習、為了成就佛果,到處見聞念知都在提醒我們要提正念啊、要怎麼修行啊,那你就快樂極了,對不對?因為還是那個續流嘛!所以師父希望我們了解這一點。大家聽了會不會很開心啊? [06′38″]</p>
<p>   另外,下面師父又說了,在本論的一開頭就提出:「<p> 我們要了解佛法的整個圓滿的內容是什麼,你有了這個正確的了解之後,然後把目標一開始的時候,規劃出來。從這樣一個認識當中,選取找到我們自己相應的路,然後走上去的話<p> 」,師父接著說了幾句——「<p> 千穩百當<p> 」,一個;注意!「<p> 而且最省事<p> 」,兩句了;「<p> 最快速<p> 」,三句;「<p> 最圓滿<p> 」,幾句了?四句。「<p> 千穩百當、最省事、最快速、最圓滿!念佛照樣地念,參禪照樣地修。<p> 」其實這幾個都是我們修行人最最渴望的一件事情。「千穩百當」,我們是心慌沒把握;然後「最省事」,幹什麼事情都想省事、得到一個最好的。那居然對佛法整個地了解了之後,「咦!怎麼變成了一件省事兒的事情?」學那麼多經典還省事嗎?學經典不是很費力氣嗎?很省事!然後選取、找到你自己相應的路走上去,是省事、快速、圓滿! [08′01″]</p>
<p>   我記得以前在廣論班的時候,有一個同學一開始學習非常非常認真,但是她覺得聽不懂,學什麼都比大家慢。結果跟在班裡兩年、三年,還是一年,我記不清楚了。有一次寺院開法會,然後她去念佛,她非常非常喜歡念佛。念完佛之後,就開始跟別人講說:「哎!《廣論》裡怎麼講,怎麼樣對阿彌陀佛生起信心,有什麼功德......。」這一講出來,開始圍了一群人,後來越圍越多,大家都在旁邊聽。她就是一口氣講了兩三個小時沒停下來!等到講完了,她非常非常驚訝,所有的人說:「哇,你學得太好了,你怎麼講得這麼好!」 [08′45″]</p>
<p>   結果那天回來之後,她就給我講這件事,哇,精神大振,眼睛炯炯有神!她在我們廣論班學習,從來沒有那麼有自信過,從此她就更精進地學《廣論》了。所以,她學了一段時間突然發現:哇!她可以跟別的同學談修行,談三個小時停不下來,這以前怎麼可能!都是別人滔滔不絕地說,她在旁邊聽,聽還聽不懂,還問:「這是怎麼回事啊?那是怎麼回事呀?」別人說:「啊,等等、等等!讓我們講完,往下學。」結果那麼大的進步。她現在也非常努力地在學《廣論》,非常非常地好!總之,聽得多了、見聞多了之後,對各種見解也了解得多了,當別人講的時候也可以學習,當別人聽你講的時候也可以講一講,也比較跟其他的同學有得互相探討。非常非常地好! [09′35″]</p>
<p>   記住,剛才這幾個了?「千穩百當」,一起說:「最省事、最快速、最圓滿」,這都是我們非常非常期待的事情。那這樣的一種結果——「千穩百當、最快速、最圓滿、最省事」,其實最省事這件非常奪目,我們現代人都怕忙、怕煩,越省事越好,因為很多事實在太麻煩了。所以,問一下:「最省事」,這件事是怎麼達成的呢?開始「要了解佛法整個圓滿的內容」,注意!在內容前面有一個,「『圓滿』的內容是什麼」;接著下面,「有了正確的了解」,對這個圓滿內容一定要有正確的了解,確定目標,這樣是最省事的。 [10′29″]</p>
<p>   不知道聽到這裡,大家還是不是有疑問:「真的嗎?」舉個簡單例子,我小的時候就經歷過這樣的一件事情,父母都不在家,結果呢?我小學的老師突然到了我們的城市來看我爸爸了。可是我怎麼辦呢?因為我平常就會看我爸爸媽媽做飯,所以那次我給我的老師準備了十六道菜!有一道菜就是冰淇淋上面放上櫻桃,冰淇淋是白的嘛,然後櫻桃是紅的,那道菜叫「雪山堆火」,我就是湊了十六道菜。其實那時候我也很小,為什麼會有十六道菜,就是看我爸媽炒過,尤其是過年的時候,不是家家戶戶都吃很多菜嗎? [11′18″]</p>
<p>   當時我在做菜的時候,我們老師說:「哎呀,你還下廚房?我給你做還差不多!」我說:「老師這麼遠的地方來,而且好幾年沒見了,怎麼可能讓老師給我煮飯呢?老師您就坐在客廳,我去煮!」結果我真的煮了十六道菜。當時擺出來的時候,老師非常非常地驚訝。 [11′37″]</p>
<p>   注意哦!我不是在這兒自我吹噓,我是說如果你不先看看怎麼炒的,什麼菜和什麼菜配、多少醬油、什麼時候從鍋裡拿出來,甚至裝盤子也不能裝得亂七八糟,要裝得整潔一點,因為要供養給自己的老師嘛!那天我沒有摔碎盤子、也沒有摔碎碗、也沒把醬油倒在身上、也沒有弄著火。總之,我覺得那都取決於我一天天看、一天天看,輪到自己的時候,就可以弄出來。不然我們老師來,我就只能煮方便麵,什麼都不會了!方便麵可能還不會煮,倒開水的時候都有可能燙到自己。 [12′16″]</p>
<p>   所以,對事情常常有一個全局的觀念去看的話,慢慢地輪到你自己下手的時候,你就不會是只煮個方便麵。甚至沒辦法了,我們老師還得說:「哎呀,同學你餓不餓呀,我給你煮個飯吧!」就變成那種了。 [12′32″]</p>
<p>   你說省不省力呢?要是之前沒看的話是不可能——因為不是花很多時間煮的,一道煮完再煮一道、再煮一道,好像很快地就煮完了。現在我想想,那時候是不是佛菩薩加持我了? [12′48″]
<p>   大家好!我們要開始進入下一節了。我希望你們可以把疑問或者感受寫給我,我都會看到。看到大家的體會,我也是滿開心的。有一些同學學得非常地認真、非常地感動,而且感受到師父懷著那樣一顆慈悲、智慧的心,每一個字、每一個字地教導我們。其實可以想想,也可以不用給我們講這些呀!為什麼一開始費了這麼多的篇幅,一直要給我們講什麼是一條遠路啊、什麼是一條近路啊,拿了這麼多譬喻在一開始引導著我們? [00′45″]</p>
<p>   在拜讀師父日記的時候,發現師父在每一篇、每一篇都會頂禮佛菩薩,都會好好地對今天自己所有的行為進行懺悔、隨喜;可以看到一天一步一個腳印,非常認真地那樣修行過的深深足跡。比起他所講的,其實他在日記裡邊寫得更深、更深!他修行的那個功力、他對自我的那種要求,每次看了都會非常非常地感動。能夠值遇這樣的一位善知識,能夠得到他的攝受,乃至生生世世的攝受,實在是一件非常稀有的事情! [01′33″]</p>
<p>   雖然現在我們《廣論》書隨處就可以請到,可以想像三十年前在各大流通處,就算我們看到《菩提道次第廣論》了,我們會有感覺、會有一種想法想要去請來讀嗎?甚至有的人書櫃上也有《廣論》,但是可能塵封二十年都不會去翻一翻。翻開來第一頁能看多久,就會停下來呢?也沒有一個願心、一個耐心把它讀完。 [02′04″]</p>
<p>   我也去過很多寺院,有的時候一進寺院,在門口就會聽到師父帶子的聲音。欸,都不知道是誰在聽啊!還有那時候《菩提道次第廣論》常常在流通處都請沒了!所以師父是非常非常不容易地打開我們的視野,讓我們從一個全圓的成佛次第來審視自己的修行。師父一直在幫我們、一直在幫我們,為我們開正知見眼。最重要的是開正知見眼,然後才會有清淨的行。 [02′42″]</p>
<p>   好!我們再往下聽一段。注意!注意自己的發心!聽的時候不要閃神,因為聽完了馬上就跟著我的問題,一旦走神了之後就不知道這是什麼。好,現在開始! [03′02″]</p>
<p>   所以這個後面,他會告訴我們的:是,我們修行一定是一門深入。這個根本的道理在這裡。除了這個以外還有一個,假如你真的一門深入,找到了門還好,不幸的我們往往是什麼?在門外空轉。我們中國有一句話叫「閉門造車」,現在不是,門都沒摸到,門都沒摸到,乃至於什麼?在原地踏步,我們自己覺得在修學佛法。就像剛才說,我們覺得修學佛法,實際上,在修學的是個「我」,弄到後來,「我」是越弄越大。 [03′40″]</p>
<p>   現在在這個地方,我們不妨仔細檢查一下看看。平常我們最流行的,也可以說最適應我們現在時代的,就是淨土。這個印光大師,是淨土的大德,他特別說明,有很多人,弄了個半天,是念佛也好、什麼也好,越念是煩惱越重。對不起,弄錯了!你說怎麼會呢?就是剛才這個道理——我覺得對了,實際上呢,沒有真的對。所以前天說的,未會先會,千萬不要!我們修了個半天,不是修的佛法,是修的「我」,把那個我是越弄越大,那個冤枉苦頭吃得太多、太多!不過這個詳細的內容在下面。所以我談到宗喀巴大師,當年修行的狀態,他所以有這麼高的成就,所以能夠幫這麼多人的忙,乃至於把整個的教法這樣地振興,到今天我們還有這個受用的原因,就指出這一條路來。這個也就是我所以選取本論,在這個地方跟大家共同研習的原因。 [04′52″]</p>
<p>   如果在班裡的話,可能我會要求把這一段聽兩遍,因為聽一遍,我擔心會不了解什麼、記不住什麼。在這邊第一小段,大家都有手抄,可以看一下。「<p> 修行一定是一門深入<p> 」,注意!在這一段裡,「門」字出現了,門!修行應該一門深入。說:「<p> 根本的道理在這裡。<p> 」對不對?在哪裡呀?是不是全面地了解了佛法之後,千穩百當地走上相應的路?說:「<p> 除了這個以外還有一個,假如你真的一門深入,找到了門還好<p> 」,不幸的是沒有找到門。 [05′44″]</p>
<p>   前面講的一門深入那個「門」,注意!是對廣大的、圓滿的教法有了全圓正確的認識之後,選取了什麼?一個法門一門深入,對不對?但是從另一個角度來說,廣大的聞思也是一種門徑,對不對?這也是一個門。你能找到門還好,最可怕的是在門外空轉,以為是入門了、已經在裡邊學了。說:「<p> 門都沒摸到!<p> 」門都沒摸到,向前走也行啊!沒有!向門的地方走也行啊!沒有,「<p> 在原地踏步<p> 」!原地踏步是什麼意思啊?是走了很久、很久之後還在原地,對不對? [06′28″]</p>
<p>   注意!問大家一個問題:這是不是一種迷路狀態啊?迷路,迷路了!因為我想從此山到另一座山,或者我要爬過那座山回家。我們到了某一個原始森林、到了一個什麼地方,可是一旦你迷路之後,你覺得走了好遠,然後突然發現:欸!怎麼又到這棵樹了?走了三回,又到同一棵樹了。這叫原地踏步對不對?你走了很遠很遠,發現又到原地了! [06′59″]</p>
<p>   注意哦!原地踏步這件事,原地踏步的人會不會知道自己原地踏步?有可能知道,還是不知道?不一定。如果知道原地踏步,會不會就不再原地踏步?回答!還說不一定對不對?那請你們說出不一定的理由。知道原地踏步的人,他就會想辦法突破——不原地踏步,對不對?那不知道原地踏步的人呢?自己一直在原地踏步,以為已經爬過了一座山、又一道嶺,「哎呀!我已經走了很遠很遠的路了!」但是明白的人一看,就發現你還在那棵樹那兒轉來轉去,已經進入到一種模糊狀態。所以如果不知道自己原地踏步,一定是迷路了,對自己修行到什麼程度、該有什麼覺受、該有什麼知見都不了解。 [07′59″]
<p>   「<p> 自己覺得在修行佛法,實際上,我們修學的是『我』,到最後『我』越來越大。<p> 」注意,原地踏步的行相出現了!什麼行相呢?就是「我」越來越大。師父希望我們能夠仔細檢查一下:不管是學什麼、做什麼也好,它的相狀,注意喔!「<p> 越念煩惱越重。<p> 」這個其實我平常也聽到很多居士說:「哎呀,我修學這麼多年了!在這裡承擔、那裡承擔,不承擔還好,一承擔,哎呀,全是煩惱!好像我修行,煩惱越來越重了。」如果這個人發現煩惱越來越重了,那接下來要怎麼做啊?他有沒有在觀察自己?有吧!有觀察自己才發現煩惱很重。這個有兩種狀況:有一種可能是真的比原來瞋心大;還有一種狀態是,欸,覺照的陽光照進來了!根據這個覺照的陽光,他看到屋子裡有很多灰塵,看到了煩惱的塵埃。這說明他對自我身心覺照的清晰度有強烈地增加,所以這個時候他說:「煩惱越來越重」是個好事情,因為他看到了! [01′28″]</p>
<p>   但師父此處絕對指的不是這個,是真的煩惱越來越重。因為什麼?「<p> 弄錯了!<p> 」本來是向彼地走,如果向此地走,那一定是距離越來越遙遠。他為什麼會弄錯了呢?注意看!「<p> 就是剛才那個道理<p> 」,哪個道理呢?「<p> 我覺得對了<p> 」。注意!他是自己教自己修行、自己看自己在哪裡,都是「我」。我給自己引路、我自己......全部都是「我」!「<p> 實際上,沒有真的對。<p> 」注意!「實際上,沒有真的對」這句話什麼意思?誰說的「實際上,沒有真的對」?是那個「我」說的嗎?不是。這一定是出現了什麼?另一個參照的觀察點。我覺得我對了,可是在旁邊的人看起來,「你沒有、你搞錯了!」而且犯這個錯誤是「<p> 未會先會<p> 」,師父說:「<p> 千萬不要哇!我們修了個半天,不是修的佛法,是修的『我』,把這個我是越弄越大,結果吃得冤枉苦頭太多、太多了!<p> 」 [02′45″]</p>
<p>   為什麼這個人不知道「我」越弄越大呀?為什麼弄成這樣?是不是沒有明白的人告訴他?還是他不相信明白的人告訴他?另外也沒有道友吧!道友也會告訴他:「你最近這個好像不太對哦!一張口好像很多見解不太清淨,另外這種習染不太好吧!」同行善友也會提醒,善知識就更會提醒。看起來,師父講的這個人是不是一個很孤單的修行者?也許沒有善知識攝受,也沒有同行善友的提醒,所以把「我」越弄越大。自己知不知道?不知道! [03′30″]</p>
<p>   師父在這個地方,列舉了非常用功修行,又自己覺得很好、很努力的這樣一個修行者很可悲的現狀——就是他在原地踏步!他用了那麼多心血,可是並沒有進步,而且還把「我」弄得越來越大了。「<p> 冤枉苦頭<p> 」,冤枉啊!師父為他叫屈呀,冤枉!「<p> 苦頭吃得太多太多!<p> 」師父是非常不忍這樣的修行。看到花了那麼大的心血,結果弄成這樣,師父是非常非常地惋惜、非常非常地心疼我們!應該是這個原因,才發心為我們講《廣論》的吧!應該是看到很多很多修行者拼命地修行,結果在原地踏步,甚至門在哪也不知道,拼命地折騰,對於這種現狀師父應該是流了很多眼淚吧! [04′34″]</p>
<p>   所以師父說:「<p> 談到宗喀巴大師,當年他修行有這麼高的成就,能夠幫這麼多人的忙,乃至把整個的教法全部這樣振興起來,到現在我們還有受用,就是指出這樣一條路。<p> 」師父說:「<p> 這個也就是我所以選取本論,在這個地方跟大家共同研習的原因啊!<p> 」就像宗大師造論之前的那個原因,對不對?「<p> 觀視佛語多片眼<p> 」,下面什麼?「<p> 復乏理辯教義力,故離智者歡喜道<p> 」,離開了智者所歡喜的道,我們自己在那兒想一齣就是一齣,在那兒修行,費了那麼多的辛苦。所以師父不忍這樣的修行者,在這樣一個苦境裡煎熬卻不自知、又找不到出路。所以為了這樣的一個原因,師父才找到了《菩提道次第廣論》——一步一步地引導、次第明晰、目標精確這樣的一本論,而且一行一行地講給我們。所以這是一個很深的恩德呀! [05′51″]</p>
<p>   像這樣的修行狀況,看到了之後也可以不用管啊!因為師父自己碰到了《廣論》,自己在正確的道次第中,自己有善知識追隨就可以了。費了這麼大的心血給我們講《廣論》,一開始還沒人喜歡聽!想想:要怎樣的不忍,才能夠把大家不喜歡卻真正需要的東西,講到你能夠喜歡聽、能夠生起善法欲,而且經年累月地聽。師父發了一個多麼清淨的幫助我們的心,多麼皎潔的一個發心! [06′32″]</p>
<p>   總結一句話是什麼呢?所有在原地踏步的、找不到門的,怎麼樣?跟師父一起學《廣論》呀!聽著就可以找到門了,就不原地踏步了!因為師父就是為了解決我們這樣的苦狀,悲憫我們這樣的現行,來跟我們一起學習的。所以這是一件多麼可喜的事情,大家一定要萬分地珍惜! [07′00″]
<p>   大家好!現在我們要開始學習《廣論》了,請大家要端正一下自己的發心,再再地觀察一下自己的內心:有沒有準備好開始聽聞?那些手邊忙著的事情、那些放不下的牽掛,可不可以在此刻轉為希望能夠成就無上正等菩提?這樣的話可以幫忙自己,也可以幫忙到所有我們關心的、我們不認識的有情。 [00′42″]</p>
<p>   其實這就是師父在整個《廣論》的講說中,還有其他的教典裡,反覆教誡我們的生命目標的確定性,對無限生命的長遠規劃。這樣的規劃,我們是否能從內心深處產生熱忱,和自己的苦樂掛鉤?因為要圓滿所求的樂,和究竟地離苦,你不成佛也達不成。 [01′13″]</p>
<p>   越學越多的時候,我們就會詳細地去了解,我所希望成就佛果的佛陀到底有什麼樣的功德?分分斷證。甚至菩薩到底有什麼樣的功德?乃至入道之初的皈依之門是怎樣的?乃至從我現在開始,聽聞軌理是怎樣的?在聽聞的時候發心是怎樣的?那麼在正聞的時候,我又如何觀照我的身心,避免進入昏沉和散亂都不自知?總是走神啊,或者會陷入到一個疑問,聽、聽、聽,突然出現一個疑問,然後就整節課都在想這個疑問,結果師父在講什麼沒聽清楚,然後我再跟大家一起研討也沒聽太清楚,整節課下來就是盤那個疑問。我建議不要這樣,你想到一個疑問先把它放著,然後往下聽!不然一節課就是那個疑問。 [02′11″]</p>
<p>   比如去跟師父學習的時候,我也是會問師父問題,但是呢,通常問一個問題之後,有時候會發現師父好像沒有回答我的問題,師父在講他想要講的。這個時候你總不能說:「啊,師父!我要問您的問題不是這個!」應該弟子都不會這樣做。所以你就要聽啊,就要聽!聽一聽發現:欸!師父是在一個更廣闊的角度上,講了他的一個視野、他的一個角度。能不能站到跟師父一樣的視野?很難!但是你慢慢地超越你原來的水平這種高度、地平線,慢慢、慢慢站得高一點,然後再去看你剛才那個問題的時候,就會發現:欸,這個問題小很多了!不像一粒灰塵沾在鼻子上,覺得好大好大,但是實際上照鏡子一看,也只不過是一丁點大而已。 [03′10″]</p>
<p>   所以師父常常教給我們看待一個事情的角度和視野,當這個角度開始改變的時候,不同的東西就會出現,而我們常常是角度出了問題。比如說觀功和觀過,就會直接產生苦樂;比如說對現在我們在法人事業、各個研討班承擔的所有居士們,人在一起會不會有煩惱?會呀!這麼多原來都不認識,來自不同家庭、不同背景的人在一起,會有煩惱的,吵吵的、是是非非的這些。但是在這些所謂的事相上大家不一樣的看法、這些爭論之中,大家的發心是為什麼?注意!就是為那個目標——希求佛果。 [03′56″]</p>
<p>   在爭論的過程中,是以法繩人、要求別人如法呢?還是要消滅我愛執?是把「我」越吵越大,還是注意在這個整體的大環境中,用一個謙虛的心去和其他居士互動?你要不謙虛,就變成我越來越大,要不好好調心的話就會很麻煩,對不對?因為到處都是問題、到處都是問題。然後你會發現說:很多為難的事情我都知道啊!這樣就很辛苦。 [04′28″]</p>
<p>   但是你想想,知道很多為難的事情之後,在這個事情上的法——向內調伏的法,知不知道?受了很多委屈、很多辛酸、很多苦楚自己知道,但是這些委屈、辛酸和苦楚上面所揭示的法,就是那個業呀,業!我們會覺得:表相上看起來,啊!都是因為你不理解我、因為你那樣說我才傷心。但是為什麼我遇到這樣的事情會傷心,而沒有高興呢?高興什麼?淨化業障呀!正因為我解決不了現在的問題,遇到問題就卡住,所以我才馬上就翻《廣論》、馬上就緣師父的法,才能在各種煩惱的境界中挺立到現在。 [05′13″]</p>
<p>   有沒有煩惱?有啊!一天一浪一浪地都不停。那為什麼能在這過程中一直堅持修行?就是師父說的——歷事練心!練什麼呀?練我們皈依的心、緣法的心、提正念的心。所以你恰恰會發現,就是這些煩煩惱惱的事情,就是這些好像是是非非的人和事,卻讓我們不停地醒覺:我要提正念!我不能迷失其中,我不能被現象所迷惑,讓自己的修行原地踏步。要看著師父的希望,為著師父,我必須超越煩惱的心情和下劣的見解,要再再地提起正知見。 [06′02″]</p>
<p>   好,我們現在聽一下! [06′07″]</p>
<p>   同樣地,因為這樣的原因,所以我把那個講法本身,也完全改變、完全改變。以後原則上面都是遵循這一條道路,講到每個地方,總要使我們對它產生一個認識。然後這個認識當中,慢慢地去推展擴大,而不忽視整個的內容。等到我們有了這個認識以後,慢慢地到某一個程度,然後把整個的全貌安進去,使得我們對於整個佛法,有一個正確的認識。 [06′44″]</p>
<p>   所以我們這裡是簡單地說明一下,宗喀巴大師他當初是這樣的,他說他是先在教法上面,有了這樣的一個認識。所以當年,在他那一個時代,他在整個西藏,可以達到獨一無二的,最高的這樣的一個地步。先在教法上面,我舉一個典型的例子來說一下。他曾經講法,同一天講法講二十一部論,換句話說,我們在平常講法,一座、一座,他講二十一座。 [07′22″]</p>
<p>   好,我們就先把 1B 的最後一段研討一下。師父說:「<p> 同樣地,因為這樣的原因,所以我把那個講法本身,也完全改變。<p> 」同樣的什麼原因啊?還記得上節課提到的嗎?原地踏步、修了半天都弄錯了、未會先會、冤枉苦頭吃得太多,因為這樣的原因,師父看到宗喀巴大師有這麼高的修行成就,指出一條路,把整個的教法都振興起來!而且到今天我們還能這樣受用!是因為這樣的原因,師父跟我們講《廣論》、研討《廣論》;同樣也是因為這樣的原因,師父把講法本身也改變了。可以說應該原來師父不是這樣講《廣論》的,翻開可能就開始:「《菩提道次第廣論》,『菩提』是什麼意思......」可能就這樣講。你看,師父在 1A、1B 已經花了這麼大的篇幅,都在講到底怎麼修行、怎麼選路。應該說在正式地學習本論之前,師父已經一直在告訴我們修行的經驗、入手處到底是怎麼做的,所以他把講法本身就改變了。 [08′40″]
<p>   師父說:「<p> 也完全改變、完全改變。以後原則上都遵循這一條路<p> 」,什麼路啊?「<p> 講到每個地方,總要使我們對它產生一個認識。<p> 」注意!這句話是什麼意思?什麼叫「講到每一個地方,總要讓我們對它產生一個認識」?什麼叫產生一個認識?是不是你有個判斷力,你有一個見解出現,對吧?這個見解要不要是正確的?比如研究每一段,剛才這一段提出的就是:師父為什麼要講《廣論》?師父為什麼要改變說法的方式?難道我們會認為師父不會那樣說法嗎?看師父的日記就知道,師父的日記裡完全是另一種,幾乎都是半古文的,非常地簡潔,因是什麼、果是什麼,破、立......,都是這種。一個多了的字都沒有,非常地簡潔、明了,又深刻,一段文字大概要讀好多遍,就是這樣慢慢地去看;完全不是這樣像散文式的,像一條河一樣鋪在我們面前,不是這種方式的!所以他改變的方式是什麼?那麼因為這樣的原因改變的話,改變到哪裡去了呢?就是「講到每個地方,總要使我們對它有個認識。」 [01′27″]</p>
<p>   那我現在問大家:在上研討班的時候,每上一節課,大家都對自己上的課有一個清晰的認識嗎?還是有的同學在班裡吵啊、吵啊、吵啊?到最後結論是什麼都不知道,在心裡邊掛著很多很多問號,然後這節課問、下節課問、下節課再問,好像還是很不清晰。如果這樣的話,你們能夠吵個十年、二十年也是太精彩了。 [01′55″]</p>
<p>   但師父在此處說,要有一個清晰的,對它產生一個認識。比如:師父為什麼要講本論?他的發心,是看到了修行者的什麼現狀他選擇講《廣論》?為什麼改變了說法的方式?看到了修行者的什麼現狀,希望大家能夠吸收,能夠改變、能夠馬上產生一個認識——講到每個地方都產生一個認識。就是對症下藥地——欸,你有什麼痛苦?你現在修行遇到什麼問題?然後師父就講這樣一段。 [02′25″]</p>
<p>   所以它不是無的放矢的,好像師父就開始自己講了,不是這樣的!每一個、每一個都針對他所了解過的居士們、法師們修行的難點,或者出現的問題,來講《菩提道次第廣論》,回答這些問題,給我們找到出路,所以才「總要使我們對它產生一個認識」。不是越講越玄,進入到非常迷惑的那種狀態,而是非常清晰的,腳下的路越來越清晰、眼中的問題和答案也越來越清晰。所以是不停地提出問題、解決問題,斷除疑惑的這樣一個過程。 [03′02″]</p>
<p>   當然你可能說,由於師父的問題,讓我們把問題更廣闊地探討開了,但總得有一個結論。比如說這個結論,再說一遍:為什麼要講《廣論》?為什麼用這樣的方式講《廣論》?師父講得非常地清楚,就是為了我們能夠受益。這樣的講法方式,其實師父是很辛苦的;如果按照註釋講是很容易的,你就照著那樣講就可以了。可是根據人心來講、根據大家遇到的難題來講,然後又要把本論所闡述的東西闡述明白。再換句話說,本論所有的立宗,也就是為了回答修行者心中的難題和疑問,為了把我們在原地踏步、不能前進的這種障礙清除掉,看到修行的坦途,師父才宣講《廣論》。 [03′51″]</p>
<p>   所以「<p> 講到每個地方<p> 」,注意哦!這句話我覺得是非常非常地動人。「<p> 講到每個地方<p> 」,也就是師父對自己講法的那個高度,說:「<p> 總要使我們對它產生一個認識。<p> 」每個地方哦!大家都學五大論了,知道每個地方你都要有一個清晰的認識是一件非常困難的事情!「<p> 然後在這個認識當中<p> 」,注意!還要「<p> 慢慢地去推展擴大<p> 」。不是得到一點就滿足了,而是沿著你所了解到的這點,慢慢推進你了知的疆域、了知的國土,去拓荒,去把那些不知道的全部消除掉!讓我們所知的疆域擴大。很遼闊吧!在認知的這個廣闊天地中,我們不是只看到一點點手指尖那麼大的位置,而是沿著這樣一個認知慢慢地去擴大,去體會到心靈深處對一個事物認知的遼闊、深遠的一個舒暢的感覺。 [05′00″]</p>
<p>   而且它是慢慢地推展、擴大,後面這句話:「<p> 而不忽視整個內容<p> 」。注意!這是點式的,而整個內容是什麼?全圓的。非常像那句話對不對?像一條念珠一樣,當你念到眼前這一顆念珠的時候,這顆念珠是非常非常清晰的,但是你提這一顆念珠的時候,你會把整串的念珠全部都提起來,它是一串的。所以師父是在每一個地方,讓我們對每一處的法義了解得非常清晰的時候,又從全圓的一個角度,再度地認知此處在全圓的道次第中,它所佔的位置。所以你不停地會透過眼下我們經過的這個地方,看到全圓的。 [05′49″]</p>
<p>   舉個簡單的例子,萬里長城。萬里長城,不知道有多少人登過?你登萬里長城,到每個地方它都有一個望遠鏡,可以望到最後面那幾個垛口是什麼樣。後面的垛口有多難呢?就是你要看著前面的人的腳跟往上爬,是直的!看到這樣的後段路的時候,敢去爬的人就越來越少了。而且爬完之後最大的問題是:你怎麼下來呢?它是直的呀!但是我也去爬了,因為很想看後面是什麼。 [06′26″]</p>
<p>   所以到每一個地方的時候,不僅可以站在此處,看群山的顏色都在改變,然後你回頭看看長城蜿蜒地爬上來。所以爬到每一處的時候,都有一個看全圓的狀態。 [06′39″]</p>
<p>   那麼問大家一句:對全圓的道次第要怎麼看?都是在此處看全圓,對不對?是不是用我們的抉擇慧在看?從此地能不能真實地看到佛果?是看不到的!但是我們會用我們的抉擇慧一遍一遍地去看。所以並不是學到眼前就局限在眼前,而是透過眼前清清楚楚的認識,再從全圓的道次第看一下眼前又是怎樣。這樣的話,我們對整體教法的圓滿認知,是不是透過每一節課都再去緣圓滿的? [07′20″]</p>
<p>   有聽清楚嗎?不要睏喔!這麼重要的問題,千萬不能昏沉地聽喔!有的人一到重要問題就開始昏沉。 [07′30″]</p>
<p>   所以每一個到眼前的問題,它都讓你產生一個更遼遠的,對圓滿教法再度地認識、再度地認識。所以最後你學到每一點學多少遍,那圓滿的教法你就串多少遍。注意喔!這是師父教我們的方式喔!「<p> 而不忽視整個的內容。等到我們有了這個認識以後,慢慢到某一個程度,然後把整個的全貌安進去。<p> 」然後「<p> 使得我們對整個教法,有一個正確的認識。<p> 」實際上這個過程是重複地發生的。比如說走了兩里路了,「啊!那再看一下我們爬山的圖,再看一下全圓的圖。」不停地看著這個全貌、全程的圖。 [08′11″]</p>
<p>   不停地看這個佛法全貌的圖是為了什麼?你們的答案是什麼?一個是每一步都不要走錯。還有一個——「此處風光甚好,我們是不是多留幾日不要走了?」後面還有更好的!因為我們這條路的最大魅力就是一山比一山更高,越走越快樂、越走越快樂,所以說呢,你常常看全圓的圖,你就不會迷戀此處的風光。 [08′38″]</p>
<p>   另外還有的路特別難走,像我說的,根本就是爬不上去。爬不上去,你不要認為你爬不上去,因為前面會有人領著爬。而且,沒有力量——前面的理路說過,沒有力量怎麼辦啊?師父說:「沒關係,一步一步來!」當下走一步、再走一步、再走一步,還是上得去的。所以不管對難的還是對容易的,當前的一步總要走上去,而且要一直去看佛法的全貌,全貌就是一定要走到一切遍智的果位。處處在提醒著,我們所學的一切都是為了成佛! [09′17″]</p>
<p>   這個會不會很重要?還是我講得很高興,你們不知道在想什麼?這可不能打瞌睡喔!我費了這麼大力氣講,千萬要認真聽喔! [09′28″]
<p>   師父怎麼樣去講這本《廣論》?他的方式在第一篇講得這麼清楚,師父就是一個把話說得清清楚楚的人。但是對我們來說,最可怕的就是不能清清楚楚地聽,聽完了糊成一團,然後還要拿來吵來吵去。很多同學聽了一個大概,然後趕快去跟同學吵,花很多時間去吵。其實你不如把師父帶子多聽幾遍、多聽幾遍。欸!一遍比一遍更清楚,聽清楚之後才去吵;不然一知半解,吵了半天之後發現自己沒聽明白。但可能這也是個過程。 [00′33″]</p>
<p>   所以在每走一步的時候,能夠對它有個清晰的見解,而且慢慢地去擴大自己所知的領域,而且不忽略、不忽視整體的內容;然後到了某種程度,把整個的全貌安進去,使得我們對於整個佛法有個正確的認識。 [00′56″]</p>
<p>   上一節的時候,有法師問:「什麼叫『對佛法整個圓滿的內容有了正確的認識』?」此處出現了嗎?當你捏到任何一顆念珠的時候,它是一百零八顆念珠中的一個,但都是提起全圓的——是全圓的法。那麼到底如何體會這句有點深奧的話?在學習每一個次第的時候,都要常常發心啊、都去想。所以大家這個道理是這樣聽了,要在聽聞中、在自己的修學中慢慢地去體會,不要停在眼前,一直要向前努力! [01′35″]</p>
<p>   我不知道你們聽到此處,會不會有點欣喜和振奮呢?我自己是很欣喜和振奮的,因為每學一遍都有不一樣的感覺。所以想一想,師父在此處是這樣講的,其實他也是這樣修持的。就比如說非常平淡無奇的一件事情,師父就可以在其中開示出道次第。像開上座學長會,開會之前師父就念《般若經》,然後給大家講一段般若;像學長有問題要問、法師們有問題問,師父都先講般若。請問般若能不能解決「我們下半年的行程是什麼?」般若可不可以解決這樣的問題呢?你們敢說不能嗎?那你說能,是怎麼解決的? [02′27″]</p>
<p>   所以,為什麼是「法人」?為什麼要起這樣的名字——法人事業?這跟很多人一起成立的公司有什麼不同?為什麼這裡邊要念《般若經》、要學《廣論》,還要開研討班?經年累月地這樣哦!然後學《南山律》。學這一些是為什麼? [02′48″]</p>
<p>   所以尤其是開會、議事,這樣慢慢地在商量事情的時候,一定要先提起什麼?正知、正念。先想想:我們這個會議,注意!我們對這個會議的認知,在全圓佛法的道次第中,是不是為了成佛來開這個會的?還是只是把問題分配清楚,「啊!你去做這個、他去做那個、他去做......」分配清楚了,會議就開完了?那麼我們在這個會議中,自己得到了什麼?積累了什麼資糧?發心又是怎樣?有沒有注意防護自己的律儀——菩薩戒呀、密乘戒呀,甚至皈依學處,有沒有注意在防護? [03′30″]</p>
<p>   所以對於開會這件事來說,要非常非常注意開會的發心。我們「歷事練心」練的什麼心啊?首先是練發心。另外在涉及到具體事項的時候,為什麼「我」越來越大?給我們一個事情,這件事情就執著地不得了,就是比天大、比地大、比什麼都大,眼睛裡就只有這個事情。然後當別人一碰這個事情的時候,啊!煩惱就出現了。煩惱出現怎麼辦啊?及時發覺,然後去調整。從朝向「我」越來越大的角度,把它轉向什麼?要克制這個「我」,要知道這習氣又出來了,然後去對治,要根據《廣論》去看。當你調伏一下「我」的時候,你就會有一種快樂的感覺,因為痛苦確實是「我」不停地增大導致的。 [04′20″]</p>
<p>   那麼當這個「我」在所有的事項中越來越小的時候,實際上和合也不是特別難做。只要你發心開始對治「我」,那麼別人跟你吵的時候,你就要注意:「小心!一會兒你就把我的『我』吵出來,很大!其實我的『我』和你的『我』也不相上下,我又不是不敢跟你吵,只不過是現在修行了,裝也得裝著向內調伏!」對不對?開始是裝,忍不住;嘴上不講,我可以在心裡忍;忍了之後,忍不過去在心裡嘀嘀咕咕、嘀嘀咕咕的,甚至很痛苦;慢慢地,心裡的不安也好了。 [04′57″]</p>
<p>   你看研討班裡每一節課學習,其實都是可以對你當天的煩惱進行清理,至少你在上課的時候,你不用緣那些煩惱了吧?專心地聽,聽了以後煩惱好像忘了,一下課,唉!又出來了。那你聽完了之後,煩惱的強度應該有變低一點吧?聽課的時候,聽、聽、聽,聽到一個理路可以原諒對方了。還有一個,想想說:「哎呀!這個佛法非常不容易,他能來學習,我還是忍一忍讓他好好學吧!」總之,哪怕生出芝麻那麼大的善心,其實有的時候也可以幫我們扛過很多事情。善心的力量非常地不可思議,小小的一點善心,你就可以撐很大很大的事情。 [05′40″]</p>
<p>   而這點點滴滴的善心,點點滴滴對他人的寬容,還有對正法的憶念,全部是師父教導我們的。感恩佛陀,感恩宗大師;感恩師父不辭辛苦地在三十年前,就開始在這個世界上為我們宣講《菩提道次第廣論》。而且是看到了我們修行的難處和苦楚,不忍這樣的事一直進行下去,所以他非常非常慈悲地為我們講說,陪著我們修行。而且用這樣的方式講,我們都會有感覺,每天都會有感覺;有感覺就不會覺得佛法高高在上、根本用不到。因為能解決我們現在的煩惱還有很多痛苦,所以我們自然地就會嚮往它、皈依它、願意學它、堅持學它、歡喜學它。所以大家一定要歡喜地堅持下去! [06′39″]</p>
<p>   好!到現在就把 1B 講完了。下面宗大師的那一小段,準備到 2A 的時候再講。第一盤就花了這麼多功夫,不知道你們在想什麼?你們會不會想:喔!要把整本講完得花多少時間啊?也不一定都講得這麼細!因為一開始是對總體的修行方式和講說的一個介紹,所以學得細一點。如果你們覺得太細,可以變快一點,沒關係!還是看大家。 [07′10″]</p>
<p>   所以你們可以把你們的想法寫給我。讀到你們的信,有的時候是滿感動的,有的時候是熱淚盈眶。覺得有這樣的一些了不起的居士,在這個濁世間這麼認真地修行自己,對三寶懷著如此虔誠的心,有的時候我真的在想:啊!好好頂禮、好好頂禮呀!雖然說好像是我在帶著大家學,但實際上也是大家帶著我學,我們是互相地、一起跟師父學。 [07′41″]</p>
<p>   好,謝謝! [07′44″]
<p>   大家好!又到了我們一起研討《廣論》的時間了,覺得很幸福!因為每到聽師父的《廣論》帶的時候,就會回憶起跟隨在師父身邊學法的日子,那是我的生命、鳳山寺很多法師的生命中,還有很多居士生命中,最最美好的一種回憶。 [00′29″]</p>
<p>   每每提到宗大師教法,師父都會非常地感動,有的時候會熱情洋溢。在師父的心中,宗大師教法是那麼地清淨圓滿,引領著很多很多有情走向解脫、走向成佛。跟隨在師父身邊的時候,會深刻地感受到師父的身語意傳遞強烈的虔誠的力量!所以今天我們在上課之前,也希望大家能夠端正自己的發心,用一個大乘的意樂——為利有情願速成佛,以這樣的意樂聽聞今天我們研討的部分。 [01′33″]</p>
<p>   如果以一個清淨的、哪怕是造作的「為利有情願成佛」這樣一個動機,終於有一天,我們由於造作、不斷地串習,會生起真正的菩提心。所以每天研討之前動機的調整,還是不可或缺的,是非常重要的,可能對我們來說有如陽光普照一般。 [02′01″]</p>
<p>   現在大家調整好了之後,我們就要開始聽師父的帶子。今天師父是講到宗大師開講十七部論的這個故事,可能稍稍有一點長,所以在聽的時候不要走神,要全神貫注,好嗎?如果準備好了就開始聽了喔! [02′25″]</p>
<p>   好,我們現在繼續下去。《菩提道次第廣論》,昨天說到那個宗喀巴大師,他一天能夠講二十一座,最多的時候講二十九部大論,一個法會當中。他曾經有一次在一個法會上面,他這麼說啦!他說:「現在末法啦!我們不管......大家都條件差呀!」他想起世尊正法時候的盛況,他就說在他們那個時代,就是指西藏曾經有過一個很輝煌的法會,在同一個法會裡邊,有一位大善知識能夠講十一座。十一座,就是每天這樣講經的法會講十一座,每座講一部論,每一部論它有一個主要的一個內容,然後要旁徵博引全部的經論。這是非常不簡單、非常不簡單的!我們平常講一部那都不大容易,他要講十一部。 [03′47″]</p>
<p>   那麼所以很多弟子就讚歎啊,所以就說勸請,請那個大師──宗喀巴大師。他就說:「假定我稍微用功一點的,也許可能做得到。」那麼所以很多弟子們、周圍很多的善知識都來勸請──法本身都要非常恭敬地勸請。那麼大師就說:「好,那我試試看。」所以他就事先馬上就閉關,一心一意地準備。那麼後來這個消息傳開了,本來大師已經是當地出了名的,所以有許多人聽見這個消息,大家就來請求說要參加這個法會,這樣殊勝難得,末法的時候,希望稍微減緩幾天,大家要趕來聽。 [04′46″]</p>
<p>   所以大師剛開始的時候稍稍講,經過了又緩了幾天以後,結果一天同時開講十五部大論;實際上講完了十七部大論。啊,大家是讚歎不已!以後曾經最高的時候講二十一部大論。我們單單聽見這個數字,啊!只是讚歎、讚歎,如果我們將來真的有機會能夠參加這種大善知識的修行道場,那時候才了解殊勝,不可思議。他不但如此,而且他自己本身的修行還一點都並沒有差脫,並沒有差脫!就這樣,所以這個地方特別說明大師本身的成就。 [05′38″]</p>
<p>   關於這一點啊,我鼓勵你們看一看宗喀巴大師的《應化因緣集》,佛教書局有。那同樣地,我們手上已經發的這個《阿底峽尊者傳》,它不僅僅是他的傳記,對我們有很大的啟發,有很大的啟示。那個就是本論的作者,而大師本身的成就之高,我這裡不進一步解釋。那個是造者。那麼下面就是翻譯的法尊法師,他是民國以後的一位了不起的大法師,他是走了沒有幾年,大概才四、五年吧!那麼我想我這個只是非常簡單的說明啊! [06′31″]</p>
<p>   好,大家剛才有認真聽嗎?師父在這一段裡講的宗大師講十七部論的故事,在克主傑大師所著的《宗大師傳.起信津梁》裡也有這樣的記載,那年宗大師是三十三歲。在這之前,他詳加閱讀所有西藏翻譯的經典,就是把凡是翻譯過來的經典,還有佛經的註釋都看了,因此他對一切經論就產生了許多許多的思考、抉擇,所以他就在三十二歲那年寫了《現觀莊嚴論》的廣釋,簡稱《善說金鬘論》。 [07′21″]</p>
<p>   大家都知道,今年(2018 年)我們夏天就在熱火朝天地學習《金鬘論》,整個寺院像過節一樣。我們這個學程裡面有應屆的學生,正式學《金鬘論》第二年;然後還有兩班是跳班的,可以想見跳班生是很辛苦的,因為我們是用藏文在學;還有一些隨喜的法師們,所以今年整個寺院掀起了學習《現觀》的熱潮。我也在學,我們每天都像過節一樣。 [07′57″]</p>
<p>   尤其是當講到《金鬘論》中的二十二種發心的時候,非常非常地感人!那一天是好幾個法師的生日,還有一個小沙彌過生日。他就跟我說:「老師,我過生日了!可不可以給我生日禮物?」我想了想,說:「我給你的生日禮物你敢不敢要?」他說:「敢收啊!」我就跟他說:「請你把二十二種發心完整地背下來。」因為現在漢文的翻譯還沒有最後確定,所以他先背藏文。「背下來之後,到我這來領生日禮物。」結果剛說完,就有好幾個沙彌舉手說:「啊!我也是今天生日、我也是今天生日......。」他們都要背二十二種發心。 [08′41″]</p>
<p>   從那天開始,我就收到了「啊!一個月之後是我的生日。」或者說:「前幾天我過生日了,我可不可以也要這個禮物?」可以想見法師們對於聞思的熱情和勇悍。其實他們已經有要背的很多經典了,那二十二種發心不是必背的,但是實在是太美、太美了,所以法師們都爭相地要把它背下來。我覺得這真是盛況,前所未有的盛況!其實挺想要你們能夠看到,但是透過我的描述能夠感受一下也可以。大家也可以發願以後能夠聽到漢文版的《現觀莊嚴論》,因為法師們已經學完了。今年這是第二梯次的《金鬘論》,今年《現觀》第二年。開心吧?聽一聽,開心吧? [09′28″]
<p>   現在我就給大家約略地講一下克主傑大師所著的《宗大師傳.起信津梁》對這一段的描述,其實跟師父描述的差不多。那年的大師三十三歲,有一天晚上,大概就是像師徒隨談一樣吧,宗大師就又講起了西藏智者們的那些傳記呀、事蹟。然後談到了四難論師釋迦獅子在一座中同時宣講十一部論,這應該是後期西藏地區同時宣講論典當中最多的一次。可以想像,當時師徒間聚在一起議論這件事情,然後宗大師非常感慨,這個時候格西夏敦等人就馬上祈請。看看!他們是很聰明的,就馬上祈請,說:「希望大師可不可以在這裡,也像往昔那樣宣講那麼多的論典呢?」看到這一段我就想:「咦!克主傑尊者有沒有祈請呢?」大師三十三歲的時候,克主傑尊者還沒有來。然後宗大師就回答說:「我如果稍加努力的話,應該能講那麼多論!」師父描述的也幾乎是原話。然後弟子們就說:「哎呀!那大師......」不知道他們怎樣稱呼宗大師?師父啊或者什麼?現在如果我們圍在師父旁邊,就會說:「啊,師父!那您無論如何一定要宣說啊!」可以想見當時很多弟子圍在宗大師旁邊的那種激動啊!都在虔誠地祈請。然後,宗大師居然答應了! [01′39″]</p>
<p>   所以在那個月的初十到月底,宗大師就進入了閉關——閉門閱讀經典,開始研閱經典做詳盡地準備。在月底的那一天他就出關了。大家都知道藏系的經函讀完之後就用一個黃色的經帛,上面拴著一條紅色的帶子,把書整整齊齊地包好。我們一本書是訂在一起,他們一頁一頁是散開的。大師就把所有的經論都綁起來擺好,然後就開始講。看到這裡的時候問格西拉,格西拉說大師講法的時候也沒看書,這已經是不可思議的事情了! [02′25″]</p>
<p>   在初一,他要開始講法的時候,桑浦那邊有很多具有希求心的三藏法師、持教者,一聽說大師要開始講十五部論啊,都想要來,因為馬上就要開講了嘛,大家就很希望宗大師能夠等他們。大家可以想想,這種心情啊,求法的你我都可以理解。如果聽說有傳法——十五部論,哇!那我們可能坐飛機的、坐船的、騎腳踏車的、跑步的可能都想來,因為實在是太殊勝了! [02′58″]</p>
<p>   所以,大師就等了。再往後三天他是怎麼等的呢?就講了密勒日巴尊者和馬爾巴尊者的一些教言,然後在初五——第五天的時候就開始講了。一天當中是十五部大論同時開講、同時開頭,比如說開始講「梵語云」,他都是這樣開始。從黎明講到黃昏,一天當中就講十五部論,沒有一部論是沒被講到的。在講完了兩部比較短的論典之後,又另外加上兩部論典,這樣的話就變成了十七部。想一想都會令人熱血澎湃! [03′43″]</p>
<p>   我先說一下這個十七部論典是什麼,大家可以先聽一下。這裡邊有《釋量論》、《現觀莊嚴論》,然後《阿毗達磨集論》,幾本了?三本了。數喔!第四本《俱舍論》、第五本《律經根本文》,接著就是《慈氏五論》的後四部,就是《經莊嚴論》、《寶性論》、《辨中邊論》、《辨法性論》。然後是什麼?《中觀理聚五論》——《中觀理聚五論》是什麼呢?《中論》、《迴諍論》、《精研論》、《七十空性論》,還有《六十正理論》。幾本了?十四本了,對吧?然後第十五部就是《入中論》,第十六部是《四百論》,第十七部《入行論》。 [04′32″]</p>
<p>   像第一部《釋量論》,過去在西藏,對於《七部量論》這些論典學說的建立作抉擇的時候,他們會認為是一般共通的論議,一些人士會一致認為量論不是開示趣向解脫和一切智的道次第的理論。但是宗喀巴大師以清淨無垢的觀察智,對因明學的總綱和內容,像陳那菩薩所著的《集量論》及法稱論師所著的《釋量論》等著作,他就詳細地觀察和探索。在心中領會了在這些經論的理路中,完全無誤地開示修行大小二乘的道次第,他完全無誤地領受了這一點。因此他就對著作量論的師徒——陳那菩薩、法稱論師,生起了真實的——注意——非造作的猛利的信仰!這顯然是說,因明學不僅僅是一些見聞或者一些理路,它是真實的修行教授。 [05′43″]</p>
<p>   所以,在宗大師閉關修持的空隙間,他就閱讀《釋量論》。《釋量論》有一本解釋——《解說理智庫》,宗大師閱讀到第二品開示「道的建立」的時候,對法稱論師的學說和理路猛烈地生起了不可抑制的無限的信仰。據說那一年是在秋季安住的時間中,他一閱讀到《釋量論》的時候就油然生起了信仰,汗毛直豎,止不住地——他這裡邊寫「信淚長流」。這是在《宗大師廣傳》裡邊有記載的。「長流」是哭了很久的意思吧! [06′28″]
<p>   在這裡邊講的第一部就是《釋量論》,為大家介紹一下好不好?你們會不會想聽呢?還是只要聽到論的名字就好了呢?應該是想聽一聽吧!那我略講一下。《釋量論》是法稱論師所造,主要的所詮就是「推理八句義」:「正現前識」——認識的「識」、「相似現前識」;「正比量」、「相似比量」;「正能破」、「相似能破」——有沒有發現都有一個正的和相似的;「正能立語」、「相似能立語」,是說自己透過比量了解取捨,進而現證,之後再透過能破與能立語令他人了解。不僅僅是自己了解,透過比量了解了取捨,然後也可以令他人能夠了解。 [00′54″]</p>
<p>   所以第一品是講比量,第二品特別解釋《集量論》的〈皈敬頌〉。在這裡邊又非常重要地成立前後世,以及佛陀是正量士夫,就是我們為什麼要皈依佛、要皈依三寶,說成立佛陀是正量士夫。宗大師閱讀完就信淚長流。第三品講現量,第四品講能破與能立語。這是《釋量論》。大家可以想想,這是理路非常非常嚴密的一部論著。這是第一本對吧?這是第一本吧! [01′32″]</p>
<p>   第二本是《現觀莊嚴論》,就是我們今年夏天學的。以後你們也會學到,好好發願喔!好好發願!真的太好聽了,太好聽了!《現觀莊嚴論》是至尊慈氏所造,主要是講「八事七十義」,清楚地闡示了——注意——《般若經》的隱義現觀道次第。大家都知道《般若經》是解釋空性的,被稱為經中之王。為什麼被稱為經中之王呢?因為《般若經》的出現,就是為了解決眾生最深的痛苦——生老病死的痛苦,而《般若經》所解釋的空性,就是正解決眾生的生老病死。但是,如果沒有這個《現觀》解釋,我們不知道《般若經》裡面還有隱義的現觀次第。所以它清楚地闡示了《般若經》的隱義現觀次第,這裡邊提出了一切相智、道相智、基智,這就是我們最終的目標——獲得一切相智;進而修行正等加行、頂加行、漸次加行、剎那加行,最終會獲得果位的法身。這是《現觀》。 [02′40″]</p>
<p>   大家都知道《現觀莊嚴論》是無著菩薩到天上聽至尊彌勒講的,所以這是百分之百的天書。今年夏季我們就學了這本天書,還是滿接地氣的,非常地令人震撼。想想天人和我們都學一本書,好像也挺好的!然後又想想:哇!在天上是不是也有很多我的同班同學?想想滿高興的!這是宗大師講的第二本。 [03′16″]</p>
<p>   第三本書就是《阿毗達磨集論》,這個也是無著菩薩所造的,又名《上部對法》。它是從大乘共通宗義的角度,解釋了五蘊、四諦、三藏、修道的補特伽羅等諸法的名相。 [03′34″]</p>
<p>   第四部是《俱舍論》,對吧?《俱舍論》是世親菩薩造的,又名《下部對法》;《阿毗達磨集論》是上部,它是《下部對法》。它主要是從有部宗的角度,解釋了五蘊、十二處、十八界、二十二根乃至靜慮等諸法名相的內涵。《阿毗達磨集論》和《俱舍論》,一千多年前玄奘大師就翻譯過來了。我們寺院的很多同學也學完《俱舍論》了,隨喜呀!隨喜,你們要隨喜哦! [04′13″]</p>
<p>   接下來是《律經根本文》,這個現在還沒有漢譯本,它是功德光論師所造的。它是將律典中的內涵編排為三個部分:第一個是未得戒者如何才能受戒;第二個是已得戒律者如何守護;第三個是假設不慎違犯,那麼如何懺悔還淨,用什麼樣的方式懺悔還淨。其中清楚地解釋了每一條戒的內涵,包括依止阿闍黎、結夏、解夏、還淨的作法等等。這個我們寺院有一些同學,最高班的也學完了,隨喜!這是宗大師講的第五部了,十七部中的第五部。聽聽哦!把一部論學明白都是要很辛苦的哦!注意!現在才五部。 [05′06″]</p>
<p>   然後第六部是《經莊嚴論》,也是至尊彌勒造的,慈氏五論之一,引用了許多佛經,廣泛開示道的扼要。《經莊嚴論》,這是不是也是天書啊?也是天書哦!是無著菩薩到天上聽來的,他聽了好幾本天書哦! [05′30″]</p>
<p>   下一本是《寶性論》,也是至尊彌勒造的,慈氏五論之一。從中觀宗的角度抉擇心無諦實,闡示了心之上的空性即是如來藏,所以一切眾生皆可成佛。聽著的你別忘了,在這經典裡說:「一切眾生皆可成佛。」包括你我嗎?可以歡喜一下!一聽到至尊慈氏所造,就知道是誰聽來的啊?那個會飛上天的無著菩薩,又聽來了這本天書!然後我們在地上又聽到了天書,很神話吧! [06′10″]
<p>   接下來該第八本了——《辨中邊論》,是吧?又是至尊慈氏所造的,它是慈氏五論之一,特別開示了《菩提道次第》中止觀兩種修法。《辨中邊論》是天書之一吧?又是天書。然後還有一本是《辨法法性論》,也是至尊彌勒造的,慈氏五論之一,也是特別開示了菩提道次第中止觀的兩種修法,這兩本都是,對吧!這也是尊敬的無著菩薩聽來的天書。我現在在給你們講天書嗎?天書的名字和大概。以後要聽哦! [00′46″]</p>
<p>   注意哦!這都不是很容易的。接著是《中論》。《中論》已經有漢譯了,前面幾本都有漢譯。它是龍樹菩薩所造的,是理聚六論之一,主要是破除諸法諦實成立,以諸多的正理成立一切諸法沒有諦實,清晰地詮釋了中觀見。聽了要生大歡喜心哦,中觀見! [01′09″]</p>
<p>   接著是《迴諍論》,也是龍樹菩薩造的,理聚六論之一,主要解釋雖然諸法無諦實,卻不妨礙進行破立。然後《精研論》,也是龍樹菩薩造的,理聚六論之一,主要破除外道承許的成立諦實有的推理十六句義。接著是《七十空性論》,龍樹菩薩造的,理聚六論之一,仔細地解釋成立生、住、滅無諦實合理的正理。接著是《六十正理論》,龍樹菩薩造的,理聚六論之一,配合了小乘的經典,廣泛地講說證空性見是獲得解脫的根本——這個跟《廣論》的宗都是一樣的。 [01′56″]</p>
<p>   好美哦!現在想想,是不是很想坐在宗大師廣講十七部論的法會之中?你們會心馳神往嗎?不會打瞌睡吧?不要打瞌睡哦!我可是在這兒歡喜洋溢地講哦! [02′14″]</p>
<p>   接著是《入中論》,大家都知道是誰寫的吧?月稱菩薩——我們的寺院叫「月稱光明寺」。月稱菩薩從深廣兩種道次第解釋了《中論》的內涵,主要講從菩薩初地直到佛地的諸多功德。聽起來一定是生大歡喜的!然後在六地時廣泛抉擇了《中論》所說的空性,清晰闡示了應成派的中觀見。月稱菩薩是哪一位大德啊?就是在牆壁上畫一頭牛,然後就可以擠出牛奶的那位月稱菩薩。 [02′55″]</p>
<p>   接下來是《四百論》,聖天菩薩造,它是透過無邊的正理成立諸法無諦實。還是在講空性嘛!然後《入行論》,很多同學會背吧!寂天菩薩造的,主要是解釋菩薩怎麼樣修菩提心、行菩薩行的方法。到此為止是不是有十七部論了? [03′18″]</p>
<p>   可以想見哦!宗大師在一天之中要講十五部——因為之前有兩本講完了,又加兩本,變成十七部。哪一部論把它學明白了都是不容易的,能講出來也是不容易的。如果在一天中同時開講,而且格西說他是沒看本的、沒看解釋的,這已經不知道是什麼樣的神話了!而且宗大師在講說的時候,注意哦!他對於一些大論的難點,再以西藏論師寫的廣釋——因為前面都是印度祖師的論著,他以西藏的論師的廣釋作為根據的基礎上,又以其他釋論中破非立是的說法來作抉擇。並且在講說其他諸論的時候,大都根據各自論典的釋本——每一部論都有它的解釋——來詳細地講說所有的論典。 [04′18″]</p>
<p>   聽聽時間哦!講了多久呢?歷時三個月,十七部論全部講完了!從黎明到黃昏,歷時三個月的講經法會,何等地輝煌和難可值遇!就創造了大概是講說史上的神話,神話!而且在這三個月中間,宗大師白天講法,到傍晚結束後,每天的大威德金剛自入法,還有生圓二次第的修持,還有他已經承許的誓言等,要修的從未有間斷,沒有因為一天講十七部論、十五部論,把自己的功課就間斷了。他是何等地精進啊!這不是驚為天人的問題了。 [05′15″]</p>
<p>   所以那時候的一切大眾也就都稱讚,說:「哎呀!宗大師絕對是為殊勝本尊所攝受的,或者他是已經獲得了總持陀羅尼的大菩薩!因為別人很難、幾乎是不可能做成這樣的事情!」想一想:他對每一部論的難點都要旁徵博引地去作抉擇,所以應該可以理解為講得非常地深邃又淵博,聽的人到底是什麼感覺我們只能想像了。那種無礙的辯才,從宗大師的心續間自由地流淌三個月,參加法會的那些人,從黎明到黃昏哦,就這樣一直聽,還包括了好多本天書。 [06′13″]
<p>   師父在這裡邊講的是講這十五部論,後來因為有兩本講完,又加兩部論,十七部論!師父講的是這樣一個在佛教史上非常非常卓越、輝煌的歷史啊!每一個學經論的弟子,聽到這樣的善知識,能以這樣的力量同時在一天中講說十五部論,其實是不可思議的神話! [00′26″]</p>
<p>   因為我們今年學《金鬘論》的時候就發現,在一節課要把其中所謂的定義、界限,跟其他法的差別討論清楚,比如學《金鬘論》的時候,還學到嘉木樣大師的注疏、貢唐大師的箋註,然後還有《明義釋》,很多論師一起同樣對一個問題做討論的時候,你得把其他論師的觀點都聽清楚、記明白,然後在箇中抉擇他們中間細膩的差異。有的時候他們討論心續在一剎那間的差別,對它下的定義準確與否、界限準確與否,就那樣一個非常局部的部分,展開了非常廣泛精闢的討論。 [01′06″]</p>
<p>   我常常說:「啊!我們現在是坐在一個國際的佛教論壇上!」因為這些論師有很多是印度的、尼泊爾的,還有孟加拉的,還有韓國的,對吧?全部跨越時空的,因為有的不是同時代的。然後聯繫到我們現在講的善知識,還有聽聞的同學們。大家在學五大論的時候,不是會聽到 <p> ཁ་ཅིག་ན་རེ།<p>  ——「有的人說」?這裡邊「有的人說」特別多!當碰到「有的人說」的時候,後面一定會跟著一個自宗去評價他是怎樣的。就好像你練習武功,要進一個武功高手的住處,先出現了一個人來跟你練。練著練著你就覺得他可能是我的朋友,但是不對!他的見解是錯的。到最後自宗都會來告訴我們他的見解是錯的,但一開始都分不清楚,後來越練眼睛越利,就可以判斷出:欸,這見解好像不太對!但是哪裡不對?要見招拆招,就要把別人的武功秘笈讀透,你才能夠破他的路數,所以一定要讀熟很多論典。 [02′14″]</p>
<p>   在《現觀莊嚴論》的學習中,也廣泛地引到《般若經》的部分。所以讀到《般若經》原文的時候,再配合著《現觀莊嚴論》的解釋,你會覺得:哇!《般若經》好像就在眼前一樣!好像進入了佛陀講《般若經》的法會,詳細地在解釋。 [02′37″]</p>
<p>   我們這邊雖然不是很熱,但是有的時候也很熱,差不多是頂著酷暑。一開始是頂著一點小小的嚴寒,我們就熱火朝天地進入了聞思《現觀莊嚴論》的美麗夏季。那個盛況可能不是我簡單地用幾句話能夠講出來的,有的時候聽著聽著,就覺得自己的心好像飛上天了,簡直太美了! [03′05″]</p>
<p>   所以對我們修行者來說,用什麼來滿足我們的心呢?聽聞經典就可以滿滿的感恩,滿滿的滿足感洋溢在自己的心間。下課的時候我去看正學的同學,他們是越學越開心,看那一張張臉,哇,好像剛被水洗過一樣!每個人眼神中是有點疲憊的,但是大家都有一點掩藏不住的興奮感還有激動。因為聽到《般若經》中很多很多我們沒法理解的部分,《現觀莊嚴論》解釋得這麼清楚,真是一個難得的盛會! [03′45″]</p>
<p>   那麼師父在《菩提道次第廣論》裡,講了這個論前面的觀點:為什麼我們要開始圓滿地認識這條成佛之路,得到一個想要成佛的願望?就是學習《般若經》它的內義,把諸大論典其中的所詮聽清楚,然後確立自己生命的目標。這應該是師父讓我們去看《應化因緣集》的深意,去回想一下當年的盛況,以及為什麼要去講這樣一件事情,就是希望至少讚歎啊讚歎!「哎呀!要是能參加這樣的法會......」師父在這裡邊說:「<p> 我們單單聽到這個數字,啊!只是讚歎、讚歎,如果我們將來真的有機會能夠參加這樣的大善知識的修行道場,那個時候才了解殊勝,不可思議!<p> 」就是如果我們將來深入其中,詳細地聽聞那些精彩的解釋,每一個解釋都是細中又細、精確又精緻完美的理路,是很多很多修行者真正的饗宴、靈魂的饗宴。 [04′54″]</p>
<p>   希望大家能夠好好地發願,好好地學習五大論!因為法師們已經用藏文學了,慢慢地把它翻譯過來,我們就不用經歷語言關了。所以能夠在這樣的時代,值遇到師父為我們講《廣論》,我們才知道有宗大師教法;因為師父辛辛苦苦地培育了很多沙彌,到現在他們已經長大了、成為譯師,我們有了漢譯本的經典可以讀,這是一件很幸運的事情!不論你在生活中遭遇到一些什麼樣的苦惱,在聽經的時候就都忘了吧!渾然忘我,連我都忘了,何況自己的那些苦惱? [05′41″]</p>
<p>   所以這是一件多麼多麼歡喜的事情!要好好地隨喜自己值遇了宗大師教法,值遇了師父這麼親切地用我們完全能理解的說法為我們講《廣論》,句句都講到我們心裡去,跟我們的生命、跟我們很多現實的一切,都產生了共鳴和聯繫,讓我們在遇到困難的時候能夠想到師父的教誡是什麼、宗大師的教誡是什麼。所以雖然是天書,卻在說明著地上生活的我們的事情。原來天上、人間都可以同學一部論,這是一件多美好的事情!而且還有人把天書取下來給地上的人,這就是神話!我們就正在經歷這個神話。你會覺得你是神話裡的主人公嗎?你會覺得你是神話裡的人嗎?想一想,很開心吧!謝謝! [06′38″]
<p>   上一節課我們一起學習到宗大師講十七部論,今天我們要往下學習。大家可以先調整一下自己聽聞的動機,要造作一個菩提心的動機——為了利益無窮無盡的有情,我必須證得大覺的佛位;為了證得大覺的佛位,我必須去了解如何是成佛的因;那麼如何了知這個因?一定要聽聞佛法;佛法詳盡地揭示出一個有情從一開始沒有親近善知識,然後慢慢地親近善知識,直到內心中生起第一個道次第,乃至全圓道次第所有的過程。 [00′58″]</p>
<p>   所以聽聞的時候,要把自己的心從平常一些散亂的所緣中集中起來,就是要全神貫注,要習慣聽到師父的聲音的時候,馬上把心靜下來。當我們的心沒有其他的所緣,專注聽聞的時候,那應該是跟佛法相應的時候,也是我們生命中展現一種純淨、由於聽聞真理而產生愉悅感的時候。所以現在大家開始聽! [01′39″]</p>
<p>   現在看本文,翻到第一頁,第一頁。那個論也主要地分成三部分,分成三部分,第一個叫序分,那麼其次正分,最後結分;相當於我們平常的序分、正宗分、流通分。那麼這個最前面那個,現在我們開始的是序分,那序分當中又分三部分:第一個是「論前歸敬」——歸依跟禮敬;第二個,說明「造論的宗旨」,他為什麼造這個論的;那麼這末了一部分就是「敦勸」,一再地勸我們怎麼樣去聽受,怎麼樣去聽受! [02′46″]</p>
<p>   好,這一小段我們就不做更多的討論了,我們再繼續地聽。 [02′53″]</p>
<p>   現在看那個文。<p> 南無姑如曼殊廓喀耶(梵語)<p>   那是藏文,下面第二行就是翻成功我們中文的意思。<p> 敬禮尊重妙音(漢譯)<p>   「敬禮」就是我們說皈依啦!一心恭敬地禮拜。實際上這個敬禮是通於三業,而真正呢由於意業而形之於身、口的,形之於身、口的,這樣。那麼這個「尊重」呢,這個原來的印度,它這個有一個特別的名字叫「姑如」,姑如翻成功我們現在的話叫上師。所以這個上師啊,我們平常說上師好像是密教裡專門名詞,實際上不是,印度凡是對一個老師的尊稱就叫姑如,就叫姑如。那麼這個就是「尊重」,這地方。那麼「妙音」呢,就是文殊師利菩薩,普通大乘論所歸敬的都是文殊師利菩薩,論代表智慧。 [04′15″]</p>
<p>   好,下面師父解釋了「<p> 南無姑如曼殊廓喀耶<p> 」,以及「<p> 敬禮尊重妙音<p> 」。師父解釋了「敬禮」,說是皈依,然後在這裡師父強調說:「<p> 一心恭敬地禮拜。<p> 」「敬禮」,它的核心應該就是恭敬、專注,所以在這裡邊師父說:「<p> 敬禮是通於三業<p> 」,三業就是身、口、意,最重要的是那個「意」,你心裡有了,然後才能夠形之於身、口。 [04′55″]</p>
<p>   「<p> 敬禮尊重妙音<p> 」這「敬禮」兩個字,其實應該是有大學問的。師父在一開始的時候,講了恭敬是要內心中真正的恭敬,不要只是身、口做一個形式。所以如果是內心中真正的恭敬的話,那就要想很多了。比如說:我們恭敬的對象是誰呀?他有什麼功德?然後為什麼我要恭敬、我要去禮敬?恭敬的內涵到底是什麼?它有沒有層次的遞進?還有一點就是:在我從小到大生命中所有歷程,我有沒有由內心深處發出對父母啊、對我的老師啊,或者對一個什麼人的恭敬之心?內心中有沒有確確實實地體會過「恭敬」二字?當那種恭敬在內心中生起的時候,我們的身就不由自主地彎下去,呈現出由於內心而形之於身、口的寂靜恭敬的樣子吧!有沒有那樣很自然的、不由自主的恭敬?有沒有這樣的經驗? [06′15″]</p>
<p>   因為很顯然,我們去寺院,或者去頂禮善知識、頂禮出家人,我們都有這樣的體驗,到了某一種莊嚴肅穆的場合,我們的三業也隨之變成很恭敬。那麼恭敬這件事,有沒有成為我們生命中好像一個呼之即來、你只要想要恭敬它就能來的狀態?還是有的時候我們拜佛、面對經典,乃至我們面對出家人,好像要它它沒有——沒有那種油然而生的恭敬。如果沒有油然而生的恭敬,那麼這個敬禮有的時候可能就會流於表面,或者變成一種禮儀的形式,而缺乏了真正的內涵。 [07′01″]</p>
<p>   所以,師父講了「敬禮」這兩個字,就是一心恭敬地禮拜,他的內心中是有實際內涵的;由於內心中有恭敬的這個續流,然後才會形之於身、口,而不是只做個樣子。 [07′18″]
<p>   師父接著解釋了「尊重」,尊重其實就是「上師」的意思。然後師父特別解釋:提到上師,好像是密教專門的名詞,其實不是的,只是對老師的一個稱呼,叫尊重。「尊重」在《四家合註入門》裡也有解釋,它是上師、尊重和堅穩的意思,堅穩就是很深邃、很莊嚴。在《攝類學》裡也提到「喇嘛」,「喇」就是「上」,因為功德至高無上,所以稱為「喇」;如同慈母一樣悲憫一切有情,所以稱為「嘛」,翻成上師、善知識。 [00′48″]</p>
<p>   在這個地方,師父特別強調一下不是密教裡才這樣講的,其實它是對上師的一個稱呼。那麼師父為什麼要特別這樣講一下?就是有些人認為好像一研討《廣論》、一學《廣論》就是學密法。其實《廣論》是一部顯教的教典,這裡邊基本沒有提到什麼密法的問題。所以就是學一部論,像《瑜伽師地論》、《入行論》、《現觀莊嚴論》很多論一樣。它是從般若海中流出的一部論,並不代表它是密法。要是多多地廣泛地聽聞的話,就不會讓我們由於一個名詞不了解,而去曲解它的內涵、造成很多的誤解和沒必要的一些擔憂。 [01′38″]</p>
<p>   接著是「妙音」兩個字,師父說在這裡就是指文殊師利菩薩,普通大乘論所皈敬的都是文殊師利菩薩。我們小的時候,在每一間寺院裡都可以禮敬到觀世音菩薩、文殊菩薩、普賢菩薩。說到文殊菩薩,其實我們並不陌生,像五臺山就是文殊的道場,應該很多人都去過五臺山吧?所以在論前皈敬到文殊菩薩的時候,是否有一種很親切的、很熟悉的感動?因為可能和觀世音菩薩、普賢菩薩、地藏王菩薩......很多菩薩一樣,在我們生生世世的輪轉中,文殊菩薩已經不知道多少生來成為我們的依怙、成為我們的引領、成為我們心中的光明。所以,再次地看到宗大師在論前皈敬「<p> 敬禮尊重妙音<p> 」的時候,還是心裡滿溫暖的吧! [02′46″]</p>
<p>   「妙音」兩個字,在《四家合註入門》裡解釋:為什麼叫「妙」呢?因為淨除了煩惱的粗暴,所以稱為「妙」。為什麼稱為「音」呢?因為他具足六十韻音語,所以稱為「音」。短短的「<p> 敬禮尊重妙音<p> 」,詳細地解釋它的內涵的話,可能要很多很多!但是師父在前邊解釋的時候,就把「敬禮」的一個內涵講了,然後說到「尊重」是上師,「妙音」是文殊菩薩,代表智慧。 [03′24″]</p>
<p>   在這裡邊師父只是講一下說代表智慧,但代表智慧是什麼意思?我們為什麼會在輪迴裡流轉不能停息呢?就是由於我們沒有通達無自性的智慧。一旦我們懂得禮敬這樣的智慧的代表——文殊菩薩,懂得去追隨這樣的智慧、懂得去聞思修教典,獲得這樣的智慧,不隨順於以無明為罪魁禍首的整個輪迴世界的苦楚。我們將把愚癡翻為智慧、痛苦翻為涅槃,翻為生生世世饒益眾生的偉大的行為。 [04′04″]</p>
<p>   師父在淺淺地交代裡,蘊含了他深刻的悲心,就是希望透過這樣一個簡潔的介紹,讓我們能夠再度地會遇文殊菩薩,以及他偉大、不可思議的翻轉輪迴的智慧、空性的智慧,乃至很多很多。所以在這裡邊呢,如果我們真的「<p> 敬禮尊重妙音<p> 」,真正地用心下去的話,會感覺到師父透過這幾個字,也是在引領我們走一條路——追隨智慧、追隨文殊菩薩,開啟我們生生世世追隨善知識、追隨著《般若經》,乃至從《般若經》流淌出來的很多祖師所造的這種極其透徹、精闢的論典,來翻轉我們心中對於種種境界所安立的我愛執、自性執等等,實際上這真是一個光輝的開始! [05′07″]</p>
<p>   雖然說文殊菩薩代表智慧,就是這樣交代一句,實際上師父在引領我們走近文殊菩薩,走近光明和智慧的代表,走進論典、走進經典、走進佛菩薩偉大的心;學會去恭敬禮敬這樣的心、去傾聽這樣的心、去追隨這樣的心、去學習這樣的心。然後就必將結束我們在林林總總的對境之中所產生的種種非理作意呀、觀過啊,或者由於誤解、沒有聽明白等等,所產生的人與人之間的傷害;必將由於聽聞教典,讓我們更清澈地了解什麼是最正確的量,因為它就是智慧!從一個無染的心、從一個無漏的心裡邊顯示出來一個量,我們會去學習校對這樣的量、聽聞這樣的量,並且在心中先是熟悉、記住,然後慢慢去比對自心、調整我們的心。皈敬文殊菩薩、歸向智慧,翻轉由愚癡導致的一切痛苦的因和果。 [06′21″]</p>
<p>   其實這一小段,就是師父生生世世引領我們的一種慈悲的心意。他說要一心恭敬地禮拜,就是也希望我們在聽聞的時候,能夠一心地聽聞,然後在理解的時候,能夠專注地理解。追隨著上師、佛菩薩,生生世世走這樣一條和智慧永遠在一起、和光明永遠在一起,步步都遠離痛苦、步步都朝向歡樂的成佛的康莊大道吧! [06′53″]
<p>   大家好!又到了我們研討《廣論》的時間了。最近不知道你們都過得怎麼樣?生命中有很多歡樂、有很多痛苦、不如意的事情,但是無論怎樣,我們已經在這一期的生命中值遇了宗大師的教法、值遇了師父!所有痛苦的根源,不像看起來那樣存在於我心之外的境上的人和事。佛陀告訴我們所有痛苦的根源,在於心續上的無明。當這種無明沒有被破除的時候,我們在哪裡都會覺得不快樂,都會覺得有種種不如意。所以要像自己想像地那樣過快樂無憂的人生,就要終極地摧毀無明,因為無明才是一切痛苦的根本。 [01′14″]</p>
<p>   所以不像我們感受的那樣——痛苦是存在於我心之外的一個人或者事上,因為那人和事如果變得好一點的話,好像我就會感受得好一點;實際上是我們的心上有這種煩惱的習氣和種子。從這樣的一個角度思考的話,正因為我們內心的無明是可以被對治的,所以我們的痛苦也可以由於找到苦因、結束苦因而結束。所以無論在生命中曾經發生怎樣傷心痛楚的事情,都因為我們遇到了大寶佛教而有無限的希望,而此時正是我們會遇這希望的時光。所以很希望大家能夠專注一心,一起跟師父學《廣論》! [02′03″]</p>
<p>   如果準備好了的話,我們就可以聽了,今天應該聽到第二小段。聽的時候大家不要走神,端正自己的意樂,要認真地聽。 [02′18″]</p>
<p>   那麼這個「論前歸敬」,這個也是傳統的一種,一個傳統、一個傳承。它的意思有好幾點,最簡單的就是求加被、除障礙,使得造論能夠圓滿。對我們學者來說,使得我們了解我們的歸趣——就是我們的宗致,我們的宗致、我們歸投、我們趣向;也同樣地淨除我們的障礙,達到我們得到究竟圓滿。那麼這個是歸敬的意思。 [03′08″]</p>
<p>   好,那麼現在大家可以想一下,師父在這一段,從兩方面講了「<p> 敬禮尊重妙音<p> 」的意思。師父說:「<p> 它的意思有好幾點,最簡單的就是求加被、除障礙<p> 」,就是從造論者來說,「<p> 使得造論能夠獲得圓滿<p> 」。 [03′34″]</p>
<p>   可以想見多偉大的上師們,他們依然是遵循著這樣的宗規向佛菩薩祈求。其實這是一個非常美好的習慣,雖然它是一個傳統、一個傳承,但也不像我們想像那樣,好像就只是一個規定。假如它是一個規定的話,在這樣的規定裡有怎樣的內涵呢?內涵是最重要的!內涵就是使造論者和學論的人都能得到利益。從造論者來說,就是他會求加持,祈求能夠去除造論的障礙。那麼對我們學習的人來說,師父說:「<p> 使我們了解我們的歸趣<p> 」,他用了「<p> 我們的歸趣、我們的宗致、我們的歸投、我們的趣向......<p> 」這裡邊幾乎全部都在談「宗旨」對吧?我們的生命將趣向哪裡?從造業的角度來說,我們生生世世強烈的那個業會趣向哪裡?我們天天在研討《廣論》之前,一定要一個大乘發心,也是要將我們的這一次聽聞《廣論》造集的業,一直朝向成佛的方向,而不要朝向背離成佛的方向。 [04′46″]</p>
<p>   所以成辦一件善事也好,或者寫這樣一部偉大的論著、我們學這樣的論著、我們現在來研討《廣論》,其實也會遇到障礙的,有很多障礙。那麼怎麼樣能夠隨時隨地淨除我們的障礙,也使我們了解我們的歸趣、不忘宗旨?所以,上師們給出的方式是——<p> 敬禮尊重妙音<p> !禮敬佛菩薩就可以淨除我們學習的障礙嗎?就可以讓我們能夠憶念到我們的宗旨嗎?是這樣嗎?當我們在學《廣論》,遇到各種各樣的障礙的時候,我們有沒有想到要祈求佛菩薩呢?要禮敬佛菩薩呢?為什麼禮敬佛菩薩可以去除障礙呢?為什麼禮敬佛菩薩可以得到加持呢?當我們對佛菩薩擁有信心,有多大的信心就有多大的加持力,完全是觀待於我們的信心! [05′56″]</p>
<p>   那麼障礙這件事呢,有各種各樣的障礙,最可怕的應該是內心中生起各種煩惱的障礙。因為生起了各種煩惱的障礙之後,我們就會造惡業;造惡業之後,就會有更多的苦楚。所以我們能改變的、能操縱的,也就是自己的心念。遇到看似障礙的境界現前的時候,如果我們都能改變自心求得佛菩薩加持,來禮敬文殊菩薩、禮敬所有的佛菩薩,那麼每一次有障礙現起的時候,我們就禮敬了一次或者多次佛菩薩,所以這也是讓我們靠近佛菩薩一次一次的機會。 [06′42″]</p>
<p>   一旦熟練了這樣的一個方法,當我們感覺到很多事情不順、想去除障礙的時候,我們就不會在這些人事的是是非非裡邊一直糾纏,一直想要在這裡邊弄一個究竟。當我們發現無論講什麼、做什麼都於事無補的時候,也不是就走投無路了,因為我們還有一條路——就是禮敬文殊尊、禮敬所有的佛菩薩,這也可以去除障礙! [07′08″]</p>
<p>   當然這樣講一講,如何去體會在我們遇到障礙的時候,我們祈求佛菩薩會去除障礙呢,就是要靠所有的修行者身體力行,真正地能夠記住上師的這個行誼和他的教誨。因為師父在這裡邊說的是我們學習要不忘宗旨,然後要去除障礙,師父通篇都這樣講。在看師父的行誼的時候,大大小小的事情,比如說那個時候園區買地呀,還有像我們司空見慣的一些,比如說哪個有機的產品突然豐收了,豐收了之後短時間賣不出去怎麼辦?我看到師父,都是運用向佛菩薩祈求的方式。 [08′01″]</p>
<p>   這樣一位高僧他擁有洞悉很多很多事物的智慧,好像很多事情發生了,他都可以看到這個事情的本質。但是,即便我們看到的,已經不知道是怎樣行境的一位修行者、一位佛菩薩,他依然是去祈求佛菩薩!你說這是一種傳統、一種宗規嗎?是一種傳承!傳承的是什麼呢?當有大大小小的事情發生的時候,我們要去祈求佛菩薩,希望能夠得到佛菩薩的加被,去除我們的障礙。這樣的話,我們的善願就能夠圓滿,我們利他的心願,也透過一次一次地向佛菩薩的祈求和學習,調伏我們的內心包括我慢等等各種煩惱,更加趣向智慧。 [09′04″]</p>
<p>   所以,這應該是一個很美妙的傳規吧!當我們在念到《廣論》這句「<p> 敬禮尊重妙音<p> 」的時候,內心裡是否能夠進入到禮敬上師文殊的這樣一種續流中呢? [09′26″]
<p>   好,那我們現在開始聽下一段。<p>   那麼裡面歸敬的內容呢?第一個是說明這個「論」,造論,那麼造論的時候為什麼是歸敬文殊師利菩薩呢?我們曉得,我們的三藏分成功經、律、論,那麼論特別是講智慧的,能夠所謂深辨名相,了解了以後,然後能夠啟發智慧。而這個在佛法裡面,是由大智文殊師利菩薩作為代表的,這樣。那麼是可以不一定歸敬這個文殊師利菩薩,可以看它的特質而來這個歸敬,第一個。那麼下面就是三寶順著次序來,第一個: [01′08″]</p>
<p>   大家剛才有認真聽吧?好,那麼現在我提一個問題:師父在這一小段裡,第一個是說明為什麼皈敬文殊師利菩薩呢?大家有沒有聽到那個原因啊?師父說三藏分經、律、論,對吧?那麼《菩提道次第廣論》屬於經、律、論的論部。當時應該是譯師們的一個傳規,為了區分經、律、論,所以說就要在譯經的時候皈敬什麼、論的時候皈敬什麼、律的時候皈敬什麼。經主要都講佛菩薩的功德,所以皈敬一切諸佛菩薩;那麼律是皈敬一切智智,因為只有佛才能制戒,十地菩薩是不能制戒的,唯有佛能夠制戒;那麼論就是禮敬文殊菩薩。 [02′12″]</p>
<p>   所以在這裡邊,師父就說論是特別講智慧的,講到一個「<p> 深辨名相<p> 」,深辨名相。那麼「深辨」字面的意思,應該就是深刻詳盡地辨析。當然提到名相的時候,大家都知道學《攝類學》,名相啊、性相啊、界限、差別等等,這些內容要深刻詳盡地辨析,讓自己明了。 [02′42″]</p>
<p>   所以對這個「論」字,到底什麼叫「論」?嘉木樣大師他在《現觀辨析》裡說:具足了修治——修整、調治——與救護兩種功德的清淨能詮,是論的定義。世親菩薩在《解釋正理論》中也說過:「<p> 修治一切煩惱仇敵。<p> 」請問煩惱仇敵會怎樣呢?令我們徹底地不快樂。因為有苦因、有苦果,所以一定要修治這苦因和苦果,內心的煩惱才是我們真正的仇敵。那麼論的作用就是修治這個仇敵。 [03′28″]</p>
<p>   接著世親菩薩還說:「<p> 從惡趣諸有中救護。<p> 」我們現在是在人天善道中的人道,是很安樂的。那麼從生生相續的一個心續的續流這個角度來看,我們的心續裡有沒有惡趣的因呢?過去生中有沒有惡趣的因還沒有成熟為果的在這個心續裡? [03′50″]</p>
<p>   惡趣有多恐怖呢?學到「三惡趣苦」的時候,如果詳細地去思考、觀察一下,是很驚悚、很驚悚的!所以才需要被救護。如果惡趣不是那麼驚悚、痛苦那麼強烈、時間那麼長,也不需要救護了,因為還有很多安樂嘛!所以這個論它就有一個作用,就是把我們從惡趣、諸有中救護。 [04′25″]</p>
<p>   「由於具足了修治與救護的功德,所以是論。」具足了修治與救護的功德,救護哦!可以想見在煩惱的輪迴大海中,論典有救護的功能,好像一艘救我們的大船一樣。所以這個論的定義,其他宗派比如說外道,他們是沒有這樣的兩種功德的:修治與救護。為什麼說沒有呢?最根本的一點:你我生命中最慘痛的痛苦是什麼呢?一定是生死啊!無量劫的生死,我們與親人別離的眼淚,可能四大海都裝不下了。由於輪迴,每一期死亡所拋下的屍骨,如果都沒消失的話,不知道可以堆滿多少個世界。這麼長、這麼長的生死,如果沒有去解決它的話,在未來還將無窮次地經歷,這就是輪迴中最最深重的痛苦。那麼對於生死這件事情,到底要怎麼解決它?有什麼醫生可以治療死病?佛陀就是治療死病的大醫王,把我們從一切三有中救護。 [06′00″]</p>
<p>   這個論典,因為它詳盡地闡述——師父說「深辨名相」。像《現觀莊嚴論》,它就把《般若經》中的很多名相、性相等等,做一些深刻的辨析。讓我們了解如何是解脫道、如何是菩薩道、如何是大乘、大乘和小乘的差別等等。很多我們過去可能沒有花時間了解,但在將來一定會去修行的一些定義的界限,在論典裡會廣泛深刻地討論。這個對於我們的身心能夠達到一種修治和救護的功德,所以我們才學習論吧!所以才花時間,要在生命裡很認真地投注這樣一個學習的業力,很認真地發心來學習調伏自己這樣一顆心。 [07′04″]</p>
<p>   師父下面說:「<p> 了解了之後,可以啟發智慧<p> 」,在佛法裡代表智慧的是文殊菩薩。比如說《攝類學》,《攝類學》皈敬哪一位本尊還記得嗎?皈敬上師怙主文殊! [07′21″]
<p>   那在「<p> 敬禮尊重妙音<p> 」前面,有一個「<p> 南無姑如曼殊廓喀耶<p> 」,它翻過來就是「<p> 敬禮尊重妙音<p> 」。在仁波切的《四家合註入門》裡邊,第五十一頁有講到:「廓喀耶」的「耶」是什麼?就是「<p> 所為格<p> 」的意思,所為格是藏文語法的一種用法。這裡要表達什麼所為呢?說:「我們禮敬的目的,就是為了止息自己心中的一切煩惱,領納上師及殊勝天尊的加持,以及能夠易於究竟通達論義,由於這些目的,所以禮敬勝天尊。」 [00′49″]</p>
<p>   在這裡又再次提到了「禮敬的目的」,就是師父說:「我們的歸趣」,這講的是一樣的。說:「就是為了止息自己心中的一切煩惱」,如果煩惱是一場風暴、一場沙塵暴的話,那麼就提到了「止息」,為了止息它。為了這個目的,「領納上師及殊勝天尊的加持」。還有為了「能夠易於」,「易於」是什麼意思呢?就是容易;容易地「究竟通達論義」,就是從學者的角度究竟地通達論義。注意哦!這裡邊最吸引我們的應該是那個容易的「易」字,因為費了九牛二虎之力,結果還是很難了解我們所學經典的意思,如果得到了上師本尊的加持,能夠容易地、究竟地通達論義的話,那應該是非常非常美好的一件事情。所以非常非常希望我們透過內心對佛菩薩虔誠地祈求,能夠達到這樣的一個目的。 [02′07″]</p>
<p>   然後在《四家合註入門》這裡邊,也是五十一頁,你們現在都有書了吧!可以拿來看一看。仁波切講到:「這裡有一處巴梭法王的箋註。」然後說:「『<p> 此為頂禮殊勝天或根本上師怙主妙音<p> 』,就是頂禮殊勝天尊根本上師文殊怙主。」然後說:「巴梭法王的箋還沒有結束。「<p> 如至尊云:『由師恩德得見時。』<p> 」這是宗大師的話。話中所指的上師是誰呢?就是文殊怙主。我們讀過《廣傳》,都知道宗大師常常祈求文殊菩薩。「由於文殊怙主的恩德,使我見到一切法的內涵」——這是宗大師在《緣起讚》裡寫的——所以接下來才說:「<p> 故向功德尊勝之上師及妙音致敬。<p> 」 [03′09″]</p>
<p>   「由於文殊怙主的恩德,使我見到一切法的內涵」,見到一切法的內涵,就不會再顛倒地執取兩種分別的執著,讓一切還歸到真理本身,而不再有種種染雜。這個時候喧囂得像我們所害怕的輪迴的沙塵暴等等,就真的會止息下來了。止息了什麼呢?止息了苦因和苦果的無窮次的輪轉。那麼讓我們內心從種種痛苦的繫縛中、從種種痛苦的追逐中能夠解脫出來、能夠停頓下來的,那個最重要的因素、那個最重要的人,就是上師!因為這樣的緣故,他是「功德尊勝」——這是上師的意思——因為這樣的緣故,讓我見到了一切法的內涵,所以才向功德尊勝的上師文殊,就是妙音來致敬。 [04′23″]</p>
<p>   所以,我們在這一小段可以看到傳承,就是講論的善知識們、寫論的佛菩薩們,都是依照著這樣的傳承禮敬佛菩薩。那麼對我們學的人來說,是不是也要依著這樣的傳承會比較吉祥呢?那一定是的!所以在研討之前呢,也希望大家能有一個殷重的祈求。 [04′54″]</p>
<p>   比如說現在學《攝類學》了,大家都知道《攝類學》不是很好學,當初我們滿懷熱情地開始學,學了之後發現不是很懂。那麼法師們,尤其是我們寺院第一班的法師們,應該說他們已經跨越了這一關吧!他們也是從「是顏色都是紅色嗎」開始,就辯這樣的題,後來慢慢辯到可以讓你承認「是顏色都是紅色」。那麼怎樣在辯論場上被對手逼到走投無路的時候,還能突然產生閃電般的跳躍的思路呢?其實都離不開向善知識、向佛菩薩祈求。 [05′42″]</p>
<p>   所以對於我們一心追求智慧的修行者來說,祈求是一個非常重要的功課,或者說是一個非常必要的習慣,我們必須常常習慣向佛菩薩祈求、向善知識祈求。祈求的時候,可以讓我們暫時捨棄對一些事相上的成敗和眼前利益的過分錙銖必較,讓我們的心突然開始融入到一種非常深邃的、廣闊的生命視野之中,可以看到非常遼遠的目標。 [06′20″]</p>
<p>   我們此時所做的事情,當然都希望它能夠在事相上也成功,但是萬一在事相上沒成功的時候,我們是不能輸掉內心的。怎樣才能不輸掉內心呢?就是無論何種境界現前,必須保證我們內心去造集善業,就像寂天菩薩說的:「<p> 佛子雖逢難,善增罪不生。<p> 」那麼在一切惡趣、諸有和煩惱中,能夠救護我們的論典的這個功德,也是透過善知識的宣說,使我們能夠了解這樣的功德,能夠去成就這樣的功德。所以如果能夠養成常常向佛菩薩祈求的這樣一個習慣,我覺得是非常美好的。如果你已經養成了,那就繼續增廣它吧!如果你還沒有養成習慣,就從現在開始訓練自己吧!因為這是一個非常非常善妙的習氣,非常值得我們花時間、花心力去養成這個習慣。 [07′31″]</p>
<p>   所以我們知道祈求對我們生命是何等重要,也是透過學習論典、透過善知識講,才能夠了解到的;一切的美好,都源於我們有善知識的攝受和慈悲的引領。學到此處,會不會覺得:雖然生死輪迴的痛苦是很強烈的,但是佛菩薩、善知識的心——利益我們的心,可能強過它百千萬倍;一旦我們透過千百次的修鍊、無窮次的修鍊,淬煉自己的信心,堅定地在內心中去皈依、去禮敬佛菩薩的話,我們的生命肯定會一天比一天變得更美好的。為什麼?因為所有的問題都出在內心啊,改變內心就可以了。所以這是一個非常快捷的方法,就是祈求佛菩薩! [08′39″]
<p>   大家好!又到了我們一起學習《廣論》的時間,還是非常珍惜這樣的時刻! [00′10″]</p>
<p>   提到修行,首先我們為什麼要修行呢?是什麼理由推動著我們一定要修行呢?那麼如何修行?在修行過程中的對和錯、結果、驗證等等,這些都要聽聞教典,在理論上先了解,然後再付諸實踐。所以師父常常強調修行真的要從聽聞佛法開始,也就是按照這樣一個聞思修的次第開始。正確的應該是聽聞了之後,進一步了解了,把所了解的接著去驗證,這才是我們聽聞的目的。可是一旦搞錯了的話,就會聽了很多非常高的標準,在心裡眼界特別高,拿這樣的標準去看待別人,或者看待世上的事情,就是我們平常講的法鏡外照。這樣的話,就會造成由於了解了更多之後,產生跟境界不相容,會產生痛苦。所以修行最重要的是「向內調伏」——把聽聞來的道理、見解拿來比對自心、向內調伏。那麼對待他人,要用一個非常恭敬的、寬容的心態,去面對人生的種種。如果這樣的話,我們就不會扭曲了聽聞的目標,在聽聞之後能夠如法而行,我們的生命才能離苦得樂。所以希望這一點,我們要常常在內心中反覆地策勵自己。 [02′08″]</p>
<p>   好!接著我們就要開始學《廣論》了,我們要端正自己的動機,珍惜這樣一個學法的因緣。為了成就無上正等菩提,我們必須要去了解成就無上菩提的因;要想了解這個因,就要聽法。聽法的時候,要再再地造作一個大乘發心——為了無窮無盡的有情能從痛苦的輪迴裡透脫出來,我們必須去成就正等覺位。為了那樣美好的一天,所以我們現在做很多的努力。在聽聞的時候,要注意不要散亂、不要昏沉,要注意如理作意! [02′57″]</p>
<p>   上次我們講到「<p> 南無姑如曼殊廓喀耶,敬禮尊重妙音<p> 」,今天就進入敬禮釋迦佛的第一個偈子——「<p> 俱胝圓滿妙善所生身,成滿無邊眾生希願語,如實觀見無餘所知意,於是釋迦尊主稽首禮。<p> 」我們現在就聽師父的帶子: [03′28″]</p>
<p> 俱胝圓滿妙善所生身,成滿無邊眾生希願語,如實觀見無餘所知意,於是釋迦尊主稽首禮。<p>   這是我們本師釋迦牟尼佛。他分成功三部分——身、語、意,總括起來就是這個。那麼實際上,他這樣地分有他非常特殊的意義的,非常特殊的意義的!關於這個部分的意義,等到後面講皈依的時候再說。為什麼要擺在後頭講呢?當我們了解這個皈依的意義以後,然後去皈依的話,我們就可以馬上得到殊勝的好處,這樣。所以在這裡對於這個造者、造論的來說,他為了祈求加被、淨除一切障礙,使得造論圓滿,所以他那個頭上面有這樣的圓滿的皈依。那麼對我們學的人來說的話,一方面我們了解這個造論者的意義;同時我們也希望啊,我們學的人得到的內容。所以假定說我們能夠了解了這皈依的意義而去皈依的話,當下就會得到殊勝的好處。所以這一部分真實的內容,留待後頭講。 [05′12″]</p>
<p>   通常「<p> 俱胝圓滿妙善所生身,成滿無邊眾生希願語......<p> 」這個偈子,讀完了之後就開始解釋了,可是師父的第一句話是說:「<p> 這是我們本師釋迦牟尼佛。<p> 」其實我聽到這句話的時候是非常驚訝的!因為好像師父帶我們走進一個聖殿,帶我們去見佛,然後就說:「啊!這是我們本師釋迦牟尼佛。」這幾個字,我認為是非常非常令人驚訝的! [05′47″]</p>
<p>   如果像這個偈子中所闡述的那樣,那我們就要仔細看清楚:「這是我們釋迦牟尼佛」,「這是」的這個「這」,到底是什麼呢?師父解釋說分成身、語、意三部分,師父還講一下這樣分是有特殊的意義的。假如說我們要給別人介紹一個人,或者讚美一個人,其實很少會這樣分的,但是經典裡讚美佛菩薩是分身、語、意的,可以想見當初修行的時候,也是別別成熟為這樣的功德。 [06′29″]</p>
<p>   然後師父講到:「<p> 關於這部分的意義,等到後面講皈依的時候再說。<p> 」當初我讀到這裡的時候,就很想要知道:「哇!在這一節講了就好了,不然還要等很久,等到皈依的部分。」當我這樣想了之後,馬上師父就回答說:「<p> 為什麼要擺在後頭講呢?<p> 」我不知道你們聽師父的帶子有沒有這樣的體會,就是聽、聽、聽,心裡會現出一個疑問,現出來之後,師父下一句話馬上就回答這個疑問?那種感覺好像你的心聲完整地被師父聽到,而且幾乎是有問必答。所以「為什麼擺在後面講呢?」這就是我當初聽帶子的疑問。然後師父說:「<p> 當我們了解這個皈依的意義之後,再去皈依的話,我們就可以馬上得到殊勝的好處。<p> 」師父用了「馬上」,時間是非常快的!但一定是了解了皈依的意義再去皈依,可能篇幅要很大,因為這是一個〈皈敬頌〉,可能要挪到皈依的部分再仔細地去講。 [07′31″]</p>
<p>   然後師父就說:「<p> 對於造者、造論的人來說,是為了祈求加被,淨除一切障礙,使得造論圓滿。<p> 」當我們要做一件事,想要它順利的話,我們通常會採取什麼樣的方式呢?就是打點一些人啊,或者去做一些什麼。但是對於造論者來說,都是祈求佛陀加被,淨除一切障礙。成辦順緣的方便是這樣的,所以師父說:「<p> 圓滿的皈依。<p> 」 [08′03″]</p>
<p>   那麼對我們學的人來說,還是要一邊了解造論的意義,同時也希望了解皈依的意義而去皈依,這是師父的心願啊!又說了一句:「<p> 如果了解的話,當下就會得到殊勝的好處。<p> 」在第一段的時候,師父非常非常地期待我們要詳細地去了解釋迦佛還有所有佛陀的功德,了解了之後再去皈依的話,會得到不可思議的好處。所以在這裡,我們就會有滿滿的期待:要學到皈依,要把《廣論》向後學,要了解佛陀到底有什麼樣的功德,而且我們到底可以怎樣地「馬上」和「當下」得到殊勝的好處。注意!得到殊勝好處的是誰呢?就是了解了皈依的意義再去皈依的那個人,他會得到殊勝的好處,而且是馬上、當下就得到! [09′01″]</p>
<p>   所以一開始師父在解釋這一句偈子的時候,完全是從「我們」這樣去了解佛陀的功德之後,「我們」會得到什麼樣的利益,從這樣的角度勸發我們去學習了解佛陀的功德。了解了,產生真實的皈依心之後,多快可以讓我們的身心得到饒益。非常地親切,而且這樣的介紹應該內心沒有什麼牴觸。有的人會覺得:啊!信佛了,會不會是信一個什麼好像可以安排我們命運的那種。它這不是!是說:看你會得到什麼樣的好處,然後你自己從內心裡會真實地看到它的利益。 [09′44″]</p>
<p>   我覺得這一段的介紹非常地精美和別緻,為什麼呢?因為走向佛陀就是成滿自己殊勝好處的這樣一條路,是對自己好的。並不是說你一定要去多崇拜佛陀,而是怎麼樣能夠自己得到好處。所以這也是再再地彰顯了佛法對身心真實的饒益。因為師父講《廣論》的時候,處處都從這樣的地方,讓我們真實地意識到、讓我們真實地感受到,如果我們好好地了解佛陀的功德再去皈依的話,佛法對我們的身心的饒益,俯仰皆是! [10′25″]</p>
<p>   這一段很值得再再地閱讀、再再地去琢磨。而且在講到〈皈敬頌〉的時候,師父就講到了皈依,會讓學的人很嚮往學習後面的部分。所以一個非常非常善巧的老師、善知識,他會一直讓你期待著後面還有多少美好,因為這條路就是離苦得樂、從樂走向樂的一條路。所以講一個部分就埋下一個伏筆,讓我們期待:「啊!後面還有什麼?後面還有什麼?」有很多很多驚喜的發現在我們的未來等待! [11′09″]
<p>   好,那我們再聽一下第二段。<p>   那麼這裡簡單地說一下,我們釋迦世尊的身跟我們的身有一個不一樣,這是所以我們為什麼要皈依他的。否則的話,我們每個人說:「我,我好好的,我為什麼要皈依他?」欸!我這個身體是有漏的,是痛苦之本,那麼佛陀不是。他為什麼他不是,我是呢?我是無始以來造了種種的染汙之業,佛陀恰恰相反,無量無邊劫以來造種種的善淨之業,已經達到圓滿的程度。所以以這一種善法——善法是通於世、出世間,有漏、無漏的,現在他是無漏的,所以說「妙善」——以這樣的業、善淨之業,所感得的圓滿的這個身體,所以這個才是我們真正的要歸敬的。我們歸敬也可以得到了相應的好處,最後我們也可以達到佛這個程度,這就是我們最後的目標。 [01′22″]</p>
<p>   這一段有認真聽吧?注意哦!師父說:「<p> 簡單地說一下,我們釋迦世尊的身跟我們的身有不一樣的,這是我們為什麼要皈依他的理由。<p> 」接著出現了一個心態:「<p> 我好好的,為什麼要皈依他?<p> 」注意!「我好好的,為什麼要皈依他?」這是一種現狀,因為比如說在現實的層面——我們有房子住;雖然身體有的時候會有病,還算可以過;還有很多可以遊樂的呀...... 有很多很多好像可以快樂的事情。這個「好好的」,就是沒什麼事情,好像沒有什麼危險,沒有什麼不愉快的感覺,它是不需要再去強烈地改變生命、在現在的狀態中滿足的一個狀態,對不對?提出了這樣的一種——注意——現狀和心態,是不需要佛法的,是不需要佛陀來幫忙自己的,為什麼?因為自己好好的。 [02′42″]</p>
<p>   那麼這個「好好的」是指什麼好好的呢?有可能是身體,所以師父接著一句話就是:「<p> 我這個身體是有漏的<p> 」,出現了一個「漏」。那麼在最初學佛法的時候,我們會對這個「漏」非常地陌生——是有漏的,什麼叫漏?漏就是痛苦之本!接著師父說:「<p> 佛陀不是<p> 」,為什麼他不是呢,而我是有漏的呢?因為「<p> 我無始劫來造了種種染汙之業<p> 」,又提了一個名詞叫「業」,而且業前面有「染汙」兩個字。接著又對比佛陀說:「<p> 恰恰相反,無量無邊劫以來造種種的善淨之業,已經達到圓滿的程度。<p> 」佛陀是無漏的。 [03′35″]</p>
<p>   在這裡注意哦!出現了「有漏的」,還有出現了一個非常令人驚愕的時間詞,就是「無量無邊劫以來」。我們會發現在這一小段,出現了我們並不熟悉的佛法概念,比如說關於這個「漏」,到底什麼是「有漏」?《俱舍論》說:從所緣及相應其中的一種層面增長漏的法,就是有漏;反之就是無漏。還有《集論》說:與六種漏其中的一者相應的話,就是有漏;反之就是無漏。那麼「六種漏」是什麼?漏的體性、與漏相係屬、漏所係屬、與漏隨係屬、隨順漏,還有漏因所生的東西。這些都是「有漏」。在《現觀》第四品也提到分別心是有漏,現量是無漏。如果師父在這個時候,像我剛才一樣講了《俱舍》、《集論》還有《現觀》,我們聽了之後:「欸!『漏』到底是什麼?」還是搞不清楚。所以師父沒有這樣講,師父就直接說:有漏的身體是痛苦之本,這是不是把「有漏的身體」的屬性講得非常地到位和透徹? [04′56″]</p>
<p>   那說:「我的身體是痛苦之本嗎?」身體會病嗎?會!寒熱一觸及,它會痛苦、會不舒服;最可怕的,身體會死亡!那你說:與生俱來的這些東西痛苦嗎?不想的時候是不痛苦的,覺得很安樂,尤其是年輕、健康、精力充沛,是感覺不到痛苦的潛伏性和威脅性的。但是師父就直接說:「<p> 這個身體是有漏的,是痛苦之本!<p> 」因為那些痛苦只不過是沒有那麼強烈地顯現罷了。 [05′33″]</p>
<p>   然後師父用對比的方式,說:「<p> 佛陀不是。<p> 」佛陀的身體完全沒有任何的痛苦,為什麼呢?因為他沒有造就種種染汙之業。而在這個有漏和無漏的對比中,師父揭示出一個概念,是什麼呢?「無量無邊劫以來」。注意!這個「無量無邊劫以來」,我們小的時候聽故事,都說:「哎呀!在很久很久以前......」這麼不可稱數的時間,佛陀在做什麼呢?「造種種善淨之業」,就是他的心念、他的身體、他的思想、他的言語,都是在造集非常非常純淨的善業,已經到達了圓滿的程度,所以他是無漏的——就是沒有苦因在裡邊的;而我們的身是有苦因在裡邊、是痛苦的本,它會出生很多痛苦的,所以叫「有漏」。 [06′36″]</p>
<p>   在談到讚美佛身的時候,雖然師父說皈依放在後面講,但師父把「漏」、「業」、「無量無邊」這樣的一個時間和生命是生生相繫的這樣的一個屬性,在這一段裡非常猛烈地就推到我們面前了。其實這些概念是會砸到自己,我覺得好像被砸到一樣,會很驚愕的!開始會有點驚訝:「這都是什麼?」這是現實、我們面對的現實!但另一種更完美的就是佛陀,他達到的理想。所以理想和現實對比起來,才知道現實是不圓滿的、是有缺陷的、是有待改善的、是痛苦的,因為有更快樂的存在。這樣的話,我們就不能說:「我好好的,為什麼要皈依?」因為有漏啊、有痛苦的本哪!所以必須得皈依;不皈依,這些痛苦的本是去不掉的。所以用非常非常有力的理路,回覆了那個心裡耽著於現狀、不去想未來、很短視的一種價值觀吧!我這樣說是要向內觀察的,不是在說別人。 [07′45″]</p>
<p>   所以我會覺得,這樣一個精闢的闡述,又非常親切地用我們能夠聽懂的語言,再再地告訴我們:我們現在的身體到底有怎樣的問題、它是痛苦之本,因為這個我們才會去禮敬、去了解佛陀的身體有什麼樣的功德。從漏、業和無量無邊的時間來對比:我們無量無邊劫為什麼都這麼痛苦?因為無量無邊劫都造集染汙之業,而佛陀無量無邊劫都造集善淨之業。這樣的對比就像白晝與黑夜一樣,它的差別性是極度明顯,方向是極度兩端的。 [08′25″]</p>
<p>   所以在這樣的衝擊下,我們就會思考,就會推動我們那個不能思考的、安住眼前的現狀、覺得很滿足那種狀態開始睜大眼睛、開始思考:「這是什麼?這是什麼?」我們必須去思考、去觀察:是真的嗎?是這樣嗎?是痛苦之本嗎?為什麼會有無量無邊劫都造集善業這樣一個偉大的佛陀的心續存在?而我為什麼是這樣子?所以在師父的這種引導下,我們向內心觀察的時候,我們會發現這是能動心意、是會觸動內心的一種開示。 [09′14″]
<p>   現在我們可以接著往下聽吧?大家要準備好自己的狀態,就是要比平常的狀態專注,而且要深刻地思惟。好! [00′23″]</p>
<p>   從一開始的時候,在開頭第一步就提出來:我為什麼要學這個論?不是在這裡了解一點意思,只是使得我們口頭談話的時候覺得:欸,好像有什麼好講。不是!讓我們有這個認識,了解了照著去做,使得我們也能夠從充滿種種痛苦的染汙之身,最後得到這樣圓滿的佛陀的這個身體,所以它簡單的意思就是這樣。那麼同樣地,我們開起口來是啊,大家不是戲論嘛就是諍論,就這樣;高興的時候就是戲論,不高興的時候就是諍論,實在沒有太多意思!佛陀呢?欸!他能夠成就圓滿——滿足地成就一切眾生,說「無邊」哪,這個是說包含了一切眾生。眾生什麼?「希願」,希願!他們這個願望,最難能可貴、稀罕的他們的願望之處,這個就是佛陀的話。 [01′55″]</p>
<p>   接下來師父應該是要帶我們學習讚美佛陀的「<p> 成滿無邊眾生希願語<p> 」的語功德。但是師父說:「<p> 從一開始的時候,在開頭第一步提出來:為什麼要學這個論?<p> 」師父卻從佛陀的語功德跳到這裡了。有的同學就會想:「哎!不是要介紹佛陀的語功德嗎?師父怎麼會講說為什麼我們要學這部論呢?」師父說:不是了解了一點意思,然後談話的時候滔滔不絕要給人家去講,或者在很多人中覺得自己知識淵博去演說,不是為了這個目標學論的。為了什麼呢?師父再再地提醒我們,不是那樣的!「<p> 讓我們有這個認識之後,了解了<p> 」,注意!「了解了」之後那幾個字是什麼?有沒有看手抄?一起回答:「<p> 照著去做。<p> 」照著了解的去做,非常清晰! [02′59″]</p>
<p>   那麼照著了解的去做會達到什麼呢?「<p> 使得我們也能夠從充滿種種痛苦的染汙之身<p> 」,這裡邊有幾個字喔!「也能夠」,為什麼加個「也」字呢?因為佛陀成功了,我們也能夠嗎?有人成了,我們才加個「也」。然後「從充滿種種痛苦的染汙之身」,不是一種痛苦的染汙之身,「<p> 最後得到這樣圓滿的佛陀這個身體<p> 」。又再再地揭示出其實所有的眾生都可以成佛的。因為什麼?我們學了論,我們了解了這樣的道理,然後我們要照著去做,照著去做之後慢慢地改善,就可以成就佛陀這樣的圓滿妙善之身。 [03′45″]</p>
<p>   我們通常聽了說:「真的嗎?我也可以嗎?像我這樣的,也可以成就那樣像天空一樣、像大海一樣、像浩渺的宇宙一般的功德嗎?」就是聽聞,然後照著去做,它的起步是非常紮實的,讓你能夠知道怎麼做。在這裡邊師父再再地鼓勵我們,實際上我們是可以成佛的! [04′17″]</p>
<p>   接著就開始講到我們的現狀——「<p> 我們開起口來,不是戲論就是諍論。<p> 」所謂的戲論就是沒有什麼意義的,大家說說笑笑,在當下的時候聽得是滿開心的,都在笑,但是會有什麼意義呢?會對我們的身心產生什麼樣的饒益呢?因為這樣講過了之後,我們的生命會出生很多善嗎?出生很多前所未有的功德嗎?乃至我們會去除他有情的痛苦嗎?有人說:「可以啊!因為我講一個這樣的事情,他會開心。」開心之後,他的苦因沒有去掉,然後時光就這樣過去了。苦因沒有去掉,會出生苦果的,所以戲論對我們的生命是一種浪費、是一種需要改變的習慣。 [05′08″]</p>
<p>   師父接著說:「<p> 高興的時候就戲論,不高興的時候就開始諍論。<p> 」諍論什麼?生氣了!「為什麼你觀點是這樣的?你為什麼不贊同我的觀點?為什麼你不了解我呢?為什麼你不隨順我這麼正確的、非常犀利、深刻的對很多事情的觀察呢?」我們常常用這樣的一個觀點去諍論嘛,因為如果覺得對方有道理的話,其實我們會學習;我們通常都以為對方沒有道理,我是最有道理的,所以會產生諍論。 [05′39″]</p>
<p>   注意哦!看手抄,師父說什麼?無論是戲論還是諍論,師父說:「<p> 實在沒有太多意思!<p> 」實在沒有太多意思這句話是什麼意思?就是丟棄的意思,對不對?這很沒意思,沒意思就丟掉!就是食之無味,味同嚼蠟,沒有意思! [06′06″]
<p>   師父說:「實在沒有太多意思!」從這句話我們可以反觀一下,不知道你們在家裡喔,在一些事情上會不會諍論不休?然後如果不諍論出一個結論來,地老天荒不會停,這樣一直諍論。為什麼要一直諍論呢?因為我們認為道理是這樣的。可是師父說:「實在沒有太多意思!」我們會覺得:「不行啊!事情要分出個對錯呀!」為什麼師父會認為沒有什麼意思呢?沒有多大意思呢?我們會認為這件事非常非常重要,一定要爭出個是非對錯、青紅皂白,絕對不可以這樣蒙混過關,一定要把它諍論出來! [00′46″]</p>
<p>   當我們碰到這樣一個跟我們吵個不休的對手的時候,實際上你會覺得:哎呀!有點擔心,或者有點恐怖吧?因為只要跟他討論起問題來就沒完了。注意哦!聽到這裡不是說:「啊!我知道某某某就是這樣,他一諍論起來就沒完沒了!」千萬不要這樣聽!你要想:「我自己什麼時候跟人家諍論起來沒完?」碰到自己特別執著的事情,你花了很多心血、花了很多研究,甚至你有充分經驗的事情,就馬上站出來說,而且可以非常有底氣地諍論。 [01′24″]</p>
<p>   但諍論的目標到底是什麼呢?真的是為了淨化自己的煩惱嗎?是為了饒益他人嗎?是出於這些良善的動機嗎?還是就是執著我的是對的,我的經驗、我的看法,還有我的見解絕對是對的?依據呢?依據是什麼?依據是向內調伏嗎?依據是調伏內心的這種瞋火,讓自己清涼嗎?到那時候是這樣的依據嗎?只是想要對方臣服,讓他知錯。知錯之後,對他生命會有什麼饒益呢?你說我們所求的到底是什麼?就算你對了、大家都承認你對了,你這個對了的東西,能靠它出離生死嗎?能靠它去除自己生命的苦因嗎? [02′12″]</p>
<p>   所以從這樣的角度,記住師父說的這幾個字:「實在沒有太多意思!」當我們陷入那種白熱化地跟別人的諍論的時候,尤其在家裡,比如說跟小孩呀、跟家人的諍論......其實有的時候一些諍論,可以說是雞毛蒜皮的小事嗎?可是對這些小事我們在不在乎?很在乎!諍論得是熱火朝天的,但是要想起師父說的話,就是——實在沒有太多意思! [02′46″]</p>
<p>   但那個時候會不會現起師父的這句話呢?如果自己在進入那種諍論狀態的時候,現起師父說:「實在沒有太多意思!」會不會諍論的勢頭就會降低呢?一旦諍論的勢頭降低的話,我們就會認真地傾聽對方的觀點是什麼,可能會說:「欸?他說的也有道理。」這樣的話,我們就不會那麼火大、一直要對方承認錯誤或者怎樣,我們就會有一個空間,注意!一個空間去聆聽、去站在對方的觀點上考慮一下,不要一直維護自己的觀點,陷溺於自己的眼界和經驗之中。然後放下自己,去看看別人也許有什麼東西可以學的,這樣是不是就不會諍論了。因為什麼?師父認為沒有太多意思,那些諍論並不能解決生命真正的苦因。 [03′43″]</p>
<p>   而佛陀的語言是怎樣的呢?師父說:「<p> 能夠圓滿——滿足地成就一切眾生<p> 」,注意哦!能夠滿足一切眾生,那一切眾生有多少呢?「無邊哪!」無邊眾生的什麼?「希願!」「希願」是什麼?他們最深的希求、最美的願望,佛陀可以圓滿。他用什麼圓滿呢?「語」,用語言!我們一開口是不是想要圓滿自己的願望?還是開口想圓滿大家的願望?所以,一對比的話發現:「欸?怎麼會有這樣的一個心續呢?」他開口起來,居然能夠圓滿大家心中最美的、最深的那個願望。 [04′40″]</p>
<p>   師父又在對比我們的語言,和佛陀的語功德他的出發點,我們就是維護自己的觀點和見解,而佛陀是完全成滿別人的希願。而這別人的希願是多少個別人呢?是無邊的有情,是一切的眾生!不知道有多少有情,他都可以用他的語言去圓滿他的心願。我們會認為說:這可能嗎?比如談心啊,談很多次,能夠讓他內心改變一點點我們都欣喜若狂。怎麼樣能夠圓滿他想要達到快樂的願望,然後又不傷害他?為了這點,我們曾經絞盡腦汁地想,想很久很久、努力很久很久,非常非常地辛苦。可是能成滿一個有情的希願嗎?很難、很難!我們多半都令人失望、傷心、憤怒、消沉、絕望,我們的語言說出來有時這樣,很有殺傷力! [05′46″]</p>
<p>   可是佛陀會成滿一切有情的希願!再再地會想到:真有這樣的事情嗎?佛陀的功德叫不可思議,已經超越了思想的邊際。所以師父說:「<p> 最難能可貴、稀罕的<p> 」,因為實在是在這個人世間太稀罕了!成滿無邊眾生希願語,居然就是佛陀的語言。我們第一個會想到:真的是存在的嗎?這種偉大的心續、偉大的語言,真的是存在的嗎?不可想像的語言是存在的嗎?那麼一切眾生的願望到底是什麼呢?我們可以捫心自問:「我們最深的願望是什麼呢?」 [06′43″]
<p>   聽師父下面這一段。<p>   我們眾生什麼願望啊?簡單極了,就是要得到極樂!這個普通世間的快樂有漏的,有漏的!一點點快樂帶來很大痛苦,只有這個才是,這個才是我們真正應該所願之處,我們絕對不是得到眼前一點點小小的利益,這樣。而我們平常開口的,不是戲論就是諍論;佛陀卻能夠滿足不但一個人、不但他自己,所有一切眾生都能夠這樣。啊,了不起呀!試想他能夠圓滿一切人,他哪有自己不圓滿的!所以這個地方就身體有這樣好的殊勝的功德,開起口來是有這樣的真實的內容。 [01′03″]</p>
<p>   我們眾生的願望是什麼呀?師父說:「<p> 簡單極了,就是要得到極樂!<p> 」我們會覺得我們的願望簡單嗎?我們從小到大有好多、好多願望,很複雜、很複雜!但是隨著時光的流逝,我們會發現也許我們並不想要那種很張狂的快樂,我們只想要平靜。平靜就是樂,沒有災禍就是樂,沒有病苦就是樂,親人和睦就是樂,很多、很多......。還有,有的人說:「如果晚上能睡著的話,我就滿足了。」還有經歷病苦的人,他會說:「哎呀!如果我能正常地走路,我就滿足了。」簡單極了!到某種時刻會簡單。甚至在特別特別冷的時候,比如說零下五十度,我們會想:「哇!現在只要到一個暖的地方,我就滿足了!」那個時候對快樂的希求就變得特別簡單。 [02′14″]</p>
<p>   但是師父說眾生的願望是很簡單的,就是得到極樂。注意!它樂前面有個「極」,有多快樂呢?通常我們會覺得極限式的快樂後面就是痛苦,但這裡邊的極樂是無窮無盡的快樂。 [02′31″]</p>
<p>   師父接著又提到了:「<p> 普通世間的快樂是有漏的<p> 」,師父說兩遍「有漏的」。「漏」前面解釋了——痛苦的。為什麼那個快樂是痛苦呢?師父說:「<p> 一點點快樂帶來很大痛苦<p> 」,就是它苦和樂是交雜的,甚至你覺得快樂的事情,實際上是痛苦的。「<p> 只有這個才是<p> 」,得到極樂才是,這個才是我們真正所願之處。 [03′00″]</p>
<p>   其實我曾經問過一些人:你會覺得生命可以達到極樂嗎?其實很多人沒有想這願望,說:「怎麼可能我生為人,然後我有這樣一顆心,我要面對林林總總人生中大大小小的事情,我怎麼可能希求在我的生命中會出現極樂呢?」就是沒有一絲絲痛苦那樣的快樂,人們不敢想、沒有能力想,因為覺得不存在,怎麼可能沒有痛苦呢?還有人說:「正因為有痛苦,所以快樂才顯得珍貴。」其實最佳的答案應該是:為什麼要痛苦去陪襯快樂?為什麼要黑暗去陪襯光明?全是光明不好嗎?為什麼一定要恐懼才會得到心安?全是心安不好嗎? [03′57″]</p>
<p>   所以師父在這裡再再地鼓舞我們的志向,說:「<p> 這個才是我們真正應該所願之處<p> 」,就是要去勇敢地希求極樂的生命狀態、生命的明天,我們絕不能得到眼前一點小小的利益就滿足了,我們要希求一個極樂。而且極樂這個願望,別忘了師父前面有講說:「簡單極了!」我們會覺得:啊!這樣一個極樂的願望簡單嗎?非常、非常不簡單!因為要去除一點點痛苦,我們都要費好大好大的力氣,怎麼可能達到完全無苦的地方是簡單的?師父說,注意!願望就是極樂,非常簡單,沒有那麼複雜! [04′47″]</p>
<p>   接下來師父再再地提到,戲論和諍論就是我們的現狀,而佛陀卻能夠滿足不單是一個人、不單是他自己,是所有的一切眾生都能夠滿足無邊眾生希願。而無邊眾生的希願是什麼?是極樂,佛陀可以滿足無邊的眾生這樣的希願! [05′10″]</p>
<p>   然後接著師父讚美呀,說:「<p> 了不起呀!試想他能夠圓滿一切人,他自己哪有不圓滿的!<p> 」這句話什麼意思呢?想一想,什麼叫「他自己哪有不圓滿的」?圓滿什麼了?是不是極樂呀?因為如果他不達到極樂的狀態,他怎麼可能有能力、有經驗引導我們去達到極樂呢?他會認為這是可能的嗎?所以師父由這個推斷——哪有不圓滿的! [05′48″]</p>
<p>   接下來師父又說:「<p> 佛陀身體有這樣殊勝的功德,開起口來有這樣真實的內容。<p> 」「真實」這兩個字比較醒目,師父為什麼用了「真實」的內容這兩個字?難道我們平常講的都不真實嗎?戲論真實嗎?諍論有的時候也在幻覺中諍論啊!由於誤會而諍論、由於自己沒有看到全面的東西而諍論,所以是有很多顛倒夢想在裡邊的,有很多自己看不到的誤區在裡邊的。 [06′28″]</p>
<p>   所以,顯現的東西和它的本質並不是像事情本來的那樣。我們常常會把顯現的狀態當成是事物的本質,因為忽略了事物的本質,我們就會遠離真實。而佛陀的語言所講述的,是真實的內容、是諦實語、是不打誑語的,是沒有弄錯的、沒有誤會的一個狀態。所以這個「真實」兩個字非常地有力,會在我們心目中留下很深刻的印象——為什麼他說的都是真實的?難道我講的都是顛倒的、錯亂的嗎? [07′13″]</p>
<p>   我們但凡有這樣的疑問來面對自心,我們跟別人戲論和諍論的時候,可能就會停一下。因為想到佛陀的語功德,他開起口來才有真實的內容,而我可能不是這樣,那我是不是現在不要再胸有成竹、氣勢洶洶地去諍論?甚至跌在戲論的那個續流中,根本就不能自拔?是否可以現起:實在沒有太大意思,或者這沒有什麼真實的內容,我應該讓我的生命去追逐這非常非常有意義的、有樂趣的,而且是絕對真實的這種功德! [08′02″]
<p>   今天我們來看一看《四家合註》仁波切的解釋,所以請大家把《四家合註入門》翻到五十二頁。都有書吧?翻到了嗎? [00′20″]</p>
<p>   接下來禮敬傳承上師,首先是禮敬教主——佛陀薄伽梵。宗喀巴大師是以「<p> 俱胝圓滿妙善所生身,成滿無邊眾生希願語,如實觀見無餘所知意,於是釋迦尊主稽首禮<p> 」這樣一個偈子來禮敬。然後妙音笑大師再註釋說:「俱胝」是什麼呢?就是「<p> 不可計數<p> 」,就是數目很大的量詞,它是數目中的絕頂,已經沒有比這個更大了。注意!這個俱胝哦,是形容佛陀的善行的,是說數量的最高單位,就稱為俱胝。俱胝,是梵文的音譯,在梵文中最高的數目,過此就沒有其他量詞,這是頂級的,而只用一俱胝、兩俱胝來計算,這裡邊主要是說功德。佛陀的功德多到什麼程度呢?就是用最頂級的數量詞去計算也是沒法計算的,「多到無法計算」。 [01′28″]</p>
<p>   「<p> 如《俱胝耳本生》裡邊所說的,俗語中不可計數亦可得俱胝之名<p> 」,這裡邊就是指這個意思。然後「俱胝耳」是佛世的一位阿羅漢的名字,他的本生傳中也有提到,所以俱胝就是不可稱數的意思。那麼「圓滿」呢,就是指功德,就是身等,是說導師佛薄伽梵的身圓滿。那麼「<p> 俱胝圓滿妙善<p> 」,有很多很多的妙善功德,由這樣的福德和智慧兩種資糧所生的佛身,就是「<p> 二資糧<p> 所生<p> 所積聚的,或宣法音,名之為<p> 果位之<p> 身<p> 」。總而言之,這句話就是說具三十二相、八十隨行好的佛身,就是由福智兩種資糧所出生的。 [02′23″]</p>
<p>   那麼還有另一種說法,說「圓滿」就是指意樂圓滿及加行圓滿。注意!意樂圓滿和加行圓滿。意樂圓滿是什麼意思呢?比如說大悲心。加行圓滿,比如說證得無我的智慧等等。因為佛身是從這些圓滿出生的,到達了究竟,所以叫圓滿。那麼「妙善」的意思是什麼呢?因為賜予現前的增上生人天的安樂果位,所以稱為「善」;出生究竟的決定勝,成就解脫及一切遍智的果位,所以是「妙」,也有這種說法。 [03′09″]</p>
<p>   接著巴梭法王的註,就是佛陀的身,「<p> 為相好所莊嚴,觀之無厭<p> 」。就是永遠看不夠,永遠看不夠叫觀之無厭。這是在《四家合註》這個偈子裡邊解釋佛陀的身。 [03′33″]</p>
<p>   接著是「<p> 成滿無邊眾生希願語<p> 」。有在看書嗎?有在看書嗎?要看哦,或者認真聽哦!不要走神!說成滿無邊眾生希願語,「無邊」,妙音笑大師的註釋是「<p> 無際<p> 」。那麼「眾生」,眾生是什麼呢?「<p> 從前趣生於後<p> 」,就是從前生去到後世,所以叫眾生。注意哦!從前生去到後世是什麼意思?就是不會停息的——生有、死有、中有,再生有......,永不停息的這樣一個過程,如果沒有去解決這個生老病死的話。「無邊眾生」,就是指很多眾生、一切有情。「成滿希願」,即是什麼呢?「<p> 成滿現前究竟所欲求義<p> 」,佛語能夠成滿今生所求的一切希願,今生所求的一切希願哦!聽到這裡,說:「真的嗎?」經典上這樣寫的,可以觀察一下、考慮一下。還有注意!「以及究竟獲得佛陀果位的希願,有這兩種成滿希願的方式。」有這兩種成滿希願的功德,今生的希願和究竟的希願都能圓滿。 [04′55″]</p>
<p>   你說:「那我們今生的希願,現在有漸漸在圓滿嗎?」我們可以觀察自己,比如說我們想追隨善知識聽法、我們想要建立學制、僧團的法師譯經,然後大家能夠在一個僧團裡邊好好地聞思修,能夠為善知識所攝受、為善知識所愛護、為善知識所歡喜,然後我們能夠置身於海量的經典之中,再不會因為看不到經典、不知道在哪裡尋求經典而惆悵和痛苦,現在譯經院有很多很多經典,那這是不是今生很多出家人的願望都在圓滿呢?因為為什麼要出家?出家就是想要深入地學習佛陀的教誡,那麼在五大論的學制中,這個願望被強烈地滿足,而且究竟的希願也會滿足。 [05′51″]</p>
<p>   說:成滿希願,如果就單單希求解脫而言,成就解脫就是究竟的希願,在尚未解脫之前,為了解脫所希求的一切,比如說這一生長壽無病啊,和來世的種種啊,比如說想布施的時候能夠布施,富貴呀、健康啊等等,都是現前的希願。所以這個「語」呢,是指應上中下三種根機的語,上等根機的就能夠聽到最上的法,符順各自的心量。注意哦!現在擴大了,「無論對天、龍、藥叉、食香、人」,它已經不僅僅是面對一類有情的問題了,佛陀隨以一音說法,即使他們各自按照各自的語言去理解,也都能理解。所以這是「<p> 成滿無邊眾生希願語<p> 」的另一種,就是無論他以什麼形象出現、什麼樣不同的語言,但佛陀說一句話,全部能夠讓他們用各自的語言、理解方式理解到。這是應上中下三種根機語的佛語的功德。 [07′06″]</p>
<p>   接著又到了我問問題的時間了,五十四頁,有看到吧?那個寫著「真師」的,其實是叫真如的弟子,她說:「這就是佛經裡面說的『眾生隨類各得解』嗎?」我每次都特別驚訝地這樣問仁波切。仁波切說:「對、對、對!最主要的,佛陀說法,是調伏所化機的方便,任說何法,都必須利益所化機。」注意!他說法是有目的性的,就是要利益我們!如果沒有利益到所化機的話,說法就毫無意義。比如我們身為善知識說法也是這樣,必須知道符合每位所化機的心量來說法,否則就無法達到利益。 [07′50″]</p>
<p>   說到這一點,會不會想到師父呀?他會說:「欸!我好好的,為什麼要皈依?」他就提出我們心量裡邊出現的東西。還有我說:「欸!為什麼現在不講呢?」還有很多疑問。就是會發現跟你的心有一種真實的互動,在你的緣起點上所提出的疑問,會有一種討論,或者給你一種解答,或者讓你更深入地去思考。 [08′13″]</p>
<p>   如果說自己心量很高,就依很高的起點去說,那很難利益到所化機。因此,要順應上中下三種所化機的心量而說法,佛陀的語功德是這樣解釋的。因為如果他心量很高,你不去按照他的心量而說法的話,也很難達成對他的利益。隨機度化,這是佛語的不可思議呀!「前面『<p> 應上中下三機之<p> 語<p> 』,是妙音笑大師的註。」妙音笑大師這樣理解佛陀語功德。 [08′48″]</p>
<p>   之後,巴梭法王也有補註,「<p> 開示應機之法<p> 」,就是他是應機的。「<p> 故僅一語<p> 」,雖然說一句話,「<p> 亦為具足六十或六十四支韻音<p> 」,一句話也是具足佛語那種六十韻音或六十四韻音語的功德。那麼什麼是六十或六十四韻音語呢?因為在《四家合註》很長的那一篇(<p> 《菩提道次第廣論.四家合註》第六講<p> )都講過了,如果你想再了解,可以再去聽一下。 [09′15″]</p>
<p>   好!今天就上到這裡,祝大家聽到佛語的功德之後能夠心生喜悅、心生希求。然後我們再到佛前禮佛的時候,凝視一下佛陀,去想一想:「哎呀!佛陀的身有這樣的功德,佛陀的語有這樣的功德,佛陀的意也有這樣的功德......。」這樣的話,我們在佛前一禮的時候,你的內心一定會有一些不一樣的感受產生吧! [09′48″]
<p>   又到了一起學習《廣論》的時間!很隨喜大家能夠在自己的生命中,撥出一段時間來聽法。 [00′12″]</p>
<p>   其實聽聞佛法對我們的生命影響力是很深遠的,因為它會對我們現在正在做的事情,或者想要做的事情有一個覺照,就是我現在做的事情,是我的生命一定需要做的嗎?那麼它的排序是怎樣的?是最重要的事情嗎?因為我們都知道實際上人的一生有很多事情要做,但是通常都做不完,所以一定要把最需要完成的事情排在第一位。那麼如何才能把正確的、一定要完成的事情最先去完成呢?就是我們對自己的生命要做一個規劃,這樣,當我們回首往事的時候,我們就不會說:「啊!那件事可能我不該做,我把它先做了。」甚至說:「有一些事就是錯的,我不該做!就是因為當時沒有深思熟慮,或者沒有把自己的生命放在一個無限生命的長河中去看待,太顧眼前利益了,結果就失去了長遠的利益。」 [01′22″]</p>
<p>   所以每天抽出時間來這樣聽法的話,我們就會再再地用自己人生的宗旨或者終極目標,來校對一下眼前的所做、所想、所行、所說。校對下來,一旦是偏離了宗旨,或者偏離了我們對自身,乃至所有有情終極離苦得樂的目標、偏離了這個方向的話,我們就會隨時地調整。隨時調整自己的心,實際上是一件很愉快的事情。雖然開始略覺艱辛或者很艱辛,但是堅持下去的話,我們畢竟會後悔的事情越來越少,高興的事情會越來越多。佛法,讓我們覺照內心,數數地啟發我們的智慧,讓我們的生命能夠在一條安穩的路上去前行。 [02′15″]</p>
<p>   上一節課我們學到〈皈敬頌〉的第一個偈子,就是:「<p> 俱胝圓滿妙善所生身,成滿無邊眾生希願語,如實觀見無餘所知意,於是釋迦尊主稽首禮。<p> 」在這裡邊,今天要聽師父解釋「<p> 如實觀見無餘所知意<p> 」。請大家端正自己的發心,然後聽的時候要專注,不要散亂、不要昏沉!好!那麼現在就開始。 [02′50″]</p>
<p>   那麼他為什麼能夠做到這樣呢?因為他徹底如實地了解了,所以下面說,「如實觀見無餘所知意」,他的意業就是這樣的。他能夠「如實」的——如實在的,簡單極了!平常我們看見的,都是看見事情的一部分,而它真正的真相是看不見的,看不見的。平常我們眼前的東西,譬如說好像空氣,什麼都看不見,沒有什麼東西啊!欸,現在科學家告訴這裡還有空氣在,我們就看不見了。那空氣有什麼?我們又看不見,就像科學家也看不見。實際上眼前所有的東西都是這個樣,不要說我們看不見的東西看不見,就是眼前隨便一樣東西,譬如說眼前這個茶杯,你說你看見了沒有?我不能說你看不見,但是我也要告訴你,我不能說你看見。你看見了茶杯的這一面,那這一面看見了沒有?沒有!你可以轉過來,四面看見了,裡邊沒有!總是我們是局限的。那麼這個局限的裡邊就有種種毛病了,種種毛病了!就這樣。 [04′11″]</p>
<p>   前一段講到說:我們平常開起口來,不是戲論就是諍論,但是佛陀卻能夠成滿一切眾生無邊希願。所以呢,他能夠圓滿一切人,他哪有自己不圓滿的!所以開起口來才會有這樣真實的內容。 [04′36″]</p>
<p>   然後師父先提了一個問題,說:「<p> 為什麼能夠做到這樣?<p> 」這就開始引申到讚美釋迦佛的意功德。「<p> 因為他徹底如實地了解了<p> 」,徹底如實地了解了什麼呢?所以那個偈子說:「<p> 如實觀見無餘所知意<p> 」,這裡邊就提到一個「所知」這樣的概念。學《攝類學》的同學都知道,什麼是所知?堪為心的對境。堪為心的對境就是心可以去了解、能夠去了解的。那麼這個所知的範圍有多大呢?一切存在、一切有都是所知。那麼一切存在的,佛陀都無餘地觀見嗎?注意!師父說:「<p> 他的意業就是這樣,如實的、如實在的<p> 」,沒有什麼欺誑的,現見的。接著師父講了幾個字:「<p> 簡單極了!<p> 」這個「簡單極了」,其實我聽到這裡的時候我通常都會停在這裡,然後就看著這個「簡單極了」,會想很長時間。我不知道你們有沒有注意到這一段? [06′09″]</p>
<p>   說:把所有的所知哦——就是無窮大的所知——他全部都能夠如實地觀見,而且是非常簡單。簡單到什麼程度呢?就像看自己的掌紋一樣那麼簡單,如在目前,就像在眼前看到的一樣那麼簡單。那請問:看自己的手紋容易嗎?容易呀!你把手張開來,眼睛打開就可以看到了,就這麼簡單!那麼佛陀了解一切所知,就像我們看自己的掌紋一樣,師父說:「簡單極了!」 [06′42″]</p>
<p>   其實這個「簡單極了」,讓我聽到這裡會覺得不可思議!因為什麼?師父接著說:「<p> 平常我們看見都是事情的一部分,而它真正的真相是看不見的,看不見的。<p> 」其實就是看到事情的一部分,有的時候也是看不清楚的。比如人們為什麼會爭論,一直爭論不休?就是覺得對方不了解我的意思,然後有的時候我也沒有了解對方的意思。我們都因為自己看到的那個部分,可能會認為別人看不到,所以跟別人爭論,想把自己看到的那部分提供給對方,但對方也想把他看到的部分提供給我們。但是如果我們都拒不承認對方看到的,只想要對方承認自己的話,那麼以自我為中心的戰爭、爭論就會開始了。親人啊、朋友啊、同事,都是這樣的! [07′30″]</p>
<p>   可是我們偏偏還什麼呢?偏偏還對自己看到的那部分是非常執著的,還認為自己看到的是真相!可是師父說:「平常我們看見都是事情的一部分,而它真正的真相是看不見的。」但是觀察一下我們自己的現行,我們通常跟別人爭吵的時候,都會覺得自己看到的是真相。如果聽了這一段的話,在跟別人發生爭論,或者自己特別憂愁的時候、特別傷心的時候,是否還會覺得:為什麼別人不理解我呢?為什麼別人不理解那個真相呢? [08′07″]
<p>   其實談到真相,這裡邊有太多太多的問題可以討論了。但是師父說:「<p> 它真正的真相是看不到的。<p> 」我們能接受這個概念嗎?會覺得事情的真相我們看不見嗎?我們只了解事情的一部分,我們無法了解它的全體,真相更談不上!所以如果能把師父的這句話聽進去,那麼我們以後在跟他人溝通的時候,或者在學習某件事情的時候,或者一起共事的時候,我們就會知道:欸!也許我並不了解真相。這樣的話,我們就會對別人的心處在一種打開的、傾聽的狀態,對別人的言論也好、思想也好,至少保持著:欸!去聽一聽他在講什麼。而不是認為他就是不對的,而我了解的才是對的! [00′49″]</p>
<p>   所以師父講了這個之後,就講了一個空氣這個例子。說:平常我們眼前的東西——像空氣,其實空氣是存在的,但是我們感覺不到它的存在;我們感覺不到它的存在,其實就好像不存在。科學家告訴我們有空氣存在,我們就知道有空氣存在。但是平常二六時中,這個透明的空間,我們可以看到藍天、大海、大地,誰會意識到這裡邊有空氣存在呢?如果不仔細地考慮的話。 [01′21″]</p>
<p>   師父用這個例子告訴我們,實際上每天都伴隨著我們的那個空氣,我們是意識不到它的存在的。一個存在的東西,因為感覺的原因,好像它不存在;那麼反過來,一個不存在的東西,因為感覺的原因,會不會我們把它誤認為存在呢?都是有可能發生的,因為不了解真相,我們對一些問題的了解是片面的,可能是顛倒的。我們能夠接受這樣的概念嗎?自己考慮考慮。 [01′54″]</p>
<p>   其實這有點像聽聞軌理的病者想,能不能確認自己的無知?因為當我們想要探尋真理,想獲得更多對於自他的生命有意義的知識、學問或者智慧的時候,我們一定會率先看到自己的無知。那麼對什麼無知?真的是對我們平常身邊存在的東西好像都感覺不到它的存在,有無知到這種程度嗎?不去觀察的話,有時候就會這樣,會忽略最重要的東西的存在。那個空氣對我們是非常非常重要,可是我們常常會忽略它的存在;也沒有好好地保護土壤啊、保護水源啊等等。因為這樣的話,就會破壞河流、破壞土地,也就破壞了空氣。 [02′40″]</p>
<p>   所以師父舉了這個空氣的例子,讓我們就能夠感受到的例子去想一想:實際上我們並不了解事物存在的真相。 [02′54″]</p>
<p>   接著師父又舉了一個茶杯的例子。其實所有端過茶杯的人都知道,就是一個杯子嘛,就這麼簡單!可是師父用幾個面,比如說看見正面,你後面就看不到;看到裡邊,就看不到杯子底,翻過來才能看到。比如說這個杯子是哪兒產的?翻過來才會看到;當你翻過來看底的時候,你又看不到裡邊是什麼樣子、顏色,都看不到了。就用這樣一個例子,證明我們是不可能穿透阻隔的、阻礙的事物,去看到隱蔽的那一面的。 [03′27″]</p>
<p>   所以師父說我們是有局限性的。一旦有局限在裡邊,毛病就會產生了,種種毛病!而佛陀呢,他能夠如實觀見一切所知,而且是無餘地觀見,沒有一件事情他不知道的。我們聽到這裡的時候,可能很難去想像那到底是怎麼樣的一顆心,說上知天文、下知地理,已經覺得夠博學的了,還要知道很多很多人的心。如果所有眾生的心意他都知道,而且注意哦,他知道的速度是在一剎那喔!一剎那間可以知道所有的事情,時間這麼短! [04′20″]</p>
<p>   比如說我們探討一件事情的話,開了很多次會議探討這個主題,甚至把一個主題在心裡想啊、想啊、想啊,也想不明白。為什麼呢?因為我們還是不知道,還有一些東西沒有探索出來,就是沒有想明白。怎麼可能在一剎那間能夠如實觀見所有的一切呢?這是不可思議的事情!這對我們的所知來說實在是太過挑戰,所以就是不可思議!我們要皈依和讚美的釋迦牟尼佛,他的意功德居然是這樣的! [04′52″]</p>
<p>   透過師父的這一小段讚美釋迦佛的意功德,讓我們觀察一下自己的現狀,真的能夠確認自己不了解真相嗎?我們會在我們的生命中不停地發現:我們以為我們了解一個人,可是後來出了一件事情,我們發現我們不了解他。還有我們誤會一個人,後來這個事情發生之後,我們會發現:哎喲!原來他不是這樣子。所以生命裡發生的很多很多事情,實際上都在挑戰我們——我們以為自己知道了真相,可是實際上呢,真相遠遠不是那樣的! [05′33″]
<p>   真正了解真相的是像佛陀那樣,對一切所知全部如實無餘地徹見,那叫了解真相,我們平常都是在局限性的部分。如果對這一點能夠得到一點定解的話,實際上我們在跟人相處的時候,會不會覺得自己是應該調柔、應該謙虛的?因為我畢竟不了解真相。比如說他人的心續,另一顆心到底是怎麼樣的?他是沿著什麼樣的續流在流淌的?他每天都在想一些什麼?就算是每天都見到、每天都聽到他說話的人,如果我們不花點時間去探索他的思想的話,實際上是不了解他的。只透過他說的或者看他走路的樣子,或者一些事情,我們也無法真正了解他。 [00′51″]</p>
<p>   所以這就涉及到為什麼要特別注意訓練自己的觀功念恩?因為我們常常都忽略他生命裡很美好的那一面。特別是有的人總喜歡顯露自己不好的一面,所以我們看到那些之後,就會常常忽略他內心中的善意,尤其是那些可能掩藏的很深的善意,或者我沒有注意去往深了看的那種善意。這個在僧團裡可能是非常非常普遍的,比如說一個出家人,你看他平常就是按部就班地上早晚課,就做那些事情。但是有一天某一個鏡頭,你真正地去探究他為什麼要這樣做的原因的時候,實際上是非常非常震撼的,並不是像表面上那麼簡單。實際上他內心裡有一個很深的用心在裡邊,甚至他把這個用心在心裡想了很久很久,然後才會做這樣一個看起來微不足道的小善行。 [01′54″]</p>
<p>   所以我覺得師父的這一段,是讓我們看一下自己的現行,非常非常希望啟發我們能夠去聆聽他人的意見、能夠去聆聽他人的心聲,不要著在「我」的感覺裡、著在「我」的認知裡邊,認為「我」就是那個了解真相的人。一定要不停地學習了解別人,別人的心對我們來說都像一本書一樣。人們之間為什麼會有誤會?為什麼會有爭端?就是大家都對自己看到的那一部分特別執著,而不去看一看可能那個人很善良、真的很善良,或者可能我看到的只是非常局部的部分,更深邃的東西我應該再給自己一點時間、再給自己一點時間去了解一下。 [02′37″]</p>
<p>   希望人們在碰到非常非常相反的意見的時候,能夠坐下來心平氣和地溝通,開始傾聽對方的想法。為什麼要這樣傾聽呢?因為我們可能不了解真相,因為我們需要學習。如果能這樣傾聽的話,家庭啊、工作單位呀......甚至如果我們能認真傾聽一下我們的身體,會不會我們的身體都會好很多?還有很多在心裡邊一直徘徊不去的那些思路,如果我們也能認真地去研究一下的話,甚至是看一下自己內心的真相,我們會不會就容易擺脫掉一些非常負面的思路?因為這種負面的思路不會給我們的生命帶來任何好的影響。 [03′20″]</p>
<p>   而我們能對我們的生命做這樣些許的改變,可能是源於善知識的啟發、源於這個偈子,由於師父講的這些話,我決定不要去相信我是徹底看到真相的那個人,我要好好地去學習。在跟他人的互動中,甚至在為家人、為這個社區、為整個社會的奉獻中,我要再再地去學習和反思自己,然後向所有的人學習。抱著這樣一個心態的話,我們的心就會越來越敞開、越來越敞開,敞開得越來越徹底的時候,我們就會結交到越來越多的朋友。我們也會越來越能看到很多人都在為這個世界變美好而努力,我們就不會把自己的努力看得那麼重要,其他人的努力都好像不存在一樣。我們會看到很多很多人都在非常努力地貢獻於這個社會、貢獻於這個世界! [04′20″]</p>
<p>   一旦慢慢地習慣去簡擇自己對這個世界的看法,把那些負面的、非常毀滅性的思路,或者哀傷的思路、絕望的思路不停地對治掉的時候,我們自然就會有一種光明的、振奮的價值觀,來看待自己的人生和這個世界。一旦我們慢慢心裡變成這樣的話,我們就會散發出一種振奮和光明的力量給自己的家人、給自己周圍的朋友們。 [04′48″]</p>
<p>   那麼我們要在哪裡弘揚佛法呢?家庭一定是一個很好的弘揚佛法的地方,因為家人每天都見面、每天都彼此相對,但是不一定都能夠很好地溝通。學了這個偈子,如果認識到這一點的話,就可以馬上把它用在跟別人的溝通上。但是不要一碰到釘子馬上就縮回來不幹了,要鍥而不捨地學習和訓練自己,因為自己可能並不是那個了解真相的人。 [05′15″]</p>
<p>   不知道你們覺得我說的有沒有道理?如果大家能夠用上一點的話,可以改善一下自己生命的現狀和家人的現狀,甚至健康的狀況。我們要不停地注意到自己的心在幹什麼?自己的心到底在做什麼?思想在想什麼?真的以為自己是徹底了達了很多東西嗎?如果不是這樣的話,那就要去學習、去了解、去傾聽、去擴大這個心的容量。要知道就像師父說的,我們是有局限的,有局限的話就有種種的毛病,這種毛病就會產生太多的誤會、不諒解,甚至悲劇! [06′01″]
<p>   好,那麼我們再聽一段師父的帶子。<p>   所以真正能夠如實地看見的話,那是很不容易的事情,而且圓滿無餘。譬如說小乘的聖者,他也能夠見到一部分,但是還有很多地方不圓滿的,我們說簡單。我們所應該知道的一切的對象,他沒有一點點餘遺;而所有任何一樣東西當中,他如理如量、如理如量地都能夠完全認識。因為能夠這樣完全認識,所以才能夠圓滿解決,所以才能夠不但自己得到這樣,而且能夠滿足一切眾生。這個是意業。 [01′00″]</p>
<p>   師父在前一段說:「如實地了解一切所知」,然後師父說:「簡單極了!」在這一段,師父說:「<p> 所以真正能夠如實地看見的話,那是很不容易的事情。<p> 」前面說:「簡單極了!」現在說:「很不容易!」很不容易是什麼?達到這個能夠如實看見的過程、一個成佛的過程,實際上是非常非常不容易的!但是一旦證得了大覺佛位之後,就對一切的所知瞭如指掌,而且剎那間就可以了解一切,就變得簡單極了! [01′42″]</p>
<p>   所以師父說:我們應該知道的一切心的對境——就是所知,佛陀沒有一點點餘遺、全部都能夠完全地認識。因為能夠完全地認識,所以才能夠圓滿地解決。我們生命的很多問題,懸而未決,為什麼呢?因為有的是找不到答案,有的是找不到問題,有的是我們有答案也有問題,但是好像也解決不了,就是很多很多解決不了的問題。想想從小到大我們積累了多少無法解決的問題,就只能放在那裡。但是,佛陀可以圓滿地解決所有的問題。為什麼?因為他能夠如理如量地完全認識到一切所知,所知的範圍全部都能夠了解。「<p> 不但自己能得到這樣,而且還能夠滿足一切眾生。<p> 」 [02′42″]</p>
<p>   其實我們認真地思考一下佛陀的意功德的話,就只能用到不可思議了!不要說了解一切眾生的心意,就算是眼前的人,甚至在一起生活了好多年的人,你完全了解他的心意嗎?你確定沒有誤會嗎?確定對他心中的善良、對他的心中的隱忍都知道嗎?可能我們更多地知道別人不好的東西,因為我們很多思考都朝著負面去了,可是對別人的善意、很多美德沒有去專心地探索。 [03′24″]</p>
<p>   所以,想一想佛陀,再看一看自己,我們的生命是怎樣發生向上的力量?居然有一顆心可以做到這樣,難道不值得我們禮敬嗎?因為正是有那樣光明的一顆心,藉借著這樣的光明,哪怕是我在文字上了解一下,然後藉借這樣的光明,我們看一看自己生存的現狀,實際上會發現有太多可以努力的空間。一旦我們發現有很多努力空間的時候,我們就會停止抱怨、停止嘆氣、停止把所有的錯都歸咎於別人。開始想一想:有什麼真相是我不知道的?他有什麼苦楚是我不了解的?還有什麼東西是我的錯誤導致的? [04′12″]</p>
<p>   我們反省自心,打開我們的內心去學習、去探索,讓生命不停地離開憂悲苦惱,不停地離開各種問題的糾纏,需要提升我們的智慧,需要累積很大的資糧,所以我們要禮敬所有的佛陀。 [04′32″]
<p>   好!那麼我們再聽一段師父的帶子。<p>   那麼這個三樣東西,也可以說他身、口、意三業,也可以說他的法、報、化三身。這個「意」是代表了他的法身,「語」是代表了他的報身,「身」是代表了化身,一般來說,一般來說。因為意業本身的的確確它跟法是徹底圓滿相應,那個就是法。那麼他所現的身呢?那個現的身的話,就是他自己的是佛身,那是我們看不見。現在「妙善所生」,我們看得見的,那的的確確應個人不同的機所看見不同的。菩薩看見他的是報身,眾生還沒有登地之前,還沒有破無明之前,看見他的是化身,而這個化身有在四生、六道當中的。所以這個也同時可以說法、報、化三身。那麼總結起來,這就是我們釋迦世尊,這個是我們的尊主,這個就是我們的娑婆世界的教主、人天導師。第一個。 [01′35″]</p>
<p>   在這一個小段裡,師父講了佛陀的法、報、化三身。對於新的同學來說,這可能是一個新的概念;對老同學來說,都知道佛陀有法、報、化三身。大家好好學,學到《現觀》第八品〈法身品〉的時候,這裡邊就介紹了法、報、化三身的功德,還有他們的差別。在前七品介紹了菩薩應該如何了解三智——一切相智、道相智,還有基智。那麼怎樣才能夠達到一切相智呢?就是修持四加行,然後去獲得法、報、化三身。佛陀的法、報、化三身是怎麼來的呢?在《現觀》裡邊就會有詳細的介紹。要發心去了解法、報、化三身的功德及其差別,乃至作為現在還是一個凡夫的我如何去獲得法、報、化三身?這是我們在今天再次學習的意義。 [02′39″]</p>
<p>   在這裡邊師父說:佛陀會應種種的機,讓大家看到佛陀不同的化現。那報身我們能看得到嗎?登地以上的菩薩能夠看到報身,當然還有佛可以看到佛的報身,資糧道和加行道的菩薩是看不到報身的。所以師父在這裡邊說:眾生還沒有登地之前,只能看到他的化身。這個化身有在四生、六道當中,所以不知道有多少。不知道有多少化身這樣的一位佛陀,在陪伴著我們、在引領著我們,師父說:「<p> 這就是我們的釋迦世尊,是我們娑婆世界的教主!<p> 」 [03′32″]</p>
<p>   從前面讚美佛陀的意功德,現在又講了法、報、化三身,都為我們的生命打開了一個非常不可思議的視野,說:還可以有三身啊!意功德還可以了解一切,一切所知都可以知道,堪為心的對境的都可以了解。當然只有佛陀可以在一剎那間了解,我們就算是看見了可能也不知道、聽了也不知道。正因為如此,所以我們要學習,我們有學習的能力呀! [04′08″]</p>
<p>   通常人對於超越自己的事情,可能有幾種現象:一種就是很想了解那是什麼;還有一種就是我現在也不錯,不用去那麼費力地了解;還有一種是悲觀、失望──我了解了有什麼用,我也達不到!不管我們生命處在什麼狀態,現在都聽聞到佛法了,聽聞到佛法,我們已經知道生命最圓滿的狀態是什麼樣。那麼對比自己現在,就應該發起一個精進的心,去成就這樣的功德;為了成就這樣的功德,我們就要累積很多很多的資糧。 [04′50″]</p>
<p>   能夠從內心裡邊了解佛陀的功德,哪怕只是在文字上了解一點點,甚至相對地去思考一下,比如說當我們跟別人爭論,不要爭論到白熱化,簡單地爭論幾句的時候,就想一下:欸!我了解事情的真相嗎?我這樣氣勢洶洶、煞有介事,甚至覺得真理一定在我手中這樣去爭論,我真的了解嗎?如果有一個念頭來反照自己的話,是不是就可以讓氣氛融洽一點? [05′23″]</p>
<p>   所以當我們仰望佛陀的時候,當我們拿善知識的法語來校對我們每天的行為的時候,我們就會不停地修改自己。而我們的心續不停地修改、不停地修改,讓它達到良善、達到越來越有智慧,甚至充滿慈悲的善念的時候,我們生命的質量也隨之提升,就沒有那麼多苦惱了。為什麼?因為我們不停地發現是我自己出了問題!如果是自己出了問題,自己改善就可以了;如果是別人出了問題,怎麼令他改善呢?可能很難哦!怎麼能令所有跟我們有緣分的人都得到那種改善呢?如果老是令別人改善,而忽略了自己內心的改善,這到底是不是生命的出路呢?如果是的話,很多時候我們都想要改變別人,然後希望自己的生命能夠改變呀,但是這樣的努力不是很多都令人失望了嗎? [06′25″]</p>
<p>   是啊,我們應該要改變!要改變這個世界,從哪裡做起?要從改變自心做起。那麼如何去改變自己呢?我們必須去了解自己的誤區、局限,或者說自己的顛倒在哪裡。如何去了解這一切呢?就要用一面鏡子來照一照我現在在何處?我在想什麼?我在說什麼?那麼那一面明鏡是什麼?就是法語──佛陀的法語、善知識的法語! [06′58″]</p>
<p>   每天能夠用這樣的法語來覺照自心的話,我們生命一定會慢慢地遠離很多迷惘,自己對內心覺察的速度越來越快、越來越迅速,甚至次數越來越多,甚至是每天遍滿這樣對內心的覺察,我們就會避免自己走到錯誤的懸崖邊上才發現。我們很早就會發現:「欸!這個不可以!」然後就會遮止;遮止了苦因的話,將來就不會結到苦果,這也是我們生命最真實受用佛法的一點。 [07′31″]
<p>   現在請大家把《四家合註入門》翻到五十四頁,我們再看一看仁波切對於這一個偈子的解釋。 [00′14″]</p>
<p>   說:「『<p> 如實觀見無餘所知意<p> 』,『如實觀見』,佛意能如實的觀見一切如所有性、盡所有性的法。」這裡邊又提到如所有性和盡所有性。妙音笑大師就註說:「<p> 無遺之智所了達<p> 」,就是沒有遺漏的智慧所了達的,「<p> 故名<p> 無餘所知<p> 」,像頭髮絲、像汗毛那麼大的不知道都沒有,全部都知道叫無遺——沒有遺漏的。能夠毫無遺漏地證得一切所知,所以提到「無餘所知」。佛陀的意擁有什麼樣的功德呢?「在同一個時間,各別如實觀見一切所知法的功德。」他在同一個時間——就是同一個剎那,用同一個智慧現證一切法。 [01′09″]</p>
<p>   這裡邊強調了沒有遺漏,強調了沒有遺漏地證得什麼?一切所知,一切所知全部都了解,用多長的時間去了解一切呢?就是一個剎那了解一切,不是很長的時間,一個剎那了解一切,就是這樣的一種意功德。 [01′30″]</p>
<p>   那麼接下來,巴梭法王的註,說:「<p> 由詮身語意功德之門<p> 」來頂禮「釋迦尊主」。此中的「釋迦」,是說「<p> 強力或勇猛種族<p> 」,這說明種族的「強力」和「勇猛」是同義的,就是代表力量。「<p> 二足<p> 」,就是人的異名。「<p> 二足<p> 尊主<p> 」,就是人中的尊主。用一種非常恭敬的方式,說佛薄伽梵生在釋迦種族,而不直接說他的名諱。所以,像「<p> 傑喇嘛<p> 」——宗喀巴大師也用最澄淨的信心,就是「<p> 以身分<p> 」,由我們的身體之中最尊勝之處——就是頭頂稽首禮,去頂禮釋迦佛。而且是三門恭敬地頂禮,「三門」就是身語意三。身作什麼?禮敬;語呢?就作讚歎;意呢?就生起了淨信,用三門去頂禮。 [02′33″]</p>
<p>   那麼,第一句「<p> 俱胝圓滿妙善所生身<p> 」,在其他的解釋也有這樣說到:「所生身」就是指能仁佛薄伽梵的身。而頂禮的意義何在呢?因為這是能令自己獲得無量福德的方便。為什麼要頂禮佛陀呢?可以令自己獲得無量的福德! [02′56″]</p>
<p>   所以佛身的妙相和八十隨形好,是由於無量的福德而產生的。不是說法、報、化三身嗎?要經過怎樣怎樣的那個次第,《現觀》裡會講怎樣去修成,是累積不可思議的無量的福報,有無量的福德才能產生這樣的身。比如說:獲得聲聞、獨覺果位的福德,乘以十倍,才能成就佛薄伽梵一個毛孔。所有毛孔的福德,乘以一百倍,才能夠成就佛陀八十隨形好中的一種隨好。所有八十隨形好的福德,再乘以一百倍,能夠成就除了佛陀白毫相和頂髻相之外的三十相。成就這些相好的福德,再乘以一千倍,能夠成就佛陀的白毫相。然後這個福德,再乘以十萬倍,就成就了佛陀的頂髻相。這是在《中觀寶鬘論》裡邊講的。 [03′57″]</p>
<p>   再翻到五十六頁。說:由此可知,「<p> 俱胝圓滿妙善所生身<p> 」這一句,表達了佛身是從這麼多這麼多福德所出生的。後面的語功德、意功德也都是如此。對於如此的佛身,僅以一次合掌作禮的福德也是不可思議的,運用理路就可以推知。我們常常嘴裡會念誦:「皈依佛」,但是皈依佛的目的到底是什麼呢?是因為佛陀的功德這樣無量、無法衡量,所以我們才要去皈依他。那麼,我們現在講到「<p> 俱胝圓滿妙善所生身<p> 」時,講到佛陀一個毛孔的福德有多大?縱使聲聞、獨覺的一切福德聚集在一起,也無法出生佛陀一個毛孔的功德。如果這樣的話,是怎樣地累積福德,最終才能夠成就佛陀的尊身呢?所以必須了解這是多麼多麼地不可思議呀!一旦我們了解了佛陀成就這樣一個毛孔的功德,它是多麼不可思議的福報才能夠累積出來,有了這樣的認知,我們再去頂禮佛陀、讚美佛陀,再對佛陀生起信心的時候,就能對我們的身心真的產生不可思議的利益! [05′27″]</p>
<p>   也正是由於這樣的原因,我們才要每天聚起來學習教典。因為在教典裡會詳細地講述三寶的功德,我們一旦了解了這樣的功德,我們就不會去浪費人身,就是去攪煩惱啊,或者做一些無意義的、對此生和來世都沒有益處的這樣的行為。我們就會把這個暇滿人身的點點滴滴用來禮敬三寶啊、讚美佛陀,去學習佛陀到底有什麼功德,乃至有什麼差別。 [05′59″]</p>
<p>   一旦廣泛地、不間斷地學習,我們了解了佛陀的功德,在內心中真實地生起對佛陀的信心,那麼我們一個禮拜下去,甚至說「皈依佛、皈依法、皈依僧」這樣念下去,自己全部的身心相合——身語意三門都在恭敬作禮的情況下,我們所累計的福報也是不可思議的!為什麼呢?因為我們所頂禮的佛陀,他的功德是無量無邊的!頂禮了這樣的佛陀的我們,所累積的福報到底有多少呢?所以是非常非常值得去學習和非常非常值得去禮敬的。因為會對我們的身心產生不可思議的利益!那麼大好的人生的光陰,何必去攪那些煩惱和傷心,想那些總也想不開的事情?花點時間去了解佛陀的功德、念一下佛陀的名號,甚至認真地合掌去禮敬佛,會不會這樣的生命過得更加地真實和喜樂呢? [07′06″]
<p>   大家好!很高興又到了一起研討《廣論》的時間。這段時間有憶師恩法會,所以我自己和所有的同學,還有尊敬的法師們,都在這個時間認真地用功憶念師父的恩德,再再地感恩師父來到我們的生命中。 [00′27″]</p>
<p>   就像在《廣論》三十八頁的第一行,「<p> 又云<p> 」,就是《華嚴經》說:「<p> 善男子,若諸菩薩,隨善知識所有教誡,諸佛世尊心正歡喜;若諸菩薩,於善知識所有言教,安住無違,近一切智;於善知識言教無疑,則能近於諸善知識;作意不捨善知識者,一切利義,悉能成辦。<p> 」《華嚴經》說:「若諸菩薩」,能夠隨順善知識的所有教誡,那麼「<p> 諸佛世尊<p> 」——所有的佛陀都會很開心的。還有「<p> 若諸菩薩<p> 」,能於善知識的所有言教沒有違背,就等於趨近於一切智。還有於善知識的言教「<p> 無疑<p> 」——沒有疑惑,我們就是在親近善知識。 [01′29″]</p>
<p>   還有一個是「<p> 作意不捨善知識者<p> 」,一切的利義都能成辦。這是在《廣論》中〈親近善知識的勝利〉裡邊所寫的幾行而已,但是它會囊括從發心開始直至成佛這所有的過程,我們都不能離開善知識的教誡,這樣就都會得到善知識的攝受、得到善知識的守護、得到善知識的憶念。如果我們能夠初心不改,我們始終去修信,讓我們的信心越來越增廣的話,那麼一定可以由如法親近善知識的緣故,會得到像經典上所說的親近勝利。所以我們一定要好好地努力,希望自他都能夠得到如法親近善知識的所有勝利。 [02′23″]</p>
<p>   師父非常非常在乎我們一定要學習《廣論》,為了把這本論帶給我們,師父辛辛苦苦地求法,然後又找到一種大家能理解的方式,再找到一種大家能聚在一起的方式——那就是廣論班。讓在工作崗位上、或者在家庭裡邊的居士們,能夠聚在一個課堂上,經年累月地,甚至是二十年、三十年地不間斷地修學《廣論》,今年師父講《廣論》都三十年了!其實廣論班是師父一個偉大的創舉,你我都在這個班裡成熟了自己的善根,繼續把《廣論》學到今天,我認為這是這個藍色星球上的奇蹟!是師父創造了這個奇蹟,也可以說是文殊菩薩,還有很多佛菩薩創造了這個奇蹟!當然,在這個奇蹟中也有你和我,所以真的是非常地令人歡喜! [03′26″]</p>
<p>   今天我們就會學到〈皈敬頌〉裡邊的:「<p> 是無等師最勝子,荷佛一切事業擔,現化遊戲無量土,禮阿逸多及妙音<p> 」。在聽聞之前要發一個大乘的意樂——為了利益芸芸的眾生,我必須去希求佛果,所以必須要來聽聞,以種成佛的因,所以在聽聞的時候安住聽聞軌理,要將所學的法向內調伏。 [04′09″]</p>
<p>   如果大家準備好了的話,我們就一起開始聽師父的帶子。好!那我們就開始聽了。<p>   那麼這個佛的圓滿的教法流傳下來的時候,分成功兩個大系:一個是智慧,一個是方便;或者我們說一個是大悲,一個是大智。當他徹底圓滿的時候──佛,所以叫二足尊──明足、行足。那麼等到慢慢地向下的話,它一定分成功,這個時候用兩個菩薩來代表,實際上就是這兩個菩薩能夠圓滿傳持那一部分教法的。哪兩位?一個是彌勒菩薩代表方便,一個是文殊菩薩代表智慧。所以看第二個偈子:<p> 是無等師最勝子,荷佛一切事業擔,現化遊戲無量土,禮阿逸多及妙音。<p>   說現在這個是,「無等師」就是佛──無與相等的,是無等等師、那個佛最殊勝的法王子。這個法王子,他能夠圓滿地把佛一切這個事業的這個擔子能擔得起來的。而擔起來了以後他做些什麼呀?眼前化現無量無邊的身體,在十方一切世界當中遊化教導眾生。這是誰啊?這是阿逸多,就是彌勒菩薩,他是代表方便──大悲;以及文殊菩薩,代表智慧。 [06′27″]</p>
<p>   在前一段的時候,就介紹了佛法流傳下來的兩大系:智慧和方便,或者說大悲和大智。然後再說到這個偈子,說:「<p> 是無等師最勝子<p> 」,這個「無等師」,說無與相等的,就是沒有什麼能跟他匹敵的,就是指佛陀。那麼這尊佛陀最殊勝的法王子,在《四家合註入門》裡講到:為什麼說是法王子?是從佛陀的語教所出生的。這個法王子能夠做什麼樣的事業呢?就是「荷擔」佛的事業。荷擔了佛多少的事業呢?是一切的事業,「<p> 荷佛一切事業擔<p> 」。師父在這裡邊說這個擔子是可以擔起來的。提到「事業」,比如說一個公司有公司的事業,如果大的話,那事業的擔子就很大;一個家裡邊也有擔子。那麼文殊菩薩和彌勒菩薩荷擔了什麼樣的事業呢?佛的事業。在擔起來之後做了什麼呢?注意!就是「<p> 現化遊戲無量土<p> 」。注意哦!這一個概念打破了我們以往的習慣概念,就是菩薩他可以化現無量無邊的身體。 [08′04″]</p>
<p>   這裡邊我很驚訝的,就是師父用了一個「<p> 眼前<p> 」,是在誰的眼前呢?是在我們的眼前嗎?我們會知道嗎?那是在師父的眼前嗎?他可以化現這麼多身體,多到多少呢?無量無邊!這無量無邊的身體,在多麼廣闊的地方呢?他在「<p> 十方<p> 」——注意——「<p> 一切世界<p> 」。做什麼呢?「<p> 遊化教導眾生<p> 」。然後師父說:「<p> 這是誰呀?<p> 」這麼大的本事!可以化現這麼多的身體在無邊的世界、在一切世界遊化教導眾生!即是彌勒菩薩和文殊菩薩——一個代表大悲,一個代表智慧。 [08′55″]</p>
<p>   其實在看這一段的時候,我在「<p> 眼前化現無量無邊的身體,在十方一切世界當中遊化教導眾生<p> 」這一句,停了一段時間,我在靜靜地想。像我小的時候就常常想:為什麼一個人只有一個身體呢?如果有很多身體的話,每個身體都長得不一樣、會的本事都不一樣,那是不是很美好呢?現在想問諸位說:「假如有一天,你可以化現無量無邊的身體,你會用這無量無邊的身體做什麼呢?」這就和最初為什麼會修出這樣、可以化現無量無邊身的功德的發心有直接關係。所以師父說:「在十方一切世界當中遊化教導眾生。」為什麼要遊化教導眾生呢?因為眾生苦啊!要告訴大家怎樣離苦、怎樣得樂,所以在做著神聖的利他的事業,而需要無量無邊的身體。 [10′02″]</p>
<p>   注意哦!這兩位偉大的菩薩,他們可以化現無量無邊的身體,而且師父用了「眼前」兩個字。假如你將來會化現無量無邊的身體,你用它做什麼呢?你們也可以想。有人說:「如果可以化現無量無邊的身體,那就去下地獄,然後讓地獄都空掉,替那些有情受苦!」其實這也是一個非常偉大的理想! [10′30″]</p>
<p>   師父在這裡,把很不可思議的菩薩的一個示現,讓我們在凡夫小小的視野裡邊可以稍稍去想一下:有那麼多個身體,而那麼多身體都在做同樣教化有情的事情,可能方便是不一樣的,這是何等奇妙的事情!你和我會有那樣的一個未來嗎?我們在佛菩薩的教化下,會成就那樣的功德嗎?如果成就那樣的功德該有多麼美好!所以這兩位菩薩是有著不可思議神變力,和教化有情的偉大功德的兩位善知識! [11′19″]
<p>   好!接著再聽下一段。<p>   大悲、菩提心,就是發救一切眾生心這個願力,然後在這個方面用種種方式、種種方便去幫助別人,所以稱為廣行。但是你單單發了這個心要去救別人,如果說沒有正確的方法的話,不行!所以一定要有正確的方法,那麼就是智慧。就像我們普通世間來說,每一個家庭當中母親都是無限地慈悲,她總是希望自己的子女最好。但是這個母親,愛心是夠了,教導的方式不足,結果呢,溺愛,溺愛!這個「溺」愛,三點水一個弱,強弱的弱。寵愛反而把那個子女弄壞了,所以一定還要正確的指導,這樣。那麼這個正確的指導是所謂智慧,我們現在佛法也是如此。 [01′14″]</p>
<p>   在這一段裡邊,出現了「大悲」、「菩提心」、「願力」。注意!大悲、菩提心都是佛菩薩具有的,所以這裡邊說:「<p> 發救一切眾生心的這個願力<p> 」。然後發了之後,這個心是做什麼呢?就是由種種的方式、種種的方便去幫忙別人。他的方法和方式是無量無邊的,但是都從一個利益他人的角度,從菩提心、大悲心這個角度任運地流淌出來的,師父說這是廣行。」 [01′57″]</p>
<p>   但是我們單單發了這個心要去救別人的話,沒有正確的方法,師父接著說:「<p> 不行!<p> 」 [02′07″]</p>
<p>   那麼觀察一下我們自己:當我們現起了一個想要幫忙別人的心的時候,會不會很留心:欸,我有沒有正確的方法?我們會不會在方法上仔細地推敲一下,還是一股熱情就去幫忙別人了?但有的時候可能是越幫越忙,因為自己的方式可能是別人不喜歡的,或者不適合別人的,甚至是自己也沒有搞清楚的。所以師父說:「<p> 一定要有正確的方法。<p> 」那麼正確的方法,師父說:「<p> 就是智慧。<p> 」 [02′43″]</p>
<p>   所以當我們生起了想要利他的願望的時候,一定要同時學習智慧。為了讓我們了解這一點,師父說:「<p> 在一個家庭之中,母親對我們的關愛都是無限地慈悲,希望自己的子女最好。<p> 」但是如果愛心夠了,教導方式不足的話,提到了「溺愛」。其實現在有一些人感覺到好像媽媽沒那麼愛我;有些人是說:愛太多了。總之,這個愛心到底怎麼樣去搭配,才是對一個人心靈最好的灌溉?師父說:「<p> 一定還有正確的指導。<p> 」那麼對我們想要生起慈悲心,或者利益他人來說,這個正確的指導就是智慧。 [03′39″]</p>
<p>   我們都覺得自己很熟悉母親的愛,那麼如何去表達關愛?這個關愛得讓他體會到愛,而且有的時候可能是無條件的愛。因為這樣的話,他才會有安全感,才會在生命中建立了一個對他永遠不會變心的這樣一個母親的慈愛。那麼這個母親的慈愛還要智慧的引導,就是何者應做、何者不應做。有的時候應做的事可能是自己不高興,但是必須做;有的時候自己喜歡做的事,可能你的生命並不需要。所以我們在智慧的指導下,學會自律、自尊,要去知道何者對自己、對他人真正地有利,何者對自己和對他人是有害處的。 [04′28″]</p>
<p>   父母親在我們的生命中,一直關愛我們、又教育我們,這兩者有的時候弄不好就會導致家庭戰爭——爸爸媽媽吵架、孩子也會跟父母吵架,陷入一個很焦灼的矛盾之中。但是在這個焦灼的矛盾之中,只要想一想是不是用關愛可以融化?所以師父就介紹了觀功念恩。我們可以每天或者一週兩次一個家庭會議,在家庭會議大家都聚在一個桌子前,或者坐在沙發上,然後大家可以觀功念恩。比如說可以表彰一下這一週每個人對家庭的貢獻、心靈的成長,還有每個人美德的成長、自律性的成長。因為一個人的成熟跟他的自律有直接關係,不管多大,如果自律性不高的話,似乎還沒有成熟。我們是永遠需要慈悲和智慧對我們心靈的灌溉的,所以師父在這裡邊揭示了這兩個問題。 [05′25″]</p>
<p>   比如有的人特別特別希望得到別人的關愛,在心裡就特別特別想要關愛,但是是否會忽略對智慧的追求?還有一種情況,我們會特別特別希望小孩可以明辨取捨,在明辨取捨的時候,可能我們就教導得過分嚴厲,或者完全是理性,甚至是教訓的觀點比較普遍,就顯得關愛不足。這個時候可能有一些小孩就會逆反,因為他會覺得:見到你就教訓我,我做什麼都是不對的,你都不滿意!你都一直讓我做到一個很高的標準,我做什麼你都不開心!還有的小孩會變成一輩子努力就想要得到父親或母親的歡喜,他一直為此努力,也一直為此不安。 [06′13″]</p>
<p>   所以父母那一方面,還有子女這方面,各自有各自的焦灼,但是無非是關愛和理性、智慧的調配,所以師父在這裡邊巧妙地提出了這個問題——我們是這兩者都需要的。把這兩者最完美地融合在一起的就是佛菩薩,他們既有利益眾生、饒益眾生純潔無染的大悲心、菩提心,又有著最淨潔的、最徹底的智慧。這兩者達到究竟的完美結合,就是佛陀! [06′47″]</p>
<p>   所以不管我們現在在一個什麼樣的次第:或者我費盡心機想讓小孩教育得很好,可能事與願違;或者有些小孩他會覺得我費盡心機努力,希望得到父母的讚賞,但是還是好像對我不滿意。不管我們在怎樣的過程之中,我們都必須去理解,在內心裡找到父母親對我們關愛的那個點,藉以溫暖自己,也溫暖整個的人生。因為這樣的話,我們才會在跟他人溝通啊,或者在這一生的努力之中,一直都感覺到父母的關愛是伴隨著自己的。 [07′25″]</p>
<p>   既要關愛,又要智慧的提升,這兩者在學《廣論》中,我們會不停地學習。我看到很多父母親非常辛苦地學習,他們要學習怎麼樣跟小孩相處,甚至小孩很大了還是有相處問題。這個相處問題就涉及到內心的種種習氣,有的時候父母的風格和孩子的風格是不一樣的,比如父母是很快的,小孩是很慢的;有的是反之。不管怎樣,大家都透過學習不停地擴大自己關愛對方的角度,看到對方很努力的那一點,或者理解對方的感受,藉以息滅彼此的誤會、瞋心,乃至悲傷、孤獨感等等。 [08′11″]</p>
<p>   如果我們能夠不停地在內心中努力地去關愛他人,提升自己心靈的溫度、關愛他人的廣度,而且在關愛他人的智慧上也努力地提升,這樣的話,從家庭開始,慢慢地溫暖一個人,然後慢慢地溫暖周圍的人。 [08′30″]</p>
<p>   在這一小段裡,師父非常自然地把大悲心、菩提心和智慧融合在一起,然後舉一個在家庭裡邊的例子,讓我們感覺到實際上這都是我們生命所需要的,就是——慈悲和智慧。因為如果沒有這樣的一個例子,讓我們靠近去觀察和思考的話,我們會覺得慈悲和智慧是很高遠的,是佛菩薩才具有的功德。 [09′00″]</p>
<p>   師父的這一小段蘊涵的哲理還是滿深刻的,這裡邊可操作面也是比比皆是。比如說敬老事業呀、教育事業呀等等,在這一小段可以去鑽研很多很多。總之,師父用一小段,表述一個非常深邃的、非常深遠的,對我們人類教育體系的一個看法、一個見解,或者他的教誨。 [09′28″]
<p>   我們下面再來聽一段。<p>   前面上說「遊戲」,這個地方遊戲不是我們現在的沒有什麼事情玩玩,這個不是!所以這個經論上面告訴我們的「菩薩清涼月,遊於畢竟空」,他這個菩薩有無邊的智慧的光明,為什麼叫像月亮一樣呢?這個太陽曬在身上,唉呀,讓人家熱得有點受不了!這個月亮啊光明,照在身上就給人家有個清涼之感。他不是像聲聞一樣地停止在那裡不動的,而他是有種種方便,種種方便遊化這個世間,所以叫「遊於畢竟空」,以智慧扶持,所以儘管他有種種事業,是不受染汙,這個遊戲是這個意思,就是教化眾生的意思來說。 [01′05″]</p>
<p>   以前在廣論班的時候,有的時候聽一小段,我們會重複地聽師父的帶子,有的時候會聽七、八遍,有的時候還聽過十二遍、十四遍、十七遍等等。所以如果你們覺得沒有聽明白,可以把師父的帶子再重聽一遍,因為我在講的時候可能只有放一遍。 [01′30″]</p>
<p>   在反覆重聽師父的一小段的時候,我們總是發現:有一些同學會落掉師父要講的意思。還有的,他非常認真地聽,聽一遍,我說:「這段有這個意思,有聽到嗎?」他說:「欸?沒有哦!」他落掉了。然後重複一遍再給他聽,又落掉了。最高紀錄是有一個同學重複聽了十二遍,他都會落掉同一個部分,到那個部分不知道為什麼就沒有聽到。後來又特別指出,說:「這一段,你要把剛才落掉的這一小段把它聽出來!」結果我說聽了十七遍就是那個同學,他把它聽了十七遍,然後終於聽到了。後來他自己就慨歎,說:「啊,業障啊,業障!為什麼我總是在每聽一遍的時候就落掉這個部分呢?」這是一個非常非常值得思考的問題。 [02′21″]</p>
<p>   在「<p> 現化遊戲無量土<p> 」,師父著重解釋了「遊戲」。師父說:遊戲不是我們現在沒有什麼事情啊到處玩,這個是區別於世間的。這個「遊戲」,在藏文裡是「戲舞」的意思。師父就講了這個偈子,說:「<p> 菩薩清涼月,遊於畢竟空。<p> 」這裡邊就提到了智慧,智慧像月亮一樣照在身上,給大家有清涼之感。聽到這裡的時候我們可以反思一下,首先「遊戲」,會不會想到小時候的遊戲?遊戲是孩子們最投入的,如果一個小孩哭了,給他一個好玩的東西,他馬上就會忘記,然後甚至臉上還掛著淚珠,就開始歡天喜地的遊戲了。這是那個遊戲。 [03′17″]</p>
<p>   談到遊戲,就一定要提到「樂在其中」,所以佛菩薩度眾生戲舞的時候,他也是一個「從樂趣勝樂」的美妙的旅程。菩薩在無邊的世界化現無窮無盡的身體,用種種方便利樂有情的時候,他自心是樂在其中、是很歡喜的,甚至歡喜越來越增廣、越來越增廣。 [03′44″]</p>
<p>   那麼對比我們來說,當我們承擔一個事業,有一個名頭掛在我們頭上,要涉及到很多問題——僧團、法人事業呀等等,涉及到方方面面的事情,那能感覺到承擔這些事情的時候越來越快樂嗎?如果自己越來越熱惱的話,那肯定不是師父所歡喜的。所以在承擔每一件事情的時候,就要考慮:是我自己在承擔嗎?還是師父的願力、佛菩薩的願力、眾生的善根力,令這件事顯現,而我只是在其中集聚資糧,給我這樣一個美妙的機會,讓我能夠練習我的發心、練習自己的持戒?所以要感謝一切參與到這個福德和智慧偉大事業中所有的人。 [04′41″]</p>
<p>   如果常常念茲在茲都不失去正念的話,我們會知道所顯現的一切、好像從境那方面出現問題的一切,實際上都是自心對這個境界的安立出了問題。當我們感到熱惱的時候,不是一定在境界上出了什麼不順心的事情。可能還有一種考慮是:事情是那樣的,但是一定會產生熱惱、一定會產生苦悶嗎?一定會產生焦灼嗎?或者一定會產生孤獨感嗎?或者一定會產生瞋心嗎? [05′18″]</p>
<p>   在承擔事情的時候,我們會發現自己的執著,因為特別特別在意、特別特別想辦成這件事情,所以當過分地執著這件事的成功,總是想:「啊!等到它成功的那一天,我可能就開心了!」這樣的話,可能你就會忽略成辦它的過程中所出現的那些很絢麗的、最難忘的事情,因為我們一直盯著成功。這樣的話,其實我們就沒法活在當下,甚至每一天都過得匆匆忙忙,甚至是非常浮躁的。 [05′52″]</p>
<p>   比如說發心,每天《廣論》研討之前都有一個發心,如果匆匆忙忙地發心,而且對發心沒解其味,久了之後它就變成一種形式,變成不入心的;再久了之後呢,就唯恐自己成為教油子。因為知道了很多道理,可是卻沒有拿它來修心,修了很多年之後,反倒對佛法退心了。這一定是自己的修持方法、用心方式有問題,因為上師們並不如是。 [06′21″]</p>
<p>   在承擔很多法人事業,或者法師們在僧團裡承擔,比如說在五大論進程中所有的法師們,他們要學藏文、然後必須背書,因為不背書上辯論場就沒得辯。在辯論的時候,大家都要上場,比如說給你十五分鐘時間,你的辯論必須要滔滔不絕。而且對方是沒有套好招的,就是抽籤決定,你遇到誰也不知道,他看了多少書其實你也不甚了解。所以在辯論場上的遭遇戰,對每個人來說都是很新奇也很刺激的!如果不善於調解內心,都把它變成是一種壓力、一種焦灼的話,那學習經論的過程中就會變得很累。但是如果我們上辯論場的時候,很期待對方出現精彩的理路,或者自己雖然想好了一個思路,因為認真地祈求佛菩薩,在那一刻,感受到佛菩薩的加持的時候,對於同樣的一段文義,我們會有很多重的理解,甚至更深入的理解,突然產生像火花般飛躍的、燦爛的思路。當這種思路產生的時候,你知道它照亮了自己,你知道很欣喜地會遇了這個思路。 [07′36″]</p>
<p>   但是如果我們一直沉甸甸地考慮成敗,一直計較著成敗的話,我們就不能全心地領會到佛菩薩的加持。在那一刻,我們和自己的辯論並不能合而為一、全身心地投入到自己的辯論——整個宇宙就只有我和對面那個跟我辯論的人,甚至到最後,就好像我自心裡的兩個聲音在彼此辯論一樣。所以那可能在某種程度很激烈,但它是一個寧靜的、非常廣闊的、非常非常專注的一種辯論。 [08′07″]</p>
<p>   一旦我們不停地去樂在其中,感覺每一場辯論都是一場加持,又讓我清涼了一些熱惱。這樣的話,整個學修的過程,就是充滿期待、充滿發現的。然後你會不由自主地熱愛這個過程,期待在辯論場上遭遇到更強悍的對手,甚至強悍到他足以把我打敗、甚至打敗得落花流水,這樣我回去才會去想,才能夠起死回生。如果自己無法起死回生,我必須求教於佛菩薩,就像阿底峽尊者在辯論的過程中,他會回去祈求度母,祈求完之後,去辯論就會很厲害。 [08′45″]
<p>   如何學習佛菩薩,把教化有情的事業變得像遊戲無量土,全部樂在其中、歡喜無比,是非常非常需要注意我們的學習方法,乃至發心。如何去除很多壓力、很多不必要的焦灼、孤單感、無助感?當我們感到無助的時候,如果你沿著無助的思路去想就會越無助;不如想一個辦法如何去解決這個無助,一、二、三......,次第是什麼;其中重要的一點,就是向佛菩薩祈求;再一個,向知道的人去詢問,找出方式,然後去解決這個無助。總之,待在那裡一動不動、無助,和去找很多人問方法,肯定是後者對我們來說比較積極、比較樂觀。 [00′44″]</p>
<p>   不論在辯論場上,或者在園區承擔的老師啊,或者在園區學習的學生,甚至在法人事業,在各個行業的廣論班同學,大家都需要學會去擺脫壓力、學會去令自心成長。當我們不停地令自心成長的時候,就會感覺到其實我的苦樂並不只是源於正在發生什麼事,而是源於這個事情帶給我什麼啟示、什麼成長。 [01′13″]</p>
<p>   一旦我們的心,朝著悲心和智慧的成長方向去努力的時候,我們就會覺得其實日子過得還是滿殷實的,因為我收穫許多、我成長許多。看到自己成長許多之後,當然就會有歡喜——雖然不能說像佛菩薩那樣,產生遊戲無量土這樣一個不可思議的境界,但是至少會在其中發現亮點、發現希望,破冰、破無助、破孤單感、破不知所從、破虛度人生!至少我會在每天每天的這種承擔和修行中看到盲點,看到盲點也是一種發現,然後再去想法突破盲點,又是一種發現。一個發現,接著一個發現......大家知道一個偉大的發明,通常都帶給我們無量的喜悅,那麼我們對自心的一個成長和發明,也畢竟會帶給我們自心的清涼或者幾許雀躍,所以這個過程還是非常美妙的! [02′16″]</p>
<p>   師父在這一小段裡一直啟示著我們:「遊戲」這兩個字,在每天的承擔中,要想到令自己成長、令自己的心靈愉悅。你說:「啊!那令自己的心靈愉悅,會不會是沒有利他?」利他的時候不一定是苦哈哈的。如果一直是苦哈哈的,能堅持多久呢?我們就會感覺到累得不行了,或者已經沒有辦法了。所以內心的成長還是要特別特別關注的,一旦我們在內心中不停地感受到佛菩薩的加持、師父的願力的攝持,我們就不會在承擔事業的時候過分地膨脹個人和自我,而忘記了團隊的付出,忘記了每個每個廣論學員、每個每個出家人,在這一期建立教法中他所做的那種非常稀有的努力。我們就會發現我們真的是很大的一群人在成辦學習《廣論》,乃至由學習《廣論》所生出來的很多自利利他的事業。 [03′15″]</p>
<p>   那麼自己在一個很大的群體之中,涉及到人際溝通,涉及到我所承擔的事情方方面面的,就沒有像自己一個人那樣那麼輕鬆。正因為不輕鬆,所以我們才會去尋覓一個簡單的辦法,就是怎麼樣活在當下!當下是什麼?正視發心,如理聽聞,認真地將所聞的法義校對內心,結束之後再好好地迴向。聽起來好像很制式化、很次第井然的一個聽聞佛法的過程,但是正因為質對了、量對了之後,我們才能夠產生如量的覺受。所以不一定要等待非常美好的明天、一切都圓滿的時候,我們才能體會到快樂,在每一節課上好的時候,我們就會快樂。 [04′03″]</p>
<p>   在每個承擔的事業中,甚至在非常艱難的時刻,怎麼去透過種種艱難體會稍許的輕鬆呢?還是要想一下:這種艱難是事項本身的艱難,還是我把它安立為艱難?那麼它不艱難的是什麼呢?因為有指導原則呀、有修心原則啊、有很多戒律的明文規定、有師父的教誡......。一旦拿法來數數地校對內心、校對這個方向,我們就會不停地覺醒心中的良善,或者長養心中的善意。一旦我們的善意越來越擴大、越來擴大的時候,我們就會發現:真的有誰對立嗎?真的有很多敵人嗎?真的有很多好像我無法面對的嗎?一旦心裡開朗、遼闊,發生一點小小的矛盾,我們試著從這矛盾中找到自己的盲點去提升的時候,我們的心就獲得了喜悅。 [04′59″]</p>
<p>   所以我想說:在每一步、每一步的承擔之中,確實都離不開智慧的觀照——觀照我在幹什麼?我在說什麼?我在想什麼?是不是沿著善業的方向、沿著淨化煩惱的方向?還是沿著膨脹自我的方向、沿著以自我為中心的方向?如果我們常常拿法來校對自心的話,自然會越來越明利。注意!明明白白、非常地犀利,是對自己的。對他人呢?觀功念恩啊、慈悲呀、寬恕啊、理解呀、溝通啊、和平啊,擺脫那種暴力的思考、暴力的語言,或者暴力的心念,是我們非常必要的修行! [05′44″]</p>
<p>   所以在這裡邊,師父說:「菩薩清涼月,遊於畢竟空。」慈悲和智慧的美妙融合,在面對著無量無邊的事業的時候,菩薩都能用「戲舞」的方式來完成不可思議的這些事業,這是一件多麼值得期待的事情,所以我們一定要好好地學習! [06′04″]
<p>   請大家把《四家合註入門》翻到五十七頁,然後我們看一看《四家合註入門》裡邊對於這個偈頌的解釋。在仁波切的講記裡邊,說在這個《廣論》中,有開示深廣兩種道,就是《廣論》含攝甚深和廣大兩種道,所以宗喀巴大師頂禮其中的傳承上師。那麼甚深、廣大二道的傳承到底是怎樣呢?前者就是兩者之中的甚深道,也就是深見的傳承,是由文殊菩薩傳與龍樹菩薩;後者就是廣行道——廣行派的傳承,由慈氏傳給無著菩薩,就是彌勒菩薩傳給無著菩薩。這裡邊講了主要是傳承深見、廣行兩種傳承,仁波切還介紹了一種加持派的傳承,或者說偉大行派的傳承,是文殊菩薩傳給寂天菩薩的,所以總共有三種傳承。 [01′35″]</p>
<p>   那麼,在這個偈頌裡邊說:「<p> 是無等師最勝子<p> 」,所謂「無等」就是「沒有匹敵」的意思。因為一切的佛陀都對我們的釋迦佛「<p> 讚如白蓮<p> 」,所以說是無與倫比的,沒有什麼可以跟他匹敵的。 [02′00″]</p>
<p>   為什麼讚美釋迦佛像白蓮花一樣?那麼取白蓮的什麼精神?如果在綿綿細雨的時候走在橋上,然後去看一朵水中的白蓮花,會發現它在水波中非常非常地聖潔和出塵。當你非常認真地凝視著它的時候,其實心裡也會感覺到清涼,所以用「亭亭在水中」等等,有很多人讚美過白蓮花。但是善知識說這個白蓮在印度是非常非常少見的,大多是紅蓮花,所以讚美白蓮就是取它「稀有」的意思。一般蓮花都給我們一種聖潔的、很出塵的、很清涼、無染的一種感覺,但這個白蓮,它取稀有的話,就取釋迦佛的發心非常的勇猛和聖潔,為了五濁惡世的我們來這個世界示現成佛。師父以前給我講過說:「聽說有一種蓮花叫王蓮,說是大如車輪。」當時我還問說:「是葉子大如車輪,還是蓮花?」師父說:「是蓮花。」但是後來四處去問,說是只看過那個蓮葉大如車輪,沒有見過蓮花大如車輪的。如果有一種蓮花大如車輪的話,那真是太稀有了! [03′35″]</p>
<p>   所以這裡邊讚美釋迦佛,為了度化五濁惡世的我們,我們在這個世界就是煩惱又重,又非常地苦,壽命又很短,他完全不在意這些,可能正是由於這些難以想像的痛苦,他就縱身躍入這個輪迴的大海,來這個五濁惡世度化我們。所以這種勇猛的志向、勇悍的發心,就像白蓮花一般稀有。所以十方的諸佛都一齊地讚歎,所以叫「無與倫比」,是「無等」這個解釋。 [04′20″]</p>
<p>   那麼「師」,這個「師」字是指「導師」。是「<p> 修正所化相續故為<p> 導<p> 師<p> 」。這位導師他要教什麼呢?就是他的學問或者他的智慧能夠去修正、淨化所化機的相續。那麼「修正」什麼?就是滅除所化相續中的一切煩惱。能開示這個方法的人,就稱為「導師」。所以「無等導師」,就是無可匹敵的導師佛薄伽梵。那麼,從他的語教所出生的最勝子,荷佛一切事業擔的最勝子,「<p> 是無等師最勝子<p> 」,這個「子」非指一般的父子,是形容從佛陀的語教中所出生的弟子,而且他前面還有個「最勝」。 [05′30″]</p>
<p>   什麼叫從佛的語教所出生的?我們都知道,我們從哪裡來、我們的家世背景,就會帶著那個家世背景的一些文化的色彩、習慣,或者說很多很多的傳承都在這個背景裡邊。那麼這個「最勝子」是從佛陀的語教所出生的話,就是他的心續為佛陀的語教浸透,完全是從佛陀的語教中所出生的。所以他的身語意所顯示的,即是佛陀教證二法的功德。看看這幾個字——「<p> 是無等師最勝子<p> 」,讚美了佛陀,又讚美了他最殊勝的法王子。 [06′24″]</p>
<p>   這個最殊勝的法王子,他的功德事業到底是什麼呢?說:「<p> 荷佛一切事業擔<p> 」,佛的什麼事業呢?就是「隨應調化十二相事業」,調化有情,令有情離苦得樂。這個最勝子,將所有的佛陀的擔子圓滿地擔荷起來了,這兩位就是彌勒菩薩和文殊菩薩。 [06′52″]
<p>   說:「<p> 現化<p> 種種情器<p> 遊戲無量土<p> 」,在原文裡說:「<p> 現化遊戲無量土<p> 」,如果師父沒在上一篇中清晰地標示出「化現無量無邊的身體」,其實我們看到「<p> 現化遊戲無量土<p> 」,不會想到化現那麼多身體的。我們可能會想像說:啊!佛菩薩,會飛呀!然後會飛到一個世界又一個世界,在無量的世界裡飛來飛去,然後度脫有情。我們不會想到他同時會化現無量的身體,在無量的世界同時做著利生的事業,我們肯定會有先後的,先這個、再那個、再那個,但是他是同時「<p> 現化<p> 種種情器<p> 遊戲無量土<p> 」。 [00′45″]</p>
<p>   這裡邊,注意!「器」,仁波切解釋說青山、岩石、樹木;「情」就是指屈伸俯仰的有情,這就是「種種情器」。菩薩會顯現變化種種情,我們是可以理解的,比如說化現不同的身體呀,有不同的化身去度脫有情;但是如果說化成器的話,就好像很難想像。但是在《入行論》裡,大家還背過吧?說「<p> 求島即成島,欲燈化為燈<p> 」。就是你想要燈的時候他就化現成燈、希求得到島的時候他就化成島。那麼人們為什麼要燈呢?可能是想要光明、想要溫暖、想要方向。為什麼想要島呢?可能有很多理由。總之,會「<p> 求島即成島,欲燈化為燈<p> 」。用這種種情器,來遊戲度脫有情。 [01′55″]</p>
<p>   那麼用各種化身遊戲無量的佛土,到底要做什麼?成辦有情的利益。然後「<p> 戰勝四魔<p> 」,這個「四魔」,就是指煩惱魔、五蘊魔、死魔,還有天子魔。因為消滅了自己相續中的一切四魔,所以稱之為勝者,「阿逸多」就是不敗尊的意思。另外,對彌勒還有一個尊稱叫「<p> 紹勝尊<p> 」,是指成為佛薄伽梵的繼位者,就是如同往昔導師世尊成為兜率天的主尊那樣,紹勝尊就是阿逸多,也是彌勒,會是下一尊佛。 [02′40″]</p>
<p>   在這裡邊,宗大師讚美佛陀和他最殊勝的法王子,因為在無量的佛土化現無量的身度脫有情,荷擔了佛陀所有的利生事業,因此禮敬文殊菩薩和彌勒菩薩。 [03′04″]</p>
<p>   在談到禮敬佛菩薩這一點,師父其實常常強調一定要去思惟佛菩薩的功德,思惟佛菩薩的功德之後,我們的內心會有所轉變。比如說去佛前禮佛的時候,是不是每一禮我們都是發自內心的頂禮?還是禮佛禮久了,有的時候匆匆地像完成一件事一樣,趕快去禮佛,禮佛完就離開了?當然匆匆禮佛一下比一忙起來就不禮佛要好的多,但是既然都禮佛了,最好養成到佛前身語意三全都能恭敬。為什麼身語意三全都能立刻恭敬禮佛呢?要調伏自心、調伏我慢;另外,說:「<p> 禮佛一拜,罪滅河沙<p> 」,有很多很多的功德! [03′54″]</p>
<p>   所以如果能在二六時中、每天抽出時間,甚至一天抽出好多時間去禮拜佛菩薩的話,修習這樣的善妙之業,對我們的暇滿來說,也真是難能可貴的。希望每一次大家去禮佛的時候,如果你發現心很散亂、很難專注,或者心裡在拜佛的時候沒有一種感動,或者沒有一種轉變——拜佛前、拜佛後沒有轉變,這樣的話,可能需要稍稍抽點時間思考一下佛陀的功德。因為像彌勒菩薩和文殊菩薩,只要就其中的一項功德,比如說化現無量的身,在無量的佛土、無量的一切世界度脫有情,荷擔了佛陀這樣的事業,其實單單想一下,我們還是會很震撼的。這個時候,我們合掌一禮,或者小禮拜,或者大禮拜所累積的善業,應該是比那種不思考馬上去佛前拜佛不知道要大的多少呀! [05′03″]</p>
<p>   這就是師父在《廣論》裡常常講到的,用思惟力轉變內心。師父說怎麼能讓我們的內心開始轉變呢?就像推一個石頭一樣,思惟它的勝利和思惟不這樣做的過患,一個是前面的拉力,一個是後面的推力,這兩個力加起來,就會令我們的內心產生轉變,而修行也就是讓我們內心轉變。比如說見到佛菩薩很麻木、完全沒有感覺,這樣去禮佛,禮久了之後,那修行從何建立呢?可能慢慢沒有感覺了,而沒有感覺、沒有進步,其實就會倒退,因為最初我們來禮佛的時候,還是很虔誠的。所以常常在學教典的時候,比如說學《廣論》,在講到佛菩薩功德的時候,甚至你把這個偈子背會了,常常念一下,就到佛前的時候念一下,一邊念、一邊頂禮。以前我們講過三十五佛,去禮佛的時候一邊念、一邊頂禮,這都是非常非常美好的一個修行。 [06′07″]</p>
<p>   請大家要銘記這兩位殊勝的法王子,在我們的修行生涯中對我們的深恩啊!就是為我們詳盡地解釋佛陀的教法,否則佛陀的語教,比如說《般若經》到底在講什麼,沒有這些不可思議的大菩薩為我們講解,我們是很難很難明白的。用自己的心去揣測佛的意思,可能都相差十萬八千里,甚至一出門方向完全是反的。所以對我們的深恩,非常地難以回報,值得我們好好的修行、銘記在心!所以以一切的身語意至心地頂禮「<p> 是無等師最勝子,荷佛一切事業擔,現化遊戲無量土<p> 」的文殊菩薩和彌勒菩薩。 [06′59″]
<p>   好!我們現在就看下一個偈頌:「<p> 如極難量勝者教,造釋密意贍部嚴,名稱遍揚於三地,我禮龍猛無著足。<p> 」 [00′20″]</p>
<p>   那麼再繼續下去,也是另外兩位菩薩。那個兩位菩薩一個是龍樹菩薩,一個是無著菩薩,也同樣代表了智慧跟方便,一個是深見,一個是廣行;一個是大智,一個大悲。<p> 如極難量勝者教,造釋密意贍部嚴,名稱遍揚於三地,我禮龍猛無著足。<p>   這個說,那麼佛為什麼他的教法好好的,佛不是最圓滿嗎?為什麼還要他的這兩個人來教導呢?這地方我們有一個疑問,可能;或者你們根本提不出問題,實際上這是個問題。我們說教化不是佛最好,為什麼還要菩薩?就算菩薩嘛,十地菩薩最好,為什麼還要更等而下之,而是龍樹、無著?因為彌勒菩薩、文殊菩薩他們都是等覺菩薩,而他們下面龍樹、無著兩位菩薩是初地菩薩。這為什麼一個一個要這樣地下來呢?這裡是一個問題,那麼在這裡我先簡單地說明一下。 [01′58″]</p>
<p>   在這一段,師父先提出了一個問題。師父說可能我們根本提不出問題,然後師父說:「<p> 實際上這是個問題。<p> 」這句話有兩種理解,就是實際上師父提的這個問題是個問題:「佛陀教得好好的,為什麼還要跟他的殊勝的法王子學呢?」這個問題是個問題;還有一個問題是「根本提不出來問題」是個問題,因為很多很多人學,就是聽,聽了之後,可能是不習慣提問題嗎?還是沒有餘暇去提問題,就是聽? [02′41″]</p>
<p>   其實能提出對經典的問題,然後再沿著自己的問題去尋找答案,常常就是我們能夠趣入經典的一個很好的方法。比如現在學五大論的時候,每節課都要辯論,對一個問題的定義、界限、範圍,有的時候因為兩個字的辯論題就有好多好多,講了好幾頁。因為你就這個問題反覆地討論——上課的時候聽善知識為我們講了一遍,下課的時候又對這個問題進行閱讀,又去想自己的思路、去聽別人的思路,然後上辯論場的時候,又跟別人真正地去碰撞彼此對這個問題的看法,有的時候你自己想完了之後,覺得:「哎!我的思路可能是天衣無縫了。」但是可能學了辯論很多年之後,這種感覺大概很少出生了,你會覺得不管想得多麼周全,別人總能在你的思路中給你一個「因不成」,或者「不周遍」。 [03′42″]</p>
<p>   在這裡邊,師父非常善巧地啟發我們要善於提出疑問,然後要善於去追尋它的答案。為什麼我們還要跟佛的殊勝的法王子學?這一點可以列為我們的一個疑問。但是我還想問大家一個問題,師父說:為什麼還要他的這兩個法王子來教導呢?師父用了「教導」兩個字。其實在聽師父的帶子的時候,我常常會留意個別的幾個字,比如說在這裡邊用了「教導」,所以在談到龍猛和無著菩薩的時候,師父會認為他們是來教導我們的。我想同學在看到這個偈子的時候,會想說:「哎!龍猛菩薩、無著菩薩有什麼樣的功德呀?我們很想要了解他們的功德和修行的事蹟。」但是有沒有從一個他是來教導我的這樣的善知識的角度,去了解龍猛和無著菩薩的功德?或者我到底要跟他學什麼?他為什麼要來教我? [04′52″]</p>
<p>   師父在示現上,處處都會顯示著謙恭地、勤奮地學習佛菩薩,所以他在字裡行間常常流露出強烈地想要學習慈悲和智慧,儘管我們會覺得他已經具足了不可思議的慈悲和智慧的時候,他還是這樣示現著向一切佛菩薩學習。甚至在師父的每一篇日記裡,都是寫著:「頂禮佛菩薩」、「請佛菩薩加持」、「請佛菩薩賜教」,全部都是!而且他的那個稱呼都寫「弟子」,非常非常地虔誠。 [05′29″]</p>
<p>   一旦我們養成提問題、想要去尋覓答案的習慣,就是在思考的一個狀態,這樣的話,我們對我們的身心正處在的狀況,其實也會養成一個觀察思考的習慣。比如說,哎!我們發現我的心裡有點不太對了,或者有點不滿,然後你就觀察一下:首先要知道自己有點不滿的情緒,那麼對什麼不滿呢?是對某個人不滿嗎?然後會想到:哎!今天好像他也沒有做什麼對我不滿的事情,那麼為什麼看到他心裡有點怪怪的呢?然後觀察,就會發現可能是某一天他做了什麼事情,那件事我當時好像沒有感覺到什麼不舒服,這件事就過了。可是偶然的一天,見到這個人之後,那件事好像沒有明顯地浮現,但是卻有一個不太舒服的感覺。這個時候你就會發現那個習氣呀!那個觀過的習氣呀!當時可能心力很猛,這個觀過的習氣就沒有特別明顯地打擾自己。但是某一天當你心力有點弱,或者這一天早晨沒有認真地提正念、發一個強烈的誓願說:「啊!我今天要把我身心上現出的一切煩惱全部都降伏掉!」當我沒有以這樣強猛的誓願開始的時候,欸!那天過去那個境,它又回來了,回來之後你發現它還是打擾自己了。其實這也是對身心的一種觀察和探索。 [06′59″]</p>
<p>   一旦探索到我們內心的問題的時候,我們首先是不會肆無忌憚地覺得這是別人的錯。還有一點,我們會很耐心地去尋覓這個煩惱的習氣,它的累積是不是源於那天我沒有好好懺悔?或者我今天對我的心,防護力不是很嚴?或者我早晨起來沒有認真地發心——「我希望我一切的身語意的行為都能夠利益他人,而不是以自我為中心、看他人有沒有對我好,我要練就用我的一切三業來饒益我所見到的一切的人,甚至沒有人的時候,我的心念也要那樣去想著利益所有的如母有情,做什麼的時候都要有這樣的一個意樂?」 [07′47″]</p>
<p>   常常養成一個提出問題,然後去探索問題的習慣,這樣我們的心就不會沉在一種情緒中、一種感受中不能自拔,覺得就是那樣。反過來思考、再反過去思考,從很多的角度去注視這件事,尤其是從所學的教理來注視我們的相續正在發生什麼事情,就是要對我們的心有一個覺察,其實這件事是滿重要的。 [08′15″]
<p>   在跟師父學習的過程中,覺得師父非常非常善於去啟發弟子思考,因為師父常常會提問題,我們也會對師父提問題。在提問題的時候,師父一個答案回來之後,大家就覺得:「是、是、是。」實際上師父更喜歡師父的答案回來之後,我們再問一個問題回去,師父再回答,然後再問。不停地對一個問題從各個角度、甚至是縱深式的探討的時候,會發現師父是非常非常開心的。因為我自己從小就是一個愛提問題的人,常常會害怕是不是提太多問題了?比如說我常常問師父說:「師父,一直提問題、一直問問題,這樣會不會說話太多了呀?」然後師父就說:「唉呀!不會呀!不會,只會嫌你說得少,不會覺得多。」我可能一天中就要問好多次:「師父,我會不會問得太多?」師父永遠都會認真地回答我說:「我不會嫌你問得多,只會覺得問得少。」這個對話我們要重複好多次,但是師父真的是很開心。我自己也喜歡別人提問題,不知道諸位班長呢?在班級裡會不會也喜歡別人提問題?初學者他的心裡一定是有很多疑問,把這些疑問掃除了,才能夠建立真正的信心。這樣的信心才會非常地牢固。 [01′26″]</p>
<p>   所以新同學在提問題的時候,尤其是也不知道是什麼就問問題的時候,我比較希望大家是不是開明一點?如果自己不知道怎麼回答,就是回去想一想,或者去請問法師等等,不要一下子就讓別人問不出來話了。我們廣論班裡有沒有規則——新來的人不能提問題?沒有吧?希望我們現在的廣論班能愉快地討論問題,每個人能夠拋出內心的想法:「你對這段的經文是怎麼想的?」「你遭遇到的問題是什麼?」大家在一起討論。當那個熱烈的氣氛出現的時候,其實人們不會走神,或者覺得無聊,或者覺得這個班沒有任何的吸引力。因為問題牽著他的心,有的時候早晨也會想這個問題,上課之前也會想這個問題,甚至二六時中有點閒暇時間,他就開始想、開始探索。一旦他的心緣著佛菩薩提出問題,或者緣他「生從何來、死向何處去」,研究這些問題的時候,其實一些煩煩惱惱的事情,有的時候就不了了之了,不會一直想要把那個煩惱的事情一定要弄得你對我錯、爭出個是非來,為什麼?他想節約時間,然後來探討一下自己生命中認為比較重要的問題。 [02′46″]</p>
<p>   所以,等到學五大論的時候,那辯論場上的問題就可想而知了,就是整場都是拋問題,然後大家討論問題,甚至每一個理路的每一個關節這樣延伸出去。有可能你前邊是辯得很順的,然後忽然一個小地方出了問題,一下整條理路都毀了。所以說你開始建立的宗和最後跑出去的,如果稍稍有一個不謹慎,立刻就被對方發現,然後你的所有的理路可能當時就被廢掉了。所以非常嚴謹地考驗我們的思路、考驗我們探索問題的深度,甚至我們對教典學習的廣博與寡少;甚至我們勤不勤於思考?我們思考的方式是單一化的,還是多向化的?我們思考是敏捷的,還是沒有那麼敏捷的?我們做這些思考和辯論的時候,是為了想要贏別人,還是為了學習?向一切能夠學習的事上學習? [03′49″]</p>
<p>   其實學習也是一種能力,這種能力就是習慣從學習的角度去獲得對生命非常有益的智慧,和很多很多的學問,甚至人品也是要學習的,每個人身上可能都有一個我做得不足、他比較好的地方。所以我們在廣論班裡可以廣泛地去看一看,就學習的觀點去向人家學習,其實這個人生是非常非常富足的,因為你會向你路過的這些人學習,看看他們現在為什麼能做得好呢?就是過去生非常努力地修行,所以這輩子他顯現為比自己超勝,那就去學習呀! [04′29″]</p>
<p>   一旦抱著學習的心態的時候,其實很多事情我們會關注於我內心的善業的成長,或者智慧的成長,或者說慈悲的成長。一旦關注到這些問題的時候,我們就從人我是非的那個牢籠裡慢慢地脫出來,很多事情都會去考慮:哎!這件事我成長了沒?我令他人成長了沒?如果發現成長了,我們身心受點苦惱啊,這個過程還是必然的。我們就不會特別特別在意我所受的苦,我苦了多久?我卡住多久?而對方說什麼了?又怎麼樣、怎麼樣......我們就對這些,給它一個定義——這是我成長的一課,所以最後就會得到歡喜和感恩。為什麼呢?因為我們想學習。為什麼想學習?因為生命的種種不滿,都跟自己對於境界的顛倒安立、對自心的模糊沒有去觀察、對教理沒有做深入地探討是有直接關係的。一旦我們想法去學習的時候,在一切境界中、在跟人相對的時候都要去學習,使我們的這顆心處在一個非常警覺的、非常活潑的一種狀態,然後我們會發現每天都好多收穫,每天都看別人怎麼那麼多優點呢?看自己也會看到優點,也會看到缺點,但由於我愛執的原因,通常都會看到很多優點,缺點看不到。或者說有的人太執著自己的缺點,而弄得自己完全沒有力氣反擊這個缺點。這都是我們在修行的時候要從學習的觀點、從學習的角度出發,認真地完成每一天的修行。 [06′07″]</p>
<p>   所以師父在整本的《廣論》中,甚至在他自己二六時中的行持之中,為我們示現了一個勤奮學習的好的榜樣。這點我也是深深地感恩師父,在我的生命中,還有在很多很多廣論學員的生命中,給我們上了如此如此深刻的一課、一課又一課。 [06′32″]
<p>   好,那我們再來聽師父講的下一段。<p>   佛法本身,它除了如理、如量以外,還要一個條件,所謂「次第」。對我們來說,應我們的機,這個很重要的,應我們的機,很重要的!就是說我們的機如果是已經到了佛地了,他就現佛身來救我們;如果說我們大乘,他就以大乘的行者,然後大乘當中又有種種的差別;小乘,以小乘的。這個就是我們修學佛法過程當中的次第。那麼最上根利智的人,他以最圓滿的方法來接引他,所以佛出世的時候第一部說的是《華嚴》,那個是最圓滿的。可是這個時候,不要說我們根本完全不在那個地方,就算看看佛世時候的公案,大智如舍利弗坐在這個華嚴會上,聽《華嚴經》是如聾如啞,聽得不曉得他說些什麼東西,我想這個公案我們大家都知道。這一點,我們雖然信得過佛,可是不一定體會得到這個心情。我們現在不妨用一個眼前非常簡單的例子一說,我們就可以體會得到。 [01′40″]</p>
<p>   這一小段,大家還記得吧?師父說:佛法本身,除了如理、如量之外,還要一個條件,就提到了「次第」兩個字。這個次第,師父就接著說:「<p> 應我們的機<p> 」,說是很重要、很重要的! [02′00″]</p>
<p>   像在〈觀世音普門品〉裡邊也有說:「<p> 應以佛身得度者,即現佛身而為說法<p> 」,應以怎樣的身得度者,觀世音菩薩就現怎樣的身為他說法。師父說:「<p> 我們雖然信得過佛,可是不一定體會得到這個心情。<p> 」經典裡講說佛菩薩是怎樣應我們的機給我們說法的,會比喻成一個慈母的心。比如說一個非常非常愛護小孩的母親,在小孩嬰兒的時候給他吃什麼,從很小的小孩、小小孩到稍稍大一點,她會不停地調整他的食譜,他的食物是一直在變化著的、變化著的。為什麼呢?因為慈母疼愛著這個幼兒,雖然很想把世界上所有好吃的都給他吃,但是他沒長牙的時候,你是不能給他吃很多東西的。 [02′55″]</p>
<p>   所以,在提到應機的這個問題上,會很感念佛菩薩的恩德。佛菩薩體恤我們在生死中的這種痛苦,在學習佛法這條路上還是剛剛起步,就像嬰兒和小孩一樣,所以他要給我們調治出什麼樣的法味才是適合我們的次第、應我們的機的呢?比如說師父為什麼會選擇用這樣的方式來講《廣論》?師父的日記完全不是這種風格,很顯然師父寫日記的時候是他自己習慣的一種風格,就是半古文式的,而且文字非常地簡潔,有的時候就兩個字,比如說「共勉」,還有「以此為戒」。但是在講《廣論》,師父所採用的方式就是非常長篇的,給我們講故事啊,會講得特別特別耐心。當時有一些同學開始聽師父的帶子的時候,會認為師父就是這種風格。其實師父應該不是這種風格的,他的日記應該才是他的風格。 [03′58″]</p>
<p>   師父的日記是不給別人看的。像有一天,我早晨去禮拜師父,給師父磕頭,但師父通常都不讓磕頭。去敲門,師父說:「進來!」然後我就進去。進去之後,發現師父坐在桌前寫日記,我就走過去說:「師父,您寫日記哪!」然後師父就用手把他寫的日記都蓋起來。我就說:「師父,可不可以給我看一下?」師父說:「日記不能給人家看,因為日記力求真實,這是寫給自己的。」然後我在師父旁邊說:「師父,那我看一行,行不行呢?」後來師父就用書把上面擋上了、下面也擋上了,就留出那一行字給我看了一眼。我看完了之後,師父當時對我說了一句話,他說:「你不要急,這些都是你的!」當時我沒太留心這句話,只是很注意看那一行字到底是寫什麼、很著急,因為師父上面也擋著、下面也擋著,我害怕讓師父擋久了,我就迅速地看了一眼,其實看完了,現在我都不記得了。 [04′57″]</p>
<p>   為什麼講到了這一點呢?師父為了我們這些漢族的弟子能夠在心裡無礙地接受文殊的教法,其實他是想了很多很多辦法的,包括想了一個他可能不是很習慣說法的方式,就是為了應我們的機,他用這種方式講。結果一講呢,很多人就對《廣論》開始產生好樂心了,甚至是相見恨晚,甚至十幾年、二十年、三十年,就是這樣子專心地學《廣論》,這都源於師父當時對我們那個善巧的接引。一旦沒有這樣的方式給我們講,怎麼可能這麼多居士會發心學這樣一部論呢!而且學完了之後,還會發心學很多論,因為《廣論》裡有很多經典。 [05′42″]</p>
<p>   所以師父對於這點,他說:關於這種心情啊,不一定能體會得到。就是母親對孩子的心,孩子是否能體會得到呢?可能很多時候是體會不到的。但是母親不會因為孩子體會不到,就不用這樣的心去對孩子;正因為體會不到,她會更加善巧地想各種辦法,來教導這個小孩成長。這真是佛菩薩的悲心所在啊! [06′10″]</p>
<p>   好!現在我們來聽下一段。<p>   譬如今天我們坐在這個地方,大家研究這部《廣論》。不一定啦!就是不妨說最起勁、最高興的一部論,我們大家每一個人,啊!聽的也好,講的也好,歡喜得不得了!假定說現在帶一個其他的不相干的人來,他跟佛法不相應,坐在那個地方的啊,他聽得是一點味道都沒有,唉呀!不曉得你說些什麼東西。這是一種例子。那麼更另外一個例子,譬如說今天是有一個很大的宴會場合,這個宴會場合有很多大人物出現,各式各樣的大人物出現,我們有機會去參加。結果我們如果說帶一個小弟弟,或者帶一個小孩子去,那個小孩子去了以後,如果回來的時候你問他:「欸!今天你參加了一個盛大的宴會,你看見了什麼啊?」他說不定會說看見巧克力糖。「還有沒有啊?」看不見,不曉得看見什麼,那些陌生人不曉得什麼!可是另外人就看見:哎喲!當代第一類的這個大政治家、大學者發表了不起的言論,哇,覺得這不得了!這我想我們都有這個經驗吧!那為什麼原因?下面這個才是真正重要的。 [07′36″]</p>
<p>   上一講師父講了應機,從佛菩薩的那一面,佛菩薩一定想應我們的機;但是從學的人的角度,可能很難體會這種心情。所以師父為了讓我們體會一下,從我們學的角度怎麼樣去體會這個機的問題,然後師父講了這個故事。這個故事分兩個:一個是在討論我們特別喜歡的論的時候,一個不相干的人,他沒有學過,進來聽的時候一點味道都沒有,因為他不知道在說什麼,完全不了解、沒有興趣! [08′12″]</p>
<p>   後面的例子就很生動了,這可能大家都有體會。比如說你特別特別小的時候,去參加一個宴會,那只注重什麼呢?小孩最注重的應該就是吃的。小朋友可能都會去過宴會吧!像我小的時候也去過,我是被安排到小孩兒那一桌,那一桌全是孩子,可能二十個孩子、三十個孩子在一起。小孩在一起幹什麼呢?比如說菜上齊了之後,大概小孩都是喜歡吃丸子吧,很快就被吃光了。有一些小孩可能夾不到菜就自己哭了,因為喜歡吃的這一盤很快就什麼都沒有了。小孩哭了的時候,大人就過來管我們。 [08′52″]</p>
<p>   然後有幾個大人發現我的碗裡是空的,因為菜太遠就夾不到了,等到我去夾的時候就不見了,所以就沒吃到什麼。結果有一個阿姨就對我非常好,把我抱到大人那一桌,給我碗裡夾菜。我的習慣是先把不喜歡吃的吃了,然後把好的留在後面。這個阿姨就給我夾了一個菜,我是不太喜歡吃的,所以她夾完之後,我就先把那上面吃了。阿姨一看我把它吃了,立刻又把那個菜再給我夾一遍;我又把它吃了,然後她再夾一遍;我又吃了……其實我不喜歡吃那個,因為我想把不好吃的先吃了。結果那個阿姨以為我是另一種類型的,就是先把好吃的吃了,所以那一天我整場都在吃不喜歡吃的東西,但是我也沒講,反正那一餐飯就那樣過了。 [09′43″]</p>
<p>   你看!我也是參加了一個很大的宴會哦!我就只記得那個阿姨一直給我夾一個我不喜歡吃的,我吃了很多我不喜歡吃的東西,我喜歡吃的就一直蓋在碗底,都被阿姨新夾的東西蓋住。你看我就記住了這件事情,這麼大了還記住這件事情,可見小的時候對吃的真的是很在意。 [10′05″]</p>
<p>   師父用這個故事來點出應機的這件事。其實「應機」就是你注意的點是什麼,你有沒有特別在乎的那件事,那件事可能就是佛菩薩會點撥我們的一件事情,就是你曾經對這件事很強烈地串習的。 [10′24″]</p>
<p>   所以在這一小段,師父提出了一個問題,說:為什麼那些大人物、大學者,發表了了不起的言論我們都沒在意,我們只看到了巧克力,為什麼呢?這用小孩的故事講了一個觀察點的問題,就是在乎的點,為什麼你會在乎這個呢?當然一個孩子為什麼在乎?因為他小,好像理由就沒了。但是涉及到機的時候,我們就會思考:為什麼我只相應這個,他只相應那個、他又相應那個呢?師父在教我們探索這個問題。 [10′59″]
<p>   好!那再聽到底為什麼呢?聽聽師父解釋下一段。<p>   《華嚴》上面說得很清楚,就是我們在因地當中啊,是本來沒有對這件事情認真地修行過。為什麼不修行?因為你一開始的時候你沒有這個好樂心,你也不往這個裡邊去深入,這個我們心目當中不相應,為了說明這個,所以我剛才說那個公案。反過來說,譬如說我們現在,假定說你出家了,久修上座,那我們就今天早上我們討論我們吃的問題,就很有趣!有的人是偏向於這方面,可是反過來另外有一種人,他就覺得:啊,這個東西都是妄分別,是越簡單是越好;有很多人啊,的的確確剛開始他不習慣,總希望多一點,那意見差得十萬八千里。所以說,如果說非常簡單的,一看見了很豐富的內容啊,他看了覺得頭痛,不曉得選哪一個好?好,隨便有一點算了!這個就是說,各人自己喜好習性所使,這樣。 [01′25″]</p>
<p>   所以師父又舉了《華嚴經》,說我們在因地當中,本來對這件事上沒有認真地修行過。為什麼沒有認真修行過呀?因為一開始的時候就沒有這個好樂心,所以他沒興趣;沒興趣,怎麼可能在這件事深入呢?就沒法深入。那麼這一生,我們對某些事情有興趣,是哪來的呢?很顯然是串習來的,因為我們的生命是一個生生相續的過程。師父在這裡邊讓我們觀察:我們自己對什麼比較好樂、對什麼不好樂?如果對一件事情不好樂,而那件事情恰恰是我們應該學習的話,可能就要培養自己的歡喜心。  [02′09″]</p>
<p>   接著師父又舉了一個例子,說是在討論食物到底要怎樣才比較好,有的人就希望多一點,有的希望簡單一點。比如說在我們好幾百人的僧團,有年輕的、有年長的法師們。年輕的法師們可能就喜歡吃鹹一點啊、油一點,然後年長的法師——其實說到年長的法師,我們僧團三十多歲的法師都就比較年長了——他們常常說:「唉!我已經是一個老僧人了,要注意一下,要吃一點少油、少鹽的。這個身體還要用來弘揚佛法,要修行的!」可是小孩子可能就會喜歡吃甜的呀!所以在討論甜的、鹹的、油的,和少油、少鹽這個比例問題。 [02′52″]</p>
<p>   但是在討論的時候,我們往往特別相應於哪一點的,就會對哪一點特別執著。你看師父用一個笑著的方式,他會覺得:欸!這個都很自然的,因為你相應多的、相應少的,都很自然的,就顯示出你的習慣。師父對這一切好像在欣賞一樣,沒有捲入這個風暴,是在欣賞。為什麼呢?因為在觀察我們的根性,看我們各自的習氣。 [03′18″]</p>
<p>   在一場討論會中,其實你很容易就會看到大家的喜好,看到他的習氣。看到他的習氣幹什麼呢?不是討厭他或者喜歡他,而是看看用怎樣的次第來引導有這種習慣的修行者,才會讓他少受一點苦,然後很快地學習到。 [03′39″]</p>
<p>   最後這一段,就是由師父笑著在說,在研究到底是多一點、還是少一點的食物比較好的這個問題上,可以看到師父對我們的歡喜心吧!師父以前都說鳳山寺所有的法師都在他眼前。他坐在他的佛堂裡想一想,所有鳳山寺的法師都在他的心裡。然後我也在師父的日記裡看到師父對法師們會稱為「子啊、子啊」,很親切的一個稱呼。 [04′12″]</p>
<p>   我們會想:師父喜歡我們嗎?在菩薩的一個功德裡,說:「接引有情如大賓」。像最尊貴的客人一樣,佛菩薩對有情是這種心思、是非常地歡喜他的。為什麼呢?就像一個母親喜歡他的獨一愛子一般,這樣地欣賞著這個孩子。比如說有的人到善知識面前不願意講話、不願意提問題,為什麼?說:「我這問題太笨了吧!」其實你不用擔心善知識會嫌棄自己,對我們顯現的各種習慣、各種喜好不同,他其實就像母親養育我們一樣,就是怕我們營養不良啊、怕怎樣怎樣,會調配很多法的食物,讓我們這個法身慧命好好地成長。 [04′59″]</p>
<p>   我也看到師父在開會的時候,跟一些居士討論法人事業,那時候師父也會聽很多居士報告。一些居士的報告其實滿長的,但師父都非常歡喜地聽每一個細節。對法人事業呀、對園區啊、對我們在各個道次第上、在各個領域中努力的這些弟子們,師父他的眼中還有他的教誨中流露出那種滿滿地歡喜、滿滿地讚歎。有的時候做對了,師父說:「哎呀,謝謝你!謝謝你!」師父說「謝謝你」的時候,非常地有力、非常地熱忱。直到現在,師父那種燦爛的笑容和那種有力的承許,還是我們生命中一股強大的、精進的力量。 [05′43″]</p>
<p>   這一小段,師父是從學的角度讓我們體會一下,自己為什麼會是這樣的機、那樣的機,喜歡這個、不喜歡那個。但是如果是放在整個道次第上的話,會發現對某一種法類,我們就很容易想;對某一些法類就覺得:欸!找不到感覺。這就是對某一些法類過去生沒有好好地修行,所以正是要在那個法類上好好地用功。但是卻偏偏是自己喜好的,就拼命鑽進去;對於那種不足的,有的時候就避開了它。在一向連貫的道次第中,我們是一定要拾級而上、次第而上,不可能跳過自己的那個次第。 [06′23″]</p>
<p>   所以在善知識的指導下,能夠面對自己修行的難點、困境或者不解的地方。跟著善知識好好地聽、好好地探索,有了《菩提道次第》之後,不管是什麼樣的機,都可以在《菩提道次第》中找到自己的次第。而且最初善知識們都說,一定要從最初的道次第一起往上走,無論是中根的、利根的,還有屬於普通根的,都可以一起進步。所以像一條大河,這條大河養育了你、我。感恩師父! [07′01″]
<p>   好!我們再聽下面一小段。<p>   因為這樣的關係,所以就顯出不同的次第,拿我們來說我們的根性,就是這樣。所以當越到後來教化那個教法的時候,自然而然演變分化成功這麼多的次第,這我們要了解的。所以譬如像《法華》上面講,不管任何情況你接觸到了一點佛法,最後都成佛,可是的確你進來的有你相應的路子,有很多是智慧入,有很多是以慈悲方便入。 [00′42″]</p>
<p>   好!剛才這一小段,師父有強調:為什麼會有這麼多不同的次第?因為我們的根性不一樣,自然分化出這麼多的次第。師父接著說:我們要了解的,就像《法華》上面講的,不管任何情況下接觸到一點佛法,最後都成佛。我曾在師父的日記中,看到師父有抄《妙法蓮華經》,有這樣幾個偈子,它是在《妙法蓮華經卷一.方便品》說:「<p> 佛自住大乘,如其所得法,定慧力莊嚴,以此度眾生。<p> 」「<p> 乃至童子戲,聚沙為佛塔,如是諸人等,皆已成佛道。<p> 」後面還有一段寫:「<p> 於諸過去佛,在世或滅度,若有聞是法,皆已成佛道。<p> 」 [01′50″]</p>
<p>   這一段《法華經》就說:就像一個小孩子,他為了遊戲,用沙子做了一個佛塔,這樣都會成佛道。所以,我們對於佛法稍稍接觸到那麼一點點,在其中做了一點善根的話,就會有將來成佛的因緣,或者有人以此就成佛了。你說他的次第是從什麼地方開始的呢?他就是從一個小孩做遊戲開始。像前幾天這邊下大雪,有的小朋友就用雪堆了一個佛塔。當時我就想到:啊!聚沙為塔的童子戲也可以成佛。他用那個白雪做了一個白色的塔,還很大。所以每個人在佛法裡種善根,或者從什麼樣的次第開始契入,都是不一樣的;但就像百川歸為大海,最後都會成就佛道,所以這是非常非常有希望的一條路。 [02′54″]</p>
<p>   師父在這裡邊說:一開始接觸,到最後都成佛,但是的確有各自相應的路子,有很多是智慧入,有很多是以慈悲入。師父非常重視誦《般若經》,師父每天必誦《般若》!不論飛到哪裡也都帶著《般若經》,他在很累的時候,甚至生病的時候,都是堅持誦《般若經》從來不間斷的。據說宗大師也是這樣的,現在我們團體裡也有很多人堅持誦《般若經》。 [03′25″]</p>
<p>   在《大般若經》的第二分,有一個〈經文品第三十六之一〉,這裡邊我講一小段天帝釋跟佛陀的對話。其實《般若經》是很親切的,它都是寫了佛陀的弟子們跟佛陀的對話,就像師生問問題,比如說學生問問題、老師回答,是一個探討真理的過程。 [03′50″]</p>
<p>   在《般若經》這裡邊說:「<p> 爾時,佛告天帝釋言:憍尸迦!若善男子、善女人等教贍部洲諸有情類,皆令安住十善業道,於意云何?是善男子、善女人等由此因緣得福多不?天帝釋言:甚多!世尊!甚多!善逝!<p> 」佛就跟天帝釋說:「<p> 憍尸迦<p> 」——是天帝釋的名字,這個是從梵語翻譯過來的,梵語是「Kauśika」。然後說:「<p> 若善男子、善女人<p> 」,注意喔!佛陀稱他的弟子都是說善男子、善女人。說:「<p> 教贍部洲有情類<p> 」,為什麼叫贍部洲?就是有一棵贍部樹。這些有情有多少呢?是無量無邊喔!說:「<p> 皆令安住十善業道<p> 」,他們都住於十善業道了。然後說:「你的看法如何呀?這樣的善男子、善女人,因為教贍部洲有情類安住於十善業道的原因,他們所積的福報多不多呀?」天帝釋就回答說:「<p> 甚多!<p> 」「哎呀,太多了!非常多呀、非常多!佛陀,這是非常多的!」 [05′05″]</p>
<p>   接下來在經典上這樣寫:「<p> 佛言:憍尸迦!若善男子、善女人等,書寫如是甚深般若波羅蜜多,施他讀誦,若轉書寫廣令流布,是善男子、善女人等,所獲福聚甚多於前。何以故?憍尸迦!如是般若波羅蜜多祕密藏中,廣說一切無漏之法。<p> 」然後佛說什麼呢?佛說:「<p> 憍尸迦!若善男子、善女人等<p> 」如果「<p> 書寫<p> 」,就是抄《般若經》,抄完了之後「<p> 施他讀誦<p> 」,把這個抄的經送給別人,讓別人開始讀誦《般若經》。還有「<p> 若轉書寫<p> 」,然後又請別人再抄,這樣地「<p> 廣令流布<p> 」,就是你抄完了給別人讀、讀完了再抄、抄完了再讀,廣令流布。這樣的善男子、善女人所獲的福聚,比之前那個令南贍部洲的有情都安住於十善業道這樣的福,「<p> 甚多於前<p> 」,就是多非常多、非常多、非常多!注意哦!抄經送給別人、請別人讀,然後又抄經、又讀......,就是這樣的一個善業,比教無量無邊的有情安住於十善業道要多那麼多的福報! [06′33″]</p>
<p>   然後佛陀就說:「憍尸迦,這是為什麼?」佛陀自己回答了。不知道天帝釋會不會回答,總之佛陀自己回答了。佛陀說:「<p> 如是般若波羅蜜多祕密藏中,廣說一切無漏之法,諸善男子、善女人等於中已學今學當學。或有已入今入當入聲聞乘法正性離生,漸次乃至已正當得阿羅漢果;或有已入今入當入獨覺乘法正性離生,漸次乃至已正當證獨覺菩提;或有已入今入當入菩薩乘法正性離生,漸次修行諸菩薩行,已證今證當證無上正等菩提。<p> 」 [07′26″]</p>
<p>   佛陀是怎麼回答的呢?佛陀說:「為什麼抄《般若經》,然後送給別人讀,然後再抄、再讀,廣令流布的善男子、善女人所做的福報,比令贍部洲的人安住於十善業的福報還多那麼多,這是為什麼?」說:「憍尸迦,因為這樣的般若波羅蜜多祕密藏中,它有一切無漏之法。」一切無漏之法都是什麼法呢?這些善男子、善女人於這個當中,已經學的、正在學的、將要學的,或者有已入、今入、當入聲聞乘法的正性離生,就是聲聞乘的見道——預流果吧!然後漸次乃至他進入阿羅漢果,這都包括喔!還有獨覺乘法的現證空性,還有已證獨覺菩提。還有什麼?菩薩乘法的登地,就是現證空性,然後「<p> 漸次修行諸菩薩行,乃至已證、今證、當證無上正等菩提<p> 」。這裡邊包含了三乘所有的妙法,令一個補特伽羅成佛所有的這樣的無漏之法,所以《般若經》才如此地殊勝! [08′41″]</p>
<p>   大家現在看完這一段之後,你們會不會想:啊,那這樣的無漏之法到底是一些什麼法?所以佛陀就自己回答了。其實你看《般若經》的時候,你會想問一個問題;然後問完問題,佛陀就在下面答。雖然你沒在般若的法會裡面,在讀《般若經》的時候,讀著、讀著你就會發現,佛陀好像知道我們現在的人讀《般若經》心裡會有什麼問題。當你問一個,佛陀就回答。 [09′07″]</p>
<p>   你看!佛陀就說了:「<p> 憍尸迦!云何名為無漏之法?<p> 」什麼是無漏之法?然後佛陀就說:「<p> 謂四念住乃至八聖道支、四聖諦智、三解脫門、內空乃至無性自性空、如來十力、四無所畏、四無礙解、大慈、大悲、大喜、大捨、十八佛不共法及餘無量無邊佛法,皆是此中所說一切無漏之法。<p> 」看看《般若經》裡包含了這麼多的法!大家都知道我們在學習教典的時候,會把這些法到底是什麼一個一個地解釋出來。 [09′44″]</p>
<p>   師父非常非常歡喜我們能夠讀誦《般若》。你看!它所累積的資糧哦,是這麼廣大!所以我們都定期有誦《般若經》的法會,而且聽說有一些居士也發願讀誦《般若》。大家如果有發願讀誦《般若》的,還是要繼續讀誦下去;如果沒有發願的,也可以發願讀誦《般若》。 [10′07″]
<p>   在解釋了什麼是無漏之法之後,佛陀接著又講。在《般若經》上的原文說:「<p> 憍尸迦!若善男子、善女人等,教一有情住預流果,所獲福聚,猶勝教化一贍部洲諸有情類,皆令安住十善業道。何以故?憍尸迦!諸有安住十善業道,不免地獄、傍生、鬼趣。若有安住預流果者,便得永脫三惡趣故,況教令住一來、不還、阿羅漢果、獨覺菩提,所獲福聚而不勝彼?<p> 」 [00′48″]</p>
<p>   這一段是說:如果一個善男子或者善女人教一個有情住在預流果,他教一個有情住預流果的這個福報啊,勝過教化一贍部洲的有情都安住十善業道。注意喔!這個人數是差得太懸殊了,他教一個有情住預流果所獲的福報,比教贍部洲所有的有情都安住在十善業道的福報還大! [01′16″]</p>
<p>   那我們的問題依然是:「為什麼?」佛陀又親切地呼喚他弟子的名字,說:「憍尸迦,這些安住於十善業道的有情,不一定能免掉地獄、傍生、餓鬼,不一定能免除三惡趣。但是一旦一個有情安住預流果,便得永脫三惡趣!」就是他永遠脫離了三惡趣。注意喔!教一個有情永遠脫離三惡趣的這樣一個福報,大於教化一贍部洲的有情安住於十善業道。佛陀又接著說:「<p> 況教令住一來......<p> 」教一個有情住預流果就這樣了,何況你教一個有情安住於一來,還有不還、阿羅漢果,還有獨覺菩提所獲的福聚而不勝彼呢?就更勝於他了!這又是一個譬喻。 [02′09″]</p>
<p>   說:「<p> 若善男子、善女人等,教贍部洲諸有情類皆住<p> 」都住於「<p> 預流、一來、不還、阿羅漢果、獨覺菩提。<p> 」這個譬喻又大了喔!就是教贍部洲所有的有情都住在預流、一來、不還、阿羅漢、獨覺菩提,這是很大很大的不可思議的福報!「<p> 不如有人教一有情,令趣無上正等菩提。<p> 」不如教一個有情發菩提心。 [02′35″]</p>
<p>   接著問題又來了,為什麼呢?「<p> 何以故?憍尸迦!<p> 」佛陀又呼喚他弟子的名字,說:「<p> 若教有情令趣無上正等菩提,則令世間佛眼不斷。所以者何?<p> 」為什麼呢?「<p> 由有菩薩摩訶薩故,便有預流、一來、不還、阿羅漢果、獨覺菩提;由有菩薩摩訶薩故,便有如來、應、正等覺轉妙法輪度無量眾。<p> 」說:為什麼呢?教一個有情發了菩提心,他可以勝過教所有贍部洲的有情都住於預流、一來、不還、阿羅漢果這麼大的善根,是為什麼呀?說:首先「<p> 令世間佛眼不斷<p> 」。為什麼呢?因為有菩薩的緣故,就會有預流、一來、不還、阿羅漢果、獨覺菩提;因為有菩薩的緣故,就會有如來、應、正等覺轉妙法輪度無量眾,這些都是從菩薩出生的。所以一個人發了菩提心,有那麼大、那麼大的福報! [03′38″]</p>
<p>   「<p> 諸菩薩摩訶薩,皆依般若波羅蜜多而得成就。以是故,憍尸迦!若善男子、善女人等,書寫如是甚深般若波羅蜜多,施他讀誦,若轉書寫廣令流布,所獲福聚,勝前福聚無量無邊。<p> 」這個譬喻是說什麼呢?那個令有情發菩提心的福報勝過那麼多,那麼如果書寫般若波羅蜜多的人,然後書寫了又轉他讀誦、轉他書寫、廣令流布,這樣的善根勝於什麼?令有情發菩提心。這是不可思議的喔!這是不可思議的! [04′17″]</p>
<p>   說:「<p> 何以故?<p> 」為什麼呢?佛陀又呼喚了弟子的名字:「<p> 憍尸迦!如是般若波羅蜜多祕密藏中,廣說一切世、出世間勝妙善法。依此善法,世間便有剎帝利大族、婆羅門大族、長者大族、居士大族、四大王眾天,乃至非想非非想處天,亦有四念住廣說乃至一切相智施設可得,亦有預流、一來、不還、阿羅漢、獨覺、菩薩摩訶薩、諸佛世尊施設可得。<p> 」說:為什麼抄《般若經》,令他讀誦,然後轉抄、轉令讀誦、廣令流布會有這麼大的功德?佛陀說:「因為般若波羅蜜多的祕密藏,廣說一切世間、出世間的善妙法,依這個善法能出生一切,比如剎帝利大族等等,還有菩薩,還有各各天、阿羅漢,甚至諸佛世尊,才能夠施設出來。」 [05′15″]</p>
<p>   這一小段的譬喻就很令我們震驚了,但是不知道平常大家誦《般若經》的時候,有沒有細細地去琢磨一下,甚至把它用白板列一下。我們透過對比的方式,看看這個抄《般若經》,抄完了之後給別人誦,誦完了再抄、再誦,廣令流布,這樣的一個善根到底有多大?這是才比到這兒,還沒比完呢!後面還有很多還沒比完。上述所講的,是佛陀給我們展示的一種比喻的方式,怎麼樣去了解善男子、善女人書寫了《般若經》,又轉給他讀誦,然後又轉書寫、轉讀誦、廣令流布,這樣的功德有多大。上面是一個方式。 [06′03″]</p>
<p>   下面佛陀又再開顯了一個方式,這個方式一開始是說:「<p> 復次,憍尸迦!置贍部洲諸有情類。若善男子、善女人等,教四大洲諸有情類,皆令安住十善業道,於意云何?是善男子、善女人等,由此因緣得福多不?天帝釋言:甚多!世尊!甚多!善逝!佛言:憍尸迦!若善男子、善女人等,書寫如是甚深般若波羅蜜多,施他讀誦,若轉書寫廣令流布,是善男子、善女人等,所獲福聚甚多於前,餘如上說。<p> 」 [06′38″]</p>
<p>   這邊是說什麼呢?先放著贍部洲的有情不說,接著換多少有情了?四大洲的有情,四大洲的有情,都教化他們。你想想,我們教一個有情,讓他住於十善業道多費力氣呀!這是教四大洲的有情喔,都獲十善業道了。可是,還不如善男子、善女人抄《般若經》,送給他讀誦,然後轉書寫、轉抄、轉讀誦,這樣地廣令流布,福報不如這個多喔! [07′12″]</p>
<p>   現在已經變四大洲,接下來在《般若經》裡邊,佛陀又說先放著四大洲不說,先說小千世界有情,也令他們安住於十善業道。又問憍尸迦說:「這個功德多不多呢?」憍尸迦說:「哎呀!很多、很多了!佛陀,很多、很多了!」然後佛陀說:「還不如他抄《般若經》,轉給他讀誦,然後又抄、廣令流布,不如這個功德大!」 [07′33″]</p>
<p>   憍尸迦肯定說:「哇,那個功德太大了!」然後佛陀說:「先放著小千世界不說,先說中千世界......」就這樣譬喻下去。然後說:「先放著中千世界不說,先進入大千世界。」當然這中間都有憍尸迦說:「啊!甚多、甚多!真多、真多!」然後佛陀都說:「這還是不如一個有情書寫《般若》、施他讀誦,然後再書寫、廣令流布,福報不如這個多喔!」這樣譬喻下去了。然後放著三千大千世界先別說,說十方各如殑伽沙等世界;然後放著十方各如殑伽沙等世界不說,再說十方一切世界的有情,全部安住於十善業道。這個已經很難想像了,因為有情是無量無邊的,所有的無量無邊的有情都住於十善業道了。 [08′17″]</p>
<p>   我們想像說:啊!會有那一天嗎?但是佛陀在經典裡就做這樣的譬喻,就是這麼大、這麼大的善根!然後又問憍尸迦說:「功德多不?」那我們想像一下,我們如果跟憍尸迦這個天王在一起,說:「哇!那太多了!佛陀,這不可思議的功德!」結果佛陀說什麼?「<p> 佛言:憍尸迦!若善男子、善女人等,書寫如是甚深般若波羅蜜多,施他讀誦,若轉書寫廣令流布,是善男子、善女人等,所獲福聚甚多於前。<p> 」比那個還多! [08′52″]
<p>   上述的一種譬喻講完了之後已經夠震撼的,我們已經說了很多種不可思議了。然後佛陀又比喻了,佛陀說:「<p> 復次,憍尸迦!若善男子、善女人等,教贍部洲諸有情類,皆令安住四靜慮、四無量、四無色定、五神通,於意云何?是善男子、善女人等,由此因緣得福多不?天帝釋言:甚多!世尊!甚多!善逝!<p> 」佛陀又說:「憍尸迦呀,如果這個善男子、善女人教贍部洲的有情,讓他們住在哪呢?四靜慮喔!修定。然後四無量、四無色定喔!而且獲得了五神通。五神通有什麼通呀?天眼通、天耳通、神足通、他心通、宿命通,就差了一個漏盡通了。這五通一得到,一般都說仙人,像神仙一樣了! [01′01″]</p>
<p>   注意!都得到這個五通喔!而且是贍部洲的人都得了,你教了贍部洲人都會上天遁地,都會飛了,那是不可思議的,全成神仙了!我們不用有交通工具了,飛哪兒都可以,也不用輪船了,就都可以了。做了這麼大的一個善行,夠大了吧!天帝釋也讚歎說:「哇!這太多、太多了!哎呀,佛陀,這功德太大了!」然後佛陀又說:「如果善男子、善女人書寫了這個甚深般若波羅蜜多,施他、讓他讀,或者轉書寫廣令流布,這樣的福德喔,甚多於前。」比剛才這個例子多很多! [01′39″]</p>
<p>   接著又出現了,說先放著贍部洲的人不說,先說四大洲的,然後往上增——小千世界的、中千世界的、三千大千世界的、十方各如殑伽沙等世界的;然後再放著不說,說十方一切世界的有情,都令安住四靜慮、四無色定、四無量、五神通,教所有的十方世界的一切有情,都得到了這樣的功德。說:「<p> 是善男子、善女人<p> 」,這樣的善男子或善女人,「<p> 由此因緣得福多不?<p> 」佛陀又問天帝釋說:「如果辦成了這麼大的事情,一切世界的有情都飛天遁地,什麼五神通全獲得了,這所有的有情都獲得了,那功德夠大的吧!」天帝釋說:「<p> 甚多!<p> 」那很多、很多、很多了,那太多了! [02′28″]</p>
<p>   然後佛陀又說:「<p> 若善男子、善女人等,書寫如是甚深般若波羅蜜多,施他讀誦,若轉書寫廣令流布,是善男子、善女人等,所獲福聚甚多於前。<p> 」儘管是這樣,這個善男子、善女人教化了十方一切諸有情類,都令他們安住四靜慮、四無色定、四無量、五神通,還不如這個抄《般若經》,給別人這樣讀誦,然後再抄、再讀誦,廣令流布,不如這樣的功德大。這樣的功德,比之前我們上述的功德要怎樣?甚多於前!比那個功德多好多、好多,非常之多! [03′09″]</p>
<p>   這是佛陀在〈經文品〉中,對比了抄寫《般若經》,然後把它送給別人讀、再抄寫、廣令流布這樣的功德,跟各種比。大家可以想一想,也唯佛能做這樣的譬喻,他能夠徹底了知眾生做何種業、何種善行、有多少善根、有多少功德,他可以用他遍智的心,清晰地計算、完全無有錯謬地計算。這是一個不可思議的譬喻啊!很難以想像這樣的善根,居然是由於抄寫《般若經》,再送給別人讀,然後再抄寫、廣令流布,由這樣的一個善根,大這麼多、這麼多,很難想像的! [03′52″]</p>
<p>   別小看修那個四靜慮呀!現在我們大家都知道,修個九住心都是很困難的。因為我們的散亂,現在尤其是在一個高科技的時代,大家迷惑於各種影像啊、聲音啊,能把心向內觀照、向內駐守,然後再安住於一個善所緣上產生輕安,到產生這種四靜慮,他所費的苦心是很深的,要花很深的苦功夫喔!而且再由於修定,得到了五神通,這不是一般用功的人啊!這麼用功的人這麼多、這麼多,他所獲得的功德是不可思議地多,居然還不比那個抄《般若經》、送給人讀、廣令流布的功德大! [04′39″]</p>
<p>   然後說十方一切世界的有情,就是所有的有情,也可以想像都端坐在自己的安樂坐墊上,他們全部用七支坐的方式端坐在那裡。大家都知道修定的時候,要去除散亂和昏沉,光是對治散亂和昏沉,很多人就要奮鬥好久。而且有些人在沒有聽聞〈奢摩他〉和〈毗缽舍那〉教授的時候,還不知道如何修定,還不知道找善所緣,就坐在那裡空坐,或者說享受一點身體的愉悅感,享受一點沒有胡思亂想就算了。但真正的修定,它是有非常詳盡、清晰、精確的解釋。比如說住分是多少,當你生起了住分的時候,你的明分是多少,如果明分不清楚的話,是不能算得定的。得定一定要輕安,輕安的話,明分一定要算進去。所以要詳盡地學習〈奢摩他〉、〈毗缽舍那〉的教授,才能夠得到上面所說的這些。 [05′40″]</p>
<p>   而且還生起了五神通,所有的有情都會飛天遁地,那個世界簡直是,應該比科幻還科幻的世界,所有的十方一切有情都變這樣了。居然還不如抄經,然後送給他讀,然後再抄、再送給他讀,廣令流布《般若經》。至於為什麼?佛陀已經在這裡邊解釋了。 [06′02″]</p>
<p>   當然上述對於〈經文品〉的這個對比,我只介紹了一少部分,只是就抄《般若經》然後送給他讀,然後再抄、廣令流布這樣的功德。後面這個〈經文品〉裡邊還有,說:「<p> 於此般若波羅蜜多,至心聽聞、受持、讀誦、精勤修學、如理思惟……<p> 」這樣的善男子、善女人所獲得的功德福聚又再比。還有就是「<p> 善男子、善女人等,於此般若波羅蜜多,以無量門廣為他說,宣示開演顯了解釋,分別義趣,令其易解,所獲福聚……<p> 」又是怎樣怎樣的,後面有輾轉增上這樣很多很多的譬喻,大家可以在《般若經》中自己去閱讀。我只是抽取其中的部分、一點點,讓大家感受一下,抄《般若經》,把它送給別人、讓他讀,然後再抄、廣令流布,就這一件他所做的功德是多大的。更不要說後面的! [07′12″]
<p>   我還在想:寺院要有一個抄經室,抄《般若經》,在那裡邊把紙筆備好,或者你自己帶你自己喜歡的鋼筆。像前一段時間聽到一個居士他在抄《般若經》,已經連續抄好幾年了。抄經的時候,他說他覺得非常非常地歡喜!他家人說:「他抄經的時候,就一動不動地坐在那個桌子前,有的時候一抄抄好幾個小時。」他自己說他抄經的時候覺得什麼雜念都沒有,只是一個字、一個字地抄。他說他就是喜歡抄,抄的時候覺得高興極了!當時有看到他抄的經典,一行、一行的,是豎版的,非常地整齊,一個勾掉的字都沒有。他是在沒有格子的一個白紙上抄的,白紙黑字,真是莊嚴極了!他發願要把《般若經》全抄一遍,我非常非常地隨喜他,希望他能夠把它抄完。 [01′00″]</p>
<p>   你看!讀《般若經》、抄《般若經》,這也是一個契入佛法的緣起點,也可以說是相應的地方。有些人就非常非常歡喜抄經,有些人就非常非常歡喜讀經。像我們寺院裡的出家人進了寺院之後,因為寺院有五大論的學制,所以就很相應學五大論! [01′21″]</p>
<p>   五大論是以《現觀莊嚴》為主體的。《現觀莊嚴論》到底闡示了什麼呢?它就闡示了《般若經》的隱義現觀道次第。那麼隱義的現觀道次第到底是什麼呢?就是一個補特伽羅從最初開始發心修行,到最後成佛,所有的道次第都在這個《般若經》的隱義裡邊闡述。但是如果《現觀》不講的話,我們看《般若經》可能是無法看出來的。所以學《現觀莊嚴論》,才能知道《般若經》裡邊在講什麼。 [01′52″]</p>
<p>   像《釋量論》也是闡示了《現觀》的正理;《入中論》闡示了《現觀》的正見,就是《般若經》的顯義的空性道次第;《俱舍論》詳細地辨明《現觀》的這些名相;《戒論》就闡示了《現觀》的行持。也可以說五大論的學制,都是圍繞著如何學習《般若》、學習《現觀》展開的。出家人經年累月地持守戒律,以這樣的持守戒律之身,堅持這麼多年持續地聽聞、辯論、讀誦,當然也互相幫忙學習,都圍繞著學習《般若經》這樣的一個主軸,可以想像那會累積多麼可觀不可思議的資糧! [02′35″]</p>
<p>   我們看了這一段,也會想就是因為《般若經》中闡示了無漏之法,那麼抄經之後送給人家讀,然後再抄、再讀,廣令流布,就會比令贍部洲的所有的有情都安住於十善業道這樣的福報大那麼多、那麼多。 [02′55″]</p>
<p>   到底是為什麼變那麼大的?我也曾經用這樣的問題問過上師。《入中論》闡示了《現觀》的正見,它是《般若經》的顯義空性次第。在聖天菩薩所著的《四百論》中說:「<p> 薄福於此法,雖疑亦不生,縱雖起疑惑,亦震撼三有。<p> 」沒有福報的有情啊,對於空性這樣的法,連疑惑都生不出一點點。那麼起疑惑的,可能是有福報的。說:「<p> 縱雖起疑惑<p> 」——哪怕對空性的正理產生一念合理的懷疑的話,也能撼動三有的根本!所以《般若經》就有這樣強悍的力量。你對這樣的道理去聽聞、思惟,乃至很多出家人上場去辯論,經年累月地在這樣的學習的續流之中,就算產生一念合理的對空性的懷疑,都能夠撼動三有輪廻的根本。所以可以想見這是非常稀有的善根力! [03′59″]</p>
<p>   所以大家如果有在讀誦、有在抄寫,乃至有學五大論的,無論是以在家身還是以出家身學習的,要對自己這樣的善根生起稀有的隨喜的心。不要覺得:「啊,我煩惱那麼多呀!學這些好像沒馬上地對治煩惱。」但是經典上可是這樣承許的哦!說哪怕產生一念合理的懷疑,都能夠撼動三有的根本喔!這是經典說的,應該是可以取信於心的。 [04′28″]</p>
<p>   無論我們對於佛陀的正理是從哪一個地方作為契入點,或者作為一個緣起能夠進入的話,《法華經》說都能夠成佛!那麼我們這一生現見的,師父開始推動我們誦《般若經》,五大論學制其實就是學習《般若經》顯義的空性次第,和隱義的現觀道次第。非常希望大家能夠努力地學習,並且好好地隨喜自己能夠值遇這樣的一個教法,不要輕易地放棄,不要覺得自己學習這些好像都沒什麼,因為經典裡不是這樣承許的。 [05′06″]</p>
<p>   如果再能自作、教他,比如你抄經、也令別人抄經,你讀、也告訴別人開始讀,廣令流布的話,我們所積累的善根啊,就比令贍部洲所有的有情都安住於十善業道那個福報要大得多啊! [05′22″]</p>
<p>   所以看起來是佛陀跟天帝釋講的,但是也是跟所有的弟子們講的。再想一下:在這一節中,師父給我們講的,就是佛菩薩慈悲地找到一個適應我們根機的路子讓我們趣入佛教,開始進入整個顯義道次第也好、隱義的也好,讓我們進入這個學程的學習,這是多麼值得慶幸的事情!大家千萬要好好珍惜自己的善根,珍惜自己對於教法的這種信心、對於《般若》的信心、對於師父這樣子講《菩提道次第廣論》建立的一個信心。這些都是非常稀有的因緣,大家要好好地努力下去! [06′03″]
<p>   大家好!又到了我們研討《廣論》的時間了!不知道最近大家有沒有努力地聞思修啊? [00′12″]</p>
<p>   前兩天有看到大家寫的聽全廣的回饋,其中看到一個居士說她要照顧生病的先生,又要照顧先生的媽媽,所以她自己就沒有辦法去廣論班,只能在家裡聽。因為有全廣的音檔,她覺得很高興,無論多忙、多累都可以堅持照顧兩個人。她說如果不堅持學法的話,可能她會非常地痛苦。 [00′49″]</p>
<p>   還有一個母親,很心疼她的女兒吧!說女兒回來了之後,整天在房間裡邊上網打遊戲,她很想衝進去教訓她,但是因為有聽全廣的原因,她決定還是忍耐一下。我比較建議去關注一下,因為是不是出了什麼問題、遇到了什麼困境,然後就開始把自己關在屋子裡整天這樣弄電腦。 [01′22″]</p>
<p>   還看到一個居士說,其實他和他父親有一個很深、很深的心結,大概是從小到大的一個心結。也是由於連續地聽全廣的原因,他說不知道為什麼他居然想開了!他小的時候覺得父親好像很嚴肅,感覺不到父親很關愛他的感覺,尤其是他生病、他咳嗽的時候。但是聽全廣之後,他突然覺得這一點他完全釋懷了,他說他也不知道是怎麼釋懷的。 [01′57″]</p>
<p>   我們生命中有一些大大、小小過不去的溝溝坎坎,其實跟別人講、去傾訴,有的時候會變好,有的時候你再想一遍還變嚴重。但是那個心結到底怎麼去打開呢?一個心事纏繞自己十幾年,就是放不下、就是想不開,道理都懂,但是就是想不開。這個時候如果去學《廣論》或者是聽法,然後在某一天的某一個時刻,你突然覺得那件事在心裡鬆動了,甚至從此你覺得這件事不會一直縈繞在自己的腦海裡邊,不會再發毒素影響著每天的生活,它真的是過去了,然後我們也真的是放下了。 [02′49″]</p>
<p>   這個過程到底是怎麼發生的呢?常常有人說:「其實我不知道,我就是在那一刻突然覺得我放下了、我想開了!」我們會認為:是因為我聽全廣,得到師父的加持,慧力增加了,有的時候是心裡生了一點善念或者慈悲心,突然把這一切看清了。總之,在我們的生命中,如果能夠常常、甚至每天都留出一段時間來聽法,因為在聽法的時候,我們要屬意讓自己專注,所以就會把平常的那個續流切斷,專門這段時間面對經典、面對善知識的教言,開始專注地聽聞。其實這個時候,你想也想不開的那件事就沒想了。一旦我們運用所聽聞的教理,甚至在聽聞的時候感受到師父的慈悲、感受到諸佛菩薩的加持,某一個時刻就突然釋懷。所以這也是解決人類痛苦的一種方式——似乎是沒有針對那件事一直討論、好像條分縷析地這樣去分析,但是不知道為什麼,像有些人去拜見師父,出來之後他覺得一些痛苦的事情就放下了。這是一個很奇妙的經驗。 [04′13″]</p>
<p>   在廣論班裡我也看到了很多很多居士的生命中,都發生著這樣的經驗。很希望大家能堅持學下去,如果有狀況不能進班裡的,那在家裡邊堅持學;如果能去一起學的就一起學,一定會對我們的生命產生很大很大的饒益。經年累月,我們慢慢地會學會:當我心裡有痛苦的時候,我會去緣念法、緣念佛菩薩、緣念著善知識;一旦把我們心的所緣緣到上師三寶的時候,我們就會慢慢地感覺到清涼。這也是對付痛苦的一種方式,也是一種經驗。希望大家多多地累積這種經驗,這種經驗對我們面對生命的很多痛苦,甚至是磨難,都是很必要的一件事情。因為我們必須訓練我們的心,怎麼樣地從煩惱的那些是是非非上移開,能夠專注於法;專注於法的當下,其實就沒有那麼痛苦了,甚至越聽越開心! [05′20″]</p>
<p>   大家還記得吧?是阿難尊者吧,他生病了,然後耆婆要給他開刀。什麼時候開刀呢?就選擇在阿難尊者聽佛說法的時候去動刀,因為在聽佛說法的時候他特別特別地專注,甚至都感覺不到動刀的痛苦。我們會說:「哇,這個簡直是一種登峰造極的水準啊!」但是畢竟也是在佛弟子裡,有人做到了那樣的水準。 [05′50″]</p>
<p>   大家都知道《廣論》上說要緣念著佛陀,如果我們的心續能夠晝夜不息地緣念著佛陀的話,甚至到臨命終的時候,苦受莫能奪。就是那麼劇烈的死苦,其實都不能夠把我們的心完全地壓迫或者蓋住的,由於我們的內心緣念佛陀的原因。所以這些殊勝的善所緣,還有這些法,為我們生命所帶來的饒益,大家可以在聞法的過程中、在研討的過程中慢慢地去體會,自然會有一番感受吧!在自己的心上。 [06′40″]</p>
<p>   還是請大家要端正一下自己聞法的動機,就是要再再地調整:為了利益無窮無盡的有情,我們必須去希求大覺的佛位;如果希求佛位的話,就要去種成佛的因;成佛的因,就要先知道;要知道,就必須來聽法。所以我們是為了求得自他能夠早日離苦得樂,必須求得佛果這樣的一個動機來聽《廣論》。調整好了嗎?調整好了就要開始了。好,請大家開始聽! [07′21″]</p>
<p>   這個地方的一步一步地歸敬有個原因,說明本論的這個師承,它是這麼樣下來的。那麼這個地方說明本論不偏重於智慧,不偏重於方便,所以它歸敬當中方便、智慧啊,同樣地歸敬。還有呢,要說明我現在這個論,不是針對教那些大菩薩的,而是這麼一步一步下來,你就從這歸敬上面可以看得出來。因為這樣,所以我們曉得,喔,對!論的來源是這樣,而現在他教化的對象他不是大菩薩,而是一步一步下來。我們看最後下到什麼樣的程度。 [08′09″]</p>
<p>   所以第二個說龍樹、無著菩薩,而他們兩個怎麼樣的特徵呢?「如極難量勝者教」。這個佛下來降到文殊菩薩、彌勒菩薩,但是不管那些經也好、論也好,還是非常地深、廣;「廣」是無所不包,「深」是徹見本源。這個東西是很無可思議,我們不是普通人,乃至於小乘的聖者所能了解的。所以這個地方「勝者教」,這個很難思量、思議地殊勝的教授,是指大乘教法,而特別這個地方指《大般若》。為什麼?《大般若》是圓滿的成佛的次第,從凡夫位到成佛的次第,說得非常清楚。 [09′15″]</p>
<p>   這兩段師父提出了本論的師承,說本論不偏重於智慧、也不偏重於方便,它是一步一步來,是次第井然的。然後提出了「<p> 如極難量勝者教<p> 」,這個「勝者教」,大家有聽到是指《大般若經》。《大般若經》,師父說是廣到無所不包、深到徹見本源,是非常不可思議的,不是我們這些普通人,甚至小乘的聖者所能夠了解清清楚楚的。所以是很難思量、很不可思議的一個教授、大乘教法。那麼這樣一個《大般若》、圓滿成佛的次第,是從凡夫一直到成佛的圓滿的次第,是無所缺少的。那麼,怎麼樣才能夠去了解這個教授呢?就需要祖師、菩薩為我們造論,就好像在寫一本參考書一樣,讓我們去看明白這《大般若》到底在闡述一些什麼。 [10′28″]</p>
<p>   所以這裡邊,注意!我們會聽到「《大般若》」,聽到「文殊菩薩」、「彌勒菩薩」這些偉大的佛菩薩的名號;還會聽到「大乘教法」。這裡邊出現了「小乘聖者」、「大乘教法」......非常非常關鍵的一些詞句。大家都知道,《廣論》的傳承是源於《大般若經》的,現在很多人會請《般若經》在家裡,然後禮拜、焚香,甚至旋繞。可能也有一些讀《大藏經》的人會把《般若經》都讀了,但是《般若經》的內義到底是什麼?在裡邊佛陀要對我們宣講的密意到底是怎樣的呢?傳承祖師們就會為我們講解《大般若》、為我們造論。 [11′21″]
<p>   好,接下去聽!<p>   而這個雖然說得很圓滿,但是以我們凡夫、普通人去看的話我們不懂,我們不懂的!文字會懂,內容不懂,而且往往由於我們的偏見,我們往往會執著自以為懂了,結果害了,結果害了!所以《楞嚴》上面說的像「執指為月」——欸,有一個善知識指給你看月亮,結果你看不見月亮,拿他那個手指做月亮;就是沒有人深刻地說明的話,內涵我們不知道。所以這個殊勝的教授啊,要經過一些解釋;那個解釋的人,也必須要具足他相應的條件。那麼現在這兩位,能夠把這殊勝的教授造種種的解釋,把裡邊的深刻的、秘密的意趣,來教化我們這個眾生。因為得到了這個佛法的教化,然後呢這個世間才能夠轉染為淨,這個才是真的莊嚴,真的莊嚴!這個莊嚴本來是嚴飾,這樣。譬如我們房子裡面都是髒的,那麼拿好的東西......現在世間都是染汙的,他用正法來莊嚴,因為他這樣,所以他「名稱遍揚於三地」。這個三地是指天上、人間或者地上,跟地下,這樣。 [01′42″]</p>
<p>   還是接著前面講的,說:因為《大般若經》太深、太廣,所以凡夫和普通人去看的話很難懂得,就算文字懂了,內容也是不懂的。而且最重要的是,前一講裡我們學過,就是有習氣呀!說根性,大家都會有自己的偏執,比如說那個宴會上的小孩,很多大人物是看不到的,他就看到他喜歡吃的巧克力。 [02′13″]</p>
<p>   這種習慣,當我們看到《大般若經》的時候,我們會看到什麼呢?還有比如說把整本的《廣論》給我們的時候,我們看到什麼呢?有的人認為修行就是打坐,打坐就是為了開悟,所以菩提心前面那些教授到禪定、智慧,就只要禪定、智慧,六度前面的可能他都覺得不需要,所以他看《廣論》的時候,就只看到〈奢摩他〉和〈毗缽舍那〉。大家可以想一想:整本《廣論》直接從〈奢摩他〉入,前面都沒有看,因為他只相應靜坐。還有的人就是比較相應〈念死無常〉,所以他對於〈皈依三寶〉啊、業果呀也不是很重視,就專門看〈念死無常〉、看那個過患——六苦、三苦、八苦,就看這些苦。其實很多時候會忽略發菩提心,會忽略七種因果和自他換這樣的修法,甚至會忽略如何能夠正確地走大乘的路,這個都不會注意到,因為我們每個人都有各自的修行的習慣。還有的人認為:其實我努力地學經典就可以了,我不需要費盡那麼多辛苦去找老師、跟老師學。所以他就會自然地越過〈親近善知識〉教授,比如說《廣論》的前面那些,他不想要看〈親近善知識〉,他想要看到底是怎麼修的。 [03′42″]</p>
<p>   其實我們觀察自己學習這麼多年之後,也會發現:就算是學了《廣論》,我們還是有各自的習性。比如說一提到修行的時候,大家就會覺得可能去拜佛就是修行,那學《廣論》到底是不是修行呢?坐這兒聞法到底是不是修行呢?很多很多都有我們自己的一個習慣、自己的一個看法。然後師父說:「<p> 會執著為自以為懂了,結果害了!<p> 」甚至文字懂了,內容也沒懂。師父用了一個「以指見月」,結果是把指頭當成月亮。 [04′19″]</p>
<p>   在這種狀態下,我們怎麼辦呢?我們就真的非常需要一位善知識——師父說這善知識有條件的——為我們講解全圓的道次第。為什麼呢?因為我們要究竟地離苦得樂,我們不可能片面地去了解一些離苦得樂的法,然後拿那些片面的來修。那會不會有利益呢?會的。但是因為沒有道次第總體的編排,甚至前後次第是混亂的,我們費了很多很多辛苦,而且苦吃得很多,但是不一定像我們想像收穫地那麼好,甚至浪費很多光陰,甚至前面修了會成為後面的麻煩,因為修錯了。大家都知道,一百零五塊和五塊錢那個時間和體力的付出的差別。 [05′04″]</p>
<p>   所以師父在這一小段,又特別強調了我們對於《大般若經》了解的現狀,因為我們種種偏執,所以非常非常需要大善知識詳盡地為我們講——其實就是傳承。這個講解,他為什麼是有條件的?他就必須依照佛陀的密意那樣去講解,不依照自己的感受或者自己的揣測,他完全是依照佛陀的本懷去解釋的。 [05′32″]</p>
<p>   如果依照佛陀的密意去解釋的話,那一定是得到佛陀的開許。比如說佛陀會說:「啊,這個人講的就是我的意思!」因為不能說他自己說:「我講的是佛陀的意思!」那大家就認為這是佛陀的意思;一定要有佛陀的授記。所以這位大善知識是被佛陀授記的,說他能夠確切地講明白佛陀的意思,對這一點我們是可以信任的。因為相信佛說的,佛說他能夠講明白佛陀的意思,那麼這一點是可以信賴的。 [06′07″]</p>
<p>   從這一點上來說,師父還說:這個世間是染汙的,要用正法來莊嚴。因為用正法來莊嚴的緣故,因為能夠廣泛、清晰、深刻地解釋這個傳承的緣故,所以他們的名稱遍揚於天上、人間、地下。 [06′28″]</p>
<p>   好,接下去聽!<p>   那麼這個是誰呢?就是代表彌勒菩薩一系廣行的無著菩薩,以及文殊大士深觀的龍樹菩薩,這是表示了它的傳承。在這印度是非常重視,其實到了我們中國也是一樣,那個師承非常重視。不要說佛法,世間學問也是如此,世間學問也是如此!很可惜、很遺憾地,我們現在末法啦!這個師承沒有。自己看看書,啊,覺得懂了!實際上差得十萬八千里,差得十萬八千里。 [07′13″]</p>
<p>   這一段師父又講了師承,師父說:印度非常地重視傳承,到了我們中國也是一樣的,對這個師承非常非常地重視。還說:不要說是佛法,世間的學問也是這樣的,比如說學中醫會講究師承,說是跟哪位、哪位名聞遐邇的老中醫學的;比如說打銀壺,一塊銀子你把它打成一個燒水的壺,這個也是要有師承。據說以前都是給一塊銀錠,那塊銀錠要用錘子把它打成一個銀片,然後再把那個銀片打成一個壺。現在不需要那樣了,就把那個銀錠直接壓成一個銀片就可以了。據說打一個銀壺啊,手工做的,要十萬錘,還有的師傅的傳承是二、三十萬錘喔!就是一個小小的燒水壺喔!可以想見那個十萬錘錘出一個壺,這樣地辛苦喔!也可以想到它的力量,因為每一錘下去都要錘,而且還要有一些錘紋啊,有一些這樣、那樣的要求,還有美觀。甚至有的還是一體成型的,就是它那個倒出水的地方是沒有接痕的,一塊鐵片直接錘出來一個倒水的地方。都要拜師學的,手把手地教,可能要練好多年才能夠敲出一個精美的銀器吧! [08′49″]</p>
<p>   像一開始問:什麼樣的壺是好的壺?那可能不漏水的就是好的壺了,因為不用講究它的造型或者款式,可能不需要去設計。但是你一旦跟到大師級的,他可能對你所有的要求都是非常嚴格的,面對他的作品有一種神聖感,他是很敬業的!你就會在跟師傅學的過程中,學到非常敬業、非常慎重,甚至工具怎麼擺都要學,一步一步都要學;甚至一進這個工作坊,你要怎麼做、怎麼做都要學。所以行家一出手,就知道你有還是沒有,你是不是內行、你是不是跟真正的師傅學過。 [09′32″]</p>
<p>   而且通常就世間學問來說,師傅也不僅僅教你一個手工怎麼去做,他會教導你的志向、教導你的人品,比如說你要打銀壺給別人的話,要教你怎麼樣跟人打交道。所以師父說這個師承啊,世間的學問如是,出世間的都是這樣的,現在也是很重視師承的! [09′57″]
<p>   所以談到這一點哪,我自己內心上面有一個感受,最早以前我那個時候看書啊,曾經看過幾個公案。這個紫柏大師是明末四大師,這是個很了不起的大德,所以那個時候人家稱他為紫柏尊者,因為他的成就,他大徹大悟了。那麼他大徹大悟了以後,他自己就好辛苦啊,也參了個話頭,他起疑情。這個傳記上面說他,描寫他用功的情況——疑至頭面俱腫。這個頭面、身體都腫起來,這樣。後來就開悟了,開悟了以後他說了一句什麼話:「唉!假定我在大善知識如臨濟、德山會下,一棒便醒,何用如此這般!」那我們單單看那個傳記就這樣,好像輕輕鬆鬆的幾句,現在我這個簡單地跟你們說一下。 [00′59″]</p>
<p>   先看「頭面俱腫」是什麼情況?我們無法想像這頭面俱腫是怎麼一回事情啊,不大曉得。那麼這個地方,我提一個,這也是現代的人,這個人將來你們有機會見到他的,今年還不到四十歲恐怕,我忘記掉了。他有一個時候他自己一個人用功,幹什麼啊?閉「般舟三昧」,閉般舟三昧。那個事情也不知十幾年了,那時候我才剛去美國回來了,回來了以後啊,他一看見我回來,就來找我,就跟我談。說他也在一個佛學院念書,我說你去念佛學院嘛就去念了。他也跟我說:「唉呀!我實在在這個地方念不進去!」我也曉得他是個修行人,那麼現在一般的佛學院裡面都弄課程排了一大堆,還要什麼英文啊,還要什麼日文,他尤其是沒有興趣,這樣。後來我就說你這個既然念了,好好地把它剩下的三年念下去。他說:「法師你回來幹什麼?」我說我回來要閉關,我就跟他簡單地......。他跟我一直住了三天,後來他就回去就開始。 [02′01″]</p>
<p>   然後呢,做那個般舟三昧,沒有人知道它。我說:「這般舟三昧,不這麼容易的,你不要貿貿然啊!」他一定要去做,那好,那既然這樣做,告訴他那個辦法。其實我也是個外行說實在的,不過那因為學過教法,大概的次第了解一點,我就告訴他。那麼所以他回去了以後,他就寫信跟我說,我現在怎麼開始......。當然這個跑,絕對不是說,哦,我訂一個功夫一口氣,到晚上,這樣!是那麼先慢慢的次第,照著哪幾樣重要的東西。第一個,第一個就是外緣哪,這個沒有其他的路好走——一刀兩斷!那麼然後呢自己準備的功課,一方面準備功課把那個的身心調治;然後,後面開始就每天開始走。剛開始的時候試試走二小時,唉,走得覺得很辛苦,走了以後慢慢覺得就好了,開始變成三小時、變四小時,到後來慢慢地可以走到,每天走到二十小時,就這樣。這個不容易呀!你們沒走過,覺得二十個小時輕輕鬆鬆,你們走走看。不要叫你們走二十小時,就叫你們一口氣走兩小時,就受不了。 [03′03″]</p>
<p>   我另外一個經驗也是,那時在,就是在紐約鄉下,有兩個學生,有一個是外國人,我剛去的時候他們就修行。我說你們不要急啊,他們急得要命,我想急得要命也沒辦法啦,反正你上面那個這個大殿很空,你就去試試看。他也是弄個功課表擺在一天,第一天不知道怎麼苦熬過去,我不知道,第二天早晨一大早他說:「啊!師父,不行了。」「為什麼啊?」「在那裡就是上半天還可以,到了下半天哪,是坐立不安,自己又說了不出來,不出來又不行,到最後熬到晚上,實在不行!」所以這是包括我自己的經驗,我周圍的人。 [03′45″]</p>
<p>   那麼我剛才說那個人哪熬下去,就走走走走......他第一次三個月並沒有什麼多大的效果,效果不大。但走到後來啊,他就發生了什麼現象呢?發生水腫,那個腿都腫了。要我們哪,啊,那稍微受一點苦就受不了,他那個開始一點腫,他因為已經聽說過,曉得古人的經驗,你沒有這個意志克服是絕不可能!他那個手按下去的話,按了下去手指拿掉,一個洞,就不回來了,就這樣。然後呢要半天、半天,它那慢慢又這樣,這樣地厲害法!剛開始腳,到後來那個大腿,到後來到那個下半身整個都腫了,他還是咬緊牙關做下去。那麼到了三個月沒什麼消息,好、好,休息一下再來,那第二次又來。那第二次來了情況就不一樣,就這樣。他那個時候又描述啊,到後來到二十小時以上,他說他四邊、中間都不靠的。那個佛堂那個佛像擺在中間,那走過,走過去他有的時候實在累了,累了他跑到牆壁上這麼輕輕一靠,一靠就睡著了,一靠馬上睡著了!睡著了馬上就「咚!」跌下來,再爬起來!有的時候坐在地上想不爬起來,哦!不可以,那撐了個半天又撐了又直在那裡,不能靠到牆,一靠到牆他馬上就睡著了,這麼嚴重法!所以這個意志力,意志力啊! [05′08″]</p>
<p>   在這種情況之下,但是他慢慢地、慢慢地繼續下去的話,欸,有意思,來了,境界來了!然後產生輕安,這樣,然後呢慢慢地消掉了。後來他那個輕安的、心裡的無比地清涼,實際你心裡上如果沒有的話,絕對沒這個力量支持你的。所以具要兩個條件,一個有堅強的意志力,沒有堅強的意志力是不行的;還有呢,正確的方法。有了正確的方法,照這個堅強的意志力,堅持下去。如果沒有正確的方法,正確的指導的話,他得不到真實相應的這種境界。真實相應的境界這個得不到的啊,白吃苦,沒有用,沒有用!所以他兩樣東西總算都得到了,後來身心上慢慢地消了,他感到無比地清涼啊!那個所有的世間的煩惱,這個清涼啊,無法形容的!你們真正用功,你們一定會體會到,那是種無比地歡喜。 [06′01″]</p>
<p>   那麼清涼到什麼情況呢?我普通可以說的就簡單說一下。他這麼辛苦法,平常他的食量也很大,因為我們剛出家的都是啊,大家持午的人都有這個經驗,等到你開始持午沒有多久,剛開始不習慣,等到晚上多久不吃的話,欸,胃口非常好,食量很大。我們平常有那個缽啊滿滿的一缽,有的時候還不夠,還要吃兩餐,到後來他慢慢地飲食減少。他每天啊我們這個小碗,稀飯稀稀的大半碗,不能再多吃,多吃吃下去啊,而一天最難過的時候,就是吃過飯那個半個鐘頭。吃過飯那個清涼的感覺就沒有了,就這樣,然後身心都會沈重,這是第一個。 [06′46″]</p>
<p>   第二個好處,慢慢、慢慢地相應了以後啊,夏天這像蒸籠一樣,他還戴著一個毛線帽子,像那個盔一樣,欸,他也不覺得,不覺得熱。(今天他拿掉了,因為他那兩天才感冒。)然後到了冬天,到了冬天我們曉得這裡天氣還是滿冷的啊,他還是那個帽子,還是那件衣服不覺得冷。所以他這個真正地來的時候,不是我們說硬作的事情,就是這樣。所以我這地方我倒順便的提起來他那個公案,他做的過程當中啊非常辛苦,他一共試了三次。在這種情況之下,離開那個開悟還遠得很,還一大截啊!這樣。所以我們平常聽別人家說很容易,頭面俱腫,好像一個故事,如果你們自己試一試,就曉得這個頭面俱腫辛苦的狀態。 [07′36″]</p>
<p>   好!師父為什麼要講這樣一個故事呢?說前面提到師承,很重視師承,師父說談到這一點,他內心裡有一個感受,然後就提到了紫柏尊者,紫柏尊者參話頭,起了疑情。他的傳記裡描寫他用功的狀況,就是這個疑情把他折騰到頭面俱腫。其實我們看了傳記,可能這四個字就過了,頭面俱腫之後他就開悟了。開悟之後,他說:「<p> 唉!假定我在大善知識臨濟或者德山會下,一棒便醒,何用如此這般啊!<p> 」就這樣慨嘆! [08′19″]</p>
<p>   因為這樣的一個慨嘆,師父就講了頭面俱腫是怎麼樣嚴重,也說了一個現代的修行人,他修行了般舟三昧。在這裡師父講了幾個很重要的問題,一個是要想成功一件事情,要具備兩個條件:一個是要堅強的意志力,還有就是正確的方法。有了正確的方法,照著這個堅強的意志力堅持下去,就能夠成功。但還要有正確的指導,如果沒有一個正確次第的指導是不行的。 [08′55″]</p>
<p>   師父還講了紐約鄉下有兩個學生,他們急啊,急得要命!這個急得要命的狀態——我們有的時候都可以體會自己會進入那種狀態,就一直想要得到自己想得到的那件事——結果就上去閉關了,然後第二天就跑出來了。為什麼?因為什麼都沒有準備。 [09′16″]</p>
<p>   而修般舟三昧的這個修行人,他一開始了解了很多,次第都很明顯,而且他非常清楚開始先走兩個小時,一點點練,後來練到了走二十個小時。但是就算按著次第來,也是很辛苦,師父講他那個腫,腫到按下去有一個洞都回不來了。 [09′38″]</p>
<p>   如果一直走,不坐、不臥,這個應該是拿出拼死的精神吧!才能戰勝那種首先是會想睡,然後腿大概是痛到不行了吧!走到極點,腰也會痛吧!不知道全身骨頭是不是都會痛?他就全都腫了,甚至靠在牆上一下就睡著了,然後會跌倒在地上,跌倒在地上沒力氣爬起來,他還要再爬起來、再走,就是這樣子。而且,注意哦!是三次,一次是九十天哦,是進行了三次這樣的訓練!所以可以想像這個修行人如此堅強的意志力! [10′20″]</p>
<p>   最後他得到了那個境界是什麼?冬暖夏涼,都沒問題。飲食方面,吃一點點就可以了,不能吃多,因為吃多會妨礙他的那種清涼。對物質的依靠降得很低、很低,但是心裡卻非常非常地清涼和舒適。然後師父說不僅僅消腫了,他感到無比地清涼啊!那是所有世間的煩惱好像不見了,都是如此清涼,是無法形容的!師父後面講說:「<p> 你們真正用功,你們一定會體會到,那是種無比的歡喜。<p> 」 [10′58″]</p>
<p>   不知道大家有沒有小閉關的經驗?閉關的要求通常要做很充分的準備。尤其師父這裡邊強調說:「<p> 沒有其他的路好走——一刀兩斷!<p> 」就是外緣。不能坐在關房裡朝三暮四,把從小到大的事都想出來了,好像坐在鬧市裡一樣,那就沒法專注在善所緣上。所以無論是閉關,無論是聽法,其實都要有一個師承、有一個善知識指導,這樣的話我們會少受很多苦。 [11′29″]</p>
<p>   師父用這個「頭面俱腫」的強度哦!一個修行人有這麼堅強的毅力,撐過了頭面俱腫那樣難以想像的一個難關。走不動了的時候、身體全腫了的時候,他又一直都不休息,可能有的時候會覺得自己會不會這樣累死啊?但是為什麼他能堅持下去呢?就是他有堅強的信念,覺得這樣佛菩薩一定會加持他。就這樣地把它完成了!用這個例子,講一下「頭面俱腫」是一個怎樣痛苦的過程。 [12′04″]</p>
<p>   像紫柏尊者就經歷過這樣的過程,然後開悟了。開悟了之後,其實他應該說:「哎呀!我終於經歷過這樣頭面俱腫的過程,開悟了!」應該是這樣的無比歡喜才對。可是他說:「如果在大善知識臨濟、德山會下,一棒便醒!」就是:我根本不用經歷這個頭面俱腫的痛苦,只要被善知識棒喝就可以開悟了!師承,可以讓我們少受很多苦,不走彎路就能夠去證悟、能夠去開悟! [12′42″]</p>
<p>   我們會在修般舟三昧這個公案裡,看到在修行人、在佛的弟子裡,居然有這等精彩的人啊!他能夠拼了命地用這樣一個頑強的意志,想要去證悟佛法,而且就是我們同時代的人,真的是很佩服! [13′00″]
<p>   好!大家接著聽。<p>   還有真正疑情現起的時候,那個參禪那個疑情現起也滿有意思的。到那個時候你的腦筋裡面沒別的東西,就是這個疑。假使你是念阿彌陀佛,說「念佛的是誰?」就是人家形容啊如人欠萬貫,欠了人萬貫錢一樣,那個債主逼在那裡不曉得怎麼解決。或者說你被人家倒了萬貫錢一樣,你不曉得用什麼方式,心裡老放不下要回來的那種味道。他什麼東西說打不散、搓不開,這樣啊!反正這種東西啊,所以就是說你只有正確地體會了。好辛苦、好辛苦!而且往往是經年累月地這樣來。 [00′48″]</p>
<p>   這一小段,師父又為我們解釋一下疑情現起來的狀況——參禪的一個法門。師父學過很多法門,而且都是深入地學。疑情現起的狀況,比如說念佛,參念佛的是誰,還有參不同的話頭,到了那個疑情現起的時候,就是整個疑情和心完全地融為一體,好像怎麼也放不下,走著、坐著、躺著、睡著......,心裡全部都在想這一件事情。 [01′27″]</p>
<p>   其實到了〈毗缽舍那〉的部分,會談到對「我」的這個安立,還有對很多事物的安立的問題——就是心對境的一個安立的問題。當講到〈毗缽舍那〉的這個問題,還有學習辯論題,像出家人學《攝類學》的時候,他們也是從早到晚探討一個題。探討這個題的時候,常常一週可能也會想這個題。因為我看到我們寺院第一班的法師在學五大論的時候,老師留了一個題,如果他們全班都沒有人明白的話,那麼這一夜有的時候他們都不會睡的,大家在那兒坐著,突然有一個人破題了;他破題了之後,他就跟周圍的人討論,然後慢慢大家就可以把那個問題想出了一個思路。 [02′11″]</p>
<p>   比如說上辯論場,有的時候被大善知識問到啞口無言,什麼都答不出來,所有的思路好像全部都掉進了某個黑洞,心裡只是一片空白。有的辯論的人,也有被特別厲害的大善知識回答一句之後,就在場上一直站三十分鐘。因為輪到他辯論的時候,他要辯完那麼長時間,可是他不知道該問什麼,就只能在上面站著,所有的思路都不見了。 [02′38″]</p>
<p>   在學習理路、在探討真理的時候,很多出家人經年累月地研習教典。比如說五大論學制建立的這個過程中,每一道題他們都想要去尋覓答案,有的時候會討論不出一個結論,甚至經年累月地沒有一個結論,經年累月地都在起疑情的這樣一個狀態,但是卻要提起十二分這樣的一個精進力,不停地去探索。 [03′03″]</p>
<p>   為什麼呢?因為探索「我」的安立非常重要。以我愛執為中心的這個苦難的淵源,幾乎可以說承包了我們生命所有的痛苦,一旦我們聽佛說了「無明」就是所有痛苦的根源,這個生死就是無明產生的,如果這個無明不破除的話,我們是無法逃脫生、死、生、死這樣的一個摧殘。所以很多修行人精進地學習佛陀的教典,在探索「我」到底是如何安立的?在心和境之間,他的猶疑、他的側重點,到底是一個怎麼樣的力道?從學習《攝類學》開始,經年累月,十年、二十年都是要鑽研這個問題。 [03′51″]</p>
<p>   其實也有點像念茲在茲,就是一直在心上不能忘記這個問題,甚至可能在用齋的時候、在走路的時候,甚至在抬頭看一眼天上的雲的時候,都會去想我們生命裡非常在乎的那個問題。很多人可能會對無自性的問題很感興趣,想要去探索:無自性到底是怎麼回事情?這個「我」到底是如何產生的?對這個問題,有的修行人就要探索可能二十年、三十年、四十年、五十年,從很小的時候就開始探索。像我們寺院有的沙彌就開始背《辨了義不了義》,他們從小的時候就開始接觸這樣的教典,開始思索這樣的問題。 [04′44″]</p>
<p>   所以師父說老放不下的那種感覺,打不散、搓不開,這是求道者的一個用功的狀態。師父說是很辛苦的,但是還要經年累月地這樣地努力下去。很禮敬這樣探索真理的修行人! [05′08″]</p>
<p>   如果有善知識在旁邊指導的話,就會知道自己是在什麼境界——在風中、在雨中,還是在霧中,還是在黑夜裡,善知識都會告訴自己。比如說在學經論產生懷疑的時候,會強調說要合理猶豫,不能非理猶豫。非理猶豫再下去之後就會破壞自己的信仰,甚至會建立一些邪見、非量的東西,然後會走上了歧途。這都是要善知識在旁邊,手把手地教自己。 [05′40″]</p>
<p>   就算是自己會了辯論的理路,但是辯論的理路怎麼去伸展,才能有利於自己建立對三寶的信心,甚至建立嚴密的對教量的觀察、對內心的觀察,對很多很多定義的反覆觀察和討論。我們真正地確定一個事情的時候,是要經歷破除邪見是什麼,自宗是什麼,最後還要經過有人提問題了、又有人提問題了、又有人提問題了......,然後不停地答疑、不停地答疑。 [06′09″]</p>
<p>   如果能立出一個別人挑不出一點毛病的自宗,就像玄奘大師在印度辯論,那個時候辯論的人都說:「如果你能把我上面立宗的字動一個的話,我就以頭相謝。」就是我的頭都可以給你。所以那個時候的出家人他們的立宗是用生命立出來的,因為他經歷過了太多太多的探索,太多太多晝夜反覆地、反覆地用功,精進地觀察,所以最後他成立的自宗是堅固不可動搖的。 [06′43″]</p>
<p>   所以這個時候建立的信仰,他已經經歷過了提出問題、再回答問題、再提出問題、再回答問題,而且自己提得差不多之後,他還要接受很多人對自己提問題,最終他會建立出一個這樣的自宗。一旦這樣的自宗建立出來之後,他肯定是非常難以撼動的。信仰就是這樣,是在反覆地辯論、反覆地觀察之中建立出來,在晝夜不停地聽聞、思惟、辯論、反覆地觀察中建立出來的,所以觀察修是非常非常重要的! [07′20″]
<p>   好!再聽下一段。<p>   結果啊,他說如果在臨濟、德山會下,有大善知識的話,一棒、醒了!一點都沒錯。這個善知識,這地方特別說明的——這個有善知識的攝受的重要。那麼像這種事情,也就是說平平常常啊我們自己單單憑自己的這個,不管用功也好、認識也好,都需要經過這種過來人的指點。那麼現在這個地方呢,也就是說,喏,他們兩位把佛最殊勝的東西解釋說明了,讓我們深入體會到。結果他影響所及不僅僅是我們人間,是天上、天下無所不及。佛陀在經典當中也懸記,到將來末法當中能夠振興,把我的教法如理如量地恢復的,就是他們兩位! [01′12″]</p>
<p>   好!在講了「頭面俱腫」,再講了「疑情」、「般舟三昧」,然後又回到了那個話題,就是傳承、善知識。師父說善知識的攝受非常地重要,因為像悟道的事情,平常我們單單憑自己,不管自己的用功也好、認識也好,師父的看法應該是:沒什麼用的,有的時候可能會起反作用,一定需要經過過來人的指點。 [01′52″]</p>
<p>   這幾句話其實也是師父修行的寫照。大家都知道師父是非常勇悍的一個人,他是不怕困難的。在師父的日記裡,師父寫到某一天上早課之前,他突然胃痛,痛得非常非常嚴重,這個時候師父不屈服於這個胃痛,繼續起來把該做的事做完。還有的時候會寫到師父病了,在病中,師父每天不間斷地誦《大般若經》。師父有一次生病,誦《般若經》的時候他會加大量,誦了三、四卷。因為生病的時候沒有力氣,還要加大誦經的量的話,實際上是會很辛苦的,但是在師父的日記裡還寫說他得到了無比的加持,他內心感到無比地歡喜。那時候看到身體示現的苦受,和內心感到的歡喜和清涼,好像是了不相干的樣子。 [02′59″]</p>
<p>   這樣一位勇悍用功的善知識,他示現的行為就是每天對自己的善知識祈求,他會認為:哎呀,修行不可一日無師啊!必須老老實實地跟著善知識學,跟著過來的人學,因為過來人的指點非常重要!看!在《菩提道次第廣論》的講解中,他在第二盤磁帶處處強調一定要傳承、要師承,我們在修行的過程中不能過分地憑藉自己,比如說自己很用功,自己好像頭腦很靈光、思路很快。正因為思路很快,有的時候可能就想到別處去了;正因為很用功,所以幾天不見就跑得很遠,跑到哪兒?可能跑到錯道上去了。 [03′47″]</p>
<p>   所以在修學佛法的過程中,能有一個善知識引領我們,我們是何等地幸運!像師父在《廣論》裡,透過講一些公案啊、講一些故事啊,比如說那個修般舟三昧的出家人,他是做了充分的準備去修的,而且有非凡的毅力,還有正確的辦法,這裡邊就對比出:沒有做準備的那兩個人根本就是會半途而廢。所以當我們去做什麼的時候,我們會不會注意到條件?比如修學佛法很重要的一個條件就是:一定要找到傳承,找到傳承的善知識指導我們,而且我們要對這樣的善知識修信。這是一個必要條件,然後才能修行! [04′31″]</p>
<p>   很多人在用功的時候,可能會特別習慣自己指導自己——自己想一想,比如這段時間可能在一些地方承擔,發現:哎呀!最近煩惱越來越重,跟別人的關係也處理不好,然後就下個定義:我學了二十年《廣論》,怎麼樣?煩惱越來越重了吧!越承擔煩惱越重。他把觀察到自己煩惱重的因,歸結為學了這麼多年還這麼重。這樣一討論的話就變成:那學《廣論》對我們生命的利益到底是什麼?二十年都辛辛苦苦地學習,利益到底何在?所以這很顯然是一個非常打擊自己的想法。 [05′15″]</p>
<p>   我們聽一座《廣論》、聽一座法,從前行、到正行、到結行,實際上它對我們身心的饒益,應該從聞法勝利上去看,而不能說看我煩惱這麼重,所以我聞法就沒有功德,不能這樣子看。但是如果沒有善知識在旁邊提點著我們,在守護著我們、觀察我們,給我們一些及時的提醒的話,我們常常會自己做一些很奇怪的總結、很奇怪的結論。這種結論看起來是那麼真實、是那麼有理有據,而且我們都是直接有經驗的。所以學習了很久的人,就會認為:喔!學了這麼久到底有什麼用?我煩惱還是這麼重! [06′00″]</p>
<p>   沒學之前知道煩惱重嗎?可能是不知道。那麼知道煩惱重了的時候,為什麼會認為是學了這麼久沒用,煩惱還是這麼重呢?也可能是自己的觀察力變明晰了,看到越來越多的煩惱。就像陽光照進了一個屋子,我們看到了越來越多的塵埃;這個屋子如果是在地下、沒有燈的話,灰塵一寸厚也看不到,也不知道是什麼。 [06′28″]</p>
<p>   再一個,比如說聽聞很多年教典,算一算自己每聞一座法,它所產生對自己的利益。尤其是沒有虛度光陰這樣的二十年喔!到這個時間就來聽法,我們會累積親近正法、親近善知識多少殊妙的善業?這樣算一算是不是內心會比較歡喜? [06′51″]</p>
<p>   我特別特別地發現師父會在我們遭遇的很多很多看起來沒什麼歡喜心、沒什麼收穫的事上,幫我們總結出特別特別多亮麗的、讓我們身心振奮的那些點。這些點為什麼師父能夠看到,我們看不到呢?可能這就是我們必須跟師父學習的原因。 [07′16″]</p>
<p>   還有比如說「觀功念恩」,觀功念恩就是對自己、對這個世界的一個視角。有一些人認為如果常常觀功念恩的話,會不會是非都混淆了?No!不會的!因為觀功念恩會讓我們減少對他人的怨恨這些負面的心思。一旦我們看看別人在我們生命中的付出,我們就會生出很多的感恩心;一旦有很多感恩心之後,我們就會感受到幸福,感受到這個團體的溫暖、家人的溫暖、朋友的溫暖。這就是善知識給我們提供的,在林林總總的事相中,我們可能需要保持的一個觀察的角度。 [07′56″]</p>
<p>   還有我特別強調做「善行點滴」,報告善行。有些人就提出觀點,說:「欸,我要是把我的善行講出來的話,是不是就沒有積到陰德?」還有的人說:「萬一我把善行講出來,我驕傲了怎麼辦?」祕密的善行是可以做的,但是你把你的善行講出來,不是為了炫耀,而是為了供養佛菩薩、供養大眾,如果是這樣的話,應該不是為了名利心。那麼傲慢是如何產生的?傲慢是覺得自己比他人強。如果我做了善行點滴就認為我比所有的人強,那確實是傲慢。如果我自己做了那個善行,又聽到班裡的很多人都有這麼多善行,生起了對周圍人的恭敬,這樣的話,這個團隊就會在一種感動和禮敬的過程中,講述自己的善行點滴。那為什麼自己能做這樣的善行?源於善知識的教誨、源於佛陀的教誨,而且源於同行善友彼此的影響。這樣的話,我做的善行歸功於誰?就歸功於善知識和同行善友,好像自己是越來越小的,那麼怎麼可能會產生傲慢呢? [09′07″]</p>
<p>   這些其實都是在學《廣論》的過程中,師父慢慢地幫我們養成的一個習慣。也就是一定要得到師父的攝受、師父的引領,我們這樣在修學的過程中才能少走彎路、多集資糧,尤其是用一種振奮、樂觀的精神,在一切境界中都能夠看到希望、看到光明,也就是看到解決問題的辦法。一旦有辦法之後,我們就設法去改變,而不是在經過的事上,總結消沉、灰暗、無助。因為我們的心是有作用的,一旦我們朝向著能夠積聚資糧,能夠有所作為,能夠運用佛法、運用教理來觀察內心的煩惱,來對治內心的煩惱,我們就不會對痛苦感到無能為力。我們是可以對治它的!因為痛苦是有原因的,把痛苦的原因去掉,痛苦的果就不存在了。 [10′03″]</p>
<p>   一旦長久地這樣在師父的教誨中反覆地練習的話,我們就會慢慢地養成習慣,當苦現起的時候我們就會去觀察:苦是什麼?因是什麼?我還有什麼可以解決的?就不會糊里糊塗地沉在苦受的感覺裡,甚至泡了很久,越泡越深、非理作意越來越多還不知道出離,還給自己痛苦找很多理由,讓自己陷入越來越深。我們就會覺照:生命的這種狀態實際上是苦的,而且是越來越苦的,這樣方式是不對的。我們就會想起師父教我們的理路、想起:喔!在我們的生命裡,有那麼溫馨、親切、和藹的善知識,他在《廣論》裡,處處教我們如何觀照自心、如何對付煩惱;我們的生命不是孤立無援的,我們有佛菩薩、善知識的攝受! [10′58″]</p>
<p>   如果有善知識的攝受,那麼在我們遭遇的任何境界中,比如說病苦,比如說我們的親人得了不治之症,還有經歷各種各樣的愛別離等等,在遭遇到這些事的時候,我們就不至於被這種事情粉碎。我們會想著從這種事情的打擊力上快點站起來,為什麼?因為師父說只要我們不放棄,他會陪我們走完最後一程。這條路不是孤寂的、不是獨行的,是有師父陪伴我們的! [11′34″]
<p>   大家好!又到了我們一起學習《廣論》的時間了!我有看你們給我寫的一些回饋,有一些同學是在高鐵上聽的;還聽到你們在旅途中、在各自不同的地方聽全廣。很隨喜大家這樣努力精進地聽聞。 [00′23″]</p>
<p>   在每一天的時光中,如果能抽出一段時間來聽師父的帶子,對我們這一天來說都是一個意樂的提策。因為我們非常非常容易被眼前發生的這些大大小小的事情牽著走,比如說:「欸!看看明天有什麼事呢?」就把手機打開看一看有誰發短信了,好像有什麼事情就趕快處理一下。這種樣子看起來,就是手機上的信息會指導我們一天的行程,我們會根據手機決定怎麼過這樣一天。 [00′58″]</p>
<p>   但實際上很多手機上的信是別人發給自己的,而自己到底要怎樣度過這一天呢?早晨起來應該提一個正念,比如說:很幸運,我又能用暇滿或暇滿的隨順這樣度過今天,那麼應該以一個大乘的發心,惜時如金,用每一分、每一秒的時光,多對正法、對上師三寶造作一些非常良善的業。因為這種業對我們的現世及來生都有莫大的好處,也唯有這種業才能夠幫助我們離苦得樂。可是如果早晨不去提正念、作意思惟的話,我們就會被旋轉在世界各地的這些信息包圍。其實光是把這信息讀完就要花很多時間,而且明天可能還有這麼大量的信息又來了! [01′56″]</p>
<p>   那麼到底在我們的生命中,什麼事情是非做不可的,一定要排一個次序!這個在全廣前面都講過了:有一件事情非做不可的,而且那件事情直接關乎於我們離苦得樂。因為我們會發現每天都有太多事情要做,而且此生有太多的目標要完成,那麼它的次第到底是怎樣的,我們要每天提正念才能夠排序好。比如說修念死無常,才知道我們此生無論擁有多少,到了那一天都要放手;這樣的話,太強烈的貪、瞋對我們來說就很不划算,因為我們必須對生命有一個長遠的打算和規劃。 [02′40″]</p>
<p>   一旦我們早晨起來思惟一下念死,由怖畏惡趣而生起強烈的皈依心,能夠轉動心意的話,哪怕只有幾分鐘,對我們的這一天的生命都是非常難能可貴的!而師父講的《廣論》,就會每天提醒我們,面對現在迅速迎面而來的這些事情、迅速消逝的昨天,乃至前一剎那迅速地又成為現在一剎那、後一剎那這樣迅速消逝的這個無常,到底我們的心要皈依誰?我們說:皈依上師三寶!那麼皈依上師三寶,最重要的事情是什麼?就是時時刻刻要警醒自己的三業捨惡取善。 [03′27″]</p>
<p>   為什麼要這麼專精地捨惡取善呢?因為惡業會帶來痛苦,善業會帶來快樂,而那個感受快樂和痛苦的就是我們的身心啊!所以我們是不能對這件事知道了卻忽略它,或者有的時候全忘了,甚至有的時候是明知故犯,被一些煩惱習氣所牽引,無法在境界面前做得了主。像這些都要在聽法的時候好好地訓練自己的心,訓練久了、訓練久了,調伏這個狂心,讓它慢慢地沿著佛陀的教誡被馴服——讓它去哪裡,它就去哪裡;不讓它去哪裡,它就不去哪裡。這樣的話,我們對自己的身心才能做得了主。 [04′14″]</p>
<p>   當然要達到這樣的自主身心,確實要花上一番功夫。但是做什麼事不花功夫呢?就算是在世間賺錢,哪有事情不花功夫就可以天上掉下來的!如果從天上掉下來的那個好事情,正好掉在自己面前,也是往昔劫自己努力的結果,沒有無因生的、突然而出現的東西。既然什麼事情都要經過努力,那麼對於離苦得樂這麼關鍵的一件事情,我們應該也責無旁貸地付出我們的努力,因為這是非常非常值得做的事情! [04′50″]</p>
<p>   特別特別開心在每天學習全廣的時候,我們能在這樣一個大課堂裡一起學習!在聽聞之前,還是希望大家能夠觀察一下自己的相續,把自己的相續調整到一個大乘的意樂——為了無窮無盡的如母有情能夠從苦難的輪迴裡脫離出來這個目標,我們必須去成佛,成佛才能究竟地自利利他圓滿。懷著這樣的一個意樂來聽聞《菩提道次第廣論》,才能和這一本論典相應,也才能和師父教導我們的這個心相應。 [05′31″]</p>
<p>   你們都準備好了嗎?如果準備好了的話就開始了!今天我們是要學《四家合註入門》,請大家把書翻到五十八頁,看下面有紅字、黑字,還有藍字的那個部分:<p>   <p> 又,<p> 其後禮讚二大車者:<p> 如<p> 經云:「任為誰說皆不解」,於<p> 極難量<p> 一切至言之主,<p> 能生三種聖者及<p> 勝者<p> 之<p> 母,<p> 各別<p> 如實<p> 造釋<p> ,皆如勝者自之<p> 密意<p> ,而成<p> 贍部樹所表徵之<p> 贍<p> 部<p> 洲<p> 中光顯二義之莊<p> 嚴,名稱遍揚於三地,我禮<p> 〔等同龍與阿周那故為<p> 龍猛<p> 。〕以及<p> 無著足。<p> 是為龍猛無著二大車。<p>  [06′29″]</p>
<p>   在仁波切的講記五十九頁,大家可以看一看:「<p> 其後禮讚二大車者<p> 」,這是在箋註提到的。在禮讚二大車者的時候,提到了「<p> 極難量<p> 」,說:「<p> 如極難量勝者教<p> 」的「極難量」——佛陀所說的法非常地難,仁波切說:非常地難懂。佛經裡有說道:「<p> 任為誰說皆不解。<p> 」你跟誰說都不能理解的,不能聽懂。所以佛陀說的法,對我們而言是很難的,不會隨隨便便就說。佛陀現正等覺之後不是四十九天都默然而住、沒有說法嗎?佛說:「<p> 我得深寂離戲論,光明無為甘露法,任為誰說皆不解,是故默然林中住。<p> 」佛說他得了寂靜、甚深、離戲論的法,是光明為體性的、是無為的、是不死甘露的妙法,為誰說都不能夠理解其義,所以就默然在林中安住。這裡邊仁波切解釋說:「任為誰說皆不解」,就是無論跟誰說都令對方難以理解,說和不說都沒辦法懂,所以不說。由此可知佛說的法義難以證知。 [08′02″]
<p>   大家有沒有想到這是一個很大的難題?一位證悟者大徹大悟,佛陀在菩提樹下夜睹明星,然後開悟。有些人問:「佛陀在夜睹明星的時候悟的是什麼?」這裡邊有很多說法,有的人就說:「緣起性空。」那緣起性空到底是什麼?佛陀多麼想要把他領悟的東西講給大家,經歷了三大阿僧祇劫累積資糧,終於悟道、可以講了,但是卻任與誰說都很難理解,這是一個非常非常大的難題! [00′39″]</p>
<p>   「<p> 極難量<p> 」就是在說明這一點——佛所領會的法是非常難以理解的。注意!那麼是指什麼法?主要就是指「<p> 勝者母<p> 」,這個「勝者母」就是《般若經》。由於難以證知「<p> 一切至言之主<p> 」——勝者母的一切內涵,它不只是「難量」——難以測量,它是「極難量」,「極」應該是到達頂端的這樣一個難以理解的程度。 [01′13″]</p>
<p>   這個極難量的勝者母,接下來這裡邊說到:「<p> 一切至言之主,<p> 能生三種聖者及<p> 勝者<p> 之<p> 母<p> 」。「能生三種聖者及勝者之母」,是指這個《般若經》能出生聲聞聖者、獨覺聖者、菩薩聖者、佛陀勝者,所以它是這麼重要的、能出生聖者、像母親一樣的《般若經》。甚深難懂的《般若經》,又這麼珍貴,可是又難以理解,這是一個非常大的難題!對於這樣的至言,誰來解釋呢?大家都知道,後來佛陀還是說法了,不然我們今天就不會有《般若經》,不會有這麼多的八萬四千法蘊。就像宗大師在有人勸請之後寫《菩提道次第廣論》,後來〈毗缽舍那〉的部分原來是示現沒有想要寫,後來文殊菩薩勸請他要寫,觀察到儘管很難,還是會對眾生產生利益的。所以我們會發現佛菩薩都是去觀察這件事能不能對眾生產生極大的利益,然後才去做。萬一可以產生極大的利益,可是會非常困難,他們也會突破困難去把這件事完成。 [02′32″]</p>
<p>   佛陀講了《大般若經》——極難量的《大般若經》,到底誰能夠再為我們寫一個解釋讓我們清楚呢?這個時候,有人能夠完全理解佛陀的心意,把佛陀的話說到大家都能懂,好像是佛陀在人世間一個天生的翻譯一樣,把佛陀整個思想體系、語言習慣,都翻譯給所有的人;確切地了解佛陀的意思,而且確切地了解大家的理解難度和容易產生偏差的地方,在這個中間做一個徹底地彌合、解釋清楚,這樣的人是很難求啊!難得!對於這樣的至言「<p> 各別<p> 如實<p> 造釋,<p> 皆如勝者自之<p> 密意<p> 」,是說能按照《般若經》來造論解釋佛陀的密意。就是誰呀?二大車對吧!居然在這個人世間還出現了這樣稀有的人,他們能夠如實地寫釋論,而且就像佛陀講述的那般,可以顯現《般若經》的密意,完全是解釋《般若經》的密意。就因此,他們絕對可以成為贍部洲的莊嚴,也就是我們的莊嚴! [03′55″]</p>
<p>   讀到此處的時候,會覺得非常地慶幸!會想:「哇!萬一沒有二大車,我們可怎麼辦?」佛陀說了《般若經》,現在大家抄經啊,抄經很有功德;印經,把它奉在經櫃裡邊;然後旋繞、散花、供香,乃至寫讚頌去讚美它。但是如果《般若經》的內義在這個世上失傳了的話,那該是我們人世間多大的悲哀!或者說佛陀講了之後,當機的人聽懂了,我們後面的人全部不知道在講什麼。比如說我們現在聽說了《般若經》可以出生三乘的聖者,我們要發心成為哪一乘的聖者呢?你是想要聲聞發心、獨覺發心,還是菩薩聖者呢?我們很多人都說:「啊!我當然要大乘發心,我希望能成為一個菩薩,然後成佛。」可是如果不了解《般若經》的密意,我們如何能夠成為一個菩薩聖者呢?因為《般若經》就是出生這三種聖者之母呀!所以可以想一想:如果沒有二大車造釋論的話,我們今天在無上菩提之路的探索,該是何等的艱辛和孤獨,甚至完全絕壁呀! [05′17″]</p>
<p>   登山的時候,如果你面前出現的是一座雪山,而且這個雪前兩天下了之後迅速地化,然後又下、又化,化了之後的水就結冰,所以雪底下就會有冰。那千年的冰山,想要登上去的話,如果是絕壁,請問怎麼登呢?如果沒有一個特別有經驗的人告訴我們怎麼登上去的話,恐怕都沒人敢上去的。 [05′43″]</p>
<p>   所以我們非常非常幸運啊!能有這樣的二大車造釋論給我們,讓我們能去了解《般若》的密意,我覺得不是三生有幸的問題了,這簡直是不知道多少世修來的鴻福!也不是鴻福齊天的問題了,就是無法形容內心的感恩和喜悅吧!所以他們成為贍部洲的莊嚴,也成為你我心中的莊嚴,也成為你我生命中無比的莊嚴,因為他們能夠造釋論啊! [06′18″]
<p>   提到贍部洲,為什麼叫「贍部洲」呢?「<p> 贍部樹所表徵之<p> 贍<p> 部<p> 洲<p> 」,贍部洲的贍部是指樹幹的枝條、果實掉到水裡了,發出「贍部」這樣的一個聲音,所以我們住的這個地方就稱為南贍部洲了,經典上這樣寫的。「<p> 贍<p> 部<p> 洲<p> 中光顯二義之莊<p> 嚴<p> 」,這個「二義」,仁波切在這裡邊解釋是自利、利他這兩種利益。因為能成辦一切他利的緣故,有如莊嚴,所以稱為「莊嚴」。這裡禮敬成為贍部洲莊嚴的龍猛及無著兩位菩薩。 [00′42″]</p>
<p>   學到此處,不知道諸位的心裡會不會如同文義所講的那樣,生出一個真實禮敬兩位菩薩的心?就像剛才我們講的,那麼難以企及的《般若》密意,這兩位菩薩寫了論,把《般若經》的一個段、一個句、一個句這樣去解釋,解釋得非常詳盡。看了他的解釋之後,再看原文的《般若經》,會發現在原文的《般若經》裡自己如何也看不出這樣的涵義。如果沒有菩薩們造釋論去解釋《般若》的話,就是眼睛看見《般若經》了,但是我們也無法看到它的內義。所以這個時候再想到禮敬為《般若經》造釋論的菩薩,內心說是禮敬嗎?還是無比地感恩?還是萬分地珍惜,唯恐失去這個機會?非常非常幸運值遇了能夠解釋《般若經》的這樣的釋論。因為他們能夠成辦自他二利,就有如莊嚴一樣,所以才讚美是贍部洲的莊嚴。 [01′47″]</p>
<p>   說:「<p> 等同龍與阿周那<p> 」,「阿周那」,是帝釋天王的兒子,是天王的王子的名諱。龍猛本身是人,但是他等同龍、天,故稱為「龍猛」。所以「龍猛」一名,具備了天和龍兩種意思。這裡就沒有另外再解釋無著菩薩。龍猛、無著他們的美譽名稱遍揚於三地,我禮敬二大車的雙足之下。這個是仁波切在《四家合註》裡邊的解釋。 [02′24″]</p>
<p>   在佛陀所說的一切的經典當中,《般若經》是最重要的經典。佛陀在《般若經》中,特別囑咐阿難尊者:忘失了其他經典的文句,其罪小小;但是如果忘記了一句《般若經》,過失極大!所以從佛陀的這句囑託來看,可以看到佛陀對《般若經》的重視的程度。妙音笑大師在《現觀辨析》裡邊,引證了印度的法友論師所著的《明顯句論》中說:「在所說的一切八萬四千法蘊當中,最尊、最上、最勝、最妙,即是《般若波羅蜜多經》。」所以可以看出來佛陀他很重視自己所宣說的《般若經》,諸大論師也同樣地很重視《般若經》。那麼為什麼《般若經》是如此重要呢?大家可以考慮一下。 [03′39″]</p>
<p>   佛陀來到世間真正的目的到底是什麼呢?這一定是從這個世界的最痛苦的真相開始思考。佛陀來到這個世間真正的目的,就是要眾生斷除煩惱、解脫輪迴。為什麼要斷除煩惱呢?因為煩惱會產生痛苦;而要斷除煩惱、脫離輪迴,就一定要去證悟空性。在佛陀所說的一切經典當中,用最最廣泛的理路來闡述空性的經典,就是《般若經》了。所以,《般若經》又被稱為一切聖者之母、經中之王! [04′28″]</p>
<p>   在佛陀剛成道的時候,由於知道他所證悟的空性之法並不是一般的凡夫所能理解的,因此佛陀在四十九天內默然而住,都未曾說法。後來經由大梵天不斷請法這樣一個因緣,佛陀才開始為最初的五比丘宣說了四聖諦的法門。大家知不知道什麼時候開始宣講《般若經》的呢?就是在第二年,佛陀就宣說了《般若經》。大家可以想一下,在佛世的時候有很多正所化機,他能夠領悟佛陀所說的《般若經》的內義,但是後來的所化機越來越下的時候,如果沒有透過佛陀授記的二大車的闡述,後來的人是非常難以趣入《般若經》的內義的。 [05′35″]</p>
<p>   佛陀授記了龍樹菩薩還有無著菩薩,說他們是不需要依靠其他人所造的釋論,憑藉自己就能善巧地解釋佛陀密意的這種菩薩。佛陀對龍樹菩薩的授記,顯教的部分是在《楞伽經》中說:「<p> 南方毗達婆,具德大比丘,其名稱龍字,能破有無邊。於世宣我教,無上大乘法,成就極喜地,往生極樂剎。<p> 」密教的部分,則在《妙吉祥根本續》中也有說:「<p> 如來我涅槃,經過四百年,有名龍比丘,對教作信益。獲得極喜地,享壽六百歲,大明孔雀法,彼亦得成就。通達諸論義,及無實真義,何時捨身時,往生極樂剎。最後決定證,正等正覺佛。<p> 」這授記裡邊把龍樹菩薩的名字、在佛陀涅槃之後四百年能破有無邊、宣說佛陀的教法、享壽六百歲,最後是往生極樂世界......這個都有授記。 [07′10″]</p>
<p>   佛陀對於無著菩薩的授記,也是在《妙吉祥根本續》裡說:「<p> 於我涅槃後,時已九百年,比丘名無著,善巧經論義。了不了義經,多門善分辨,成說世理主,善辨經論師。彼所著論述,名地之使母,彼由明咒力,將生為慧賢。為令教久住,能作攝經義,享壽百五十,圓寂生天界。<p> 」所以這裡邊說在佛陀涅槃之後九百年,無著菩薩出現,他是一位比丘,他會著述什麼,也是授記得非常地清楚。 [08′02″]</p>
<p>   龍樹菩薩以中觀見解釋了《般若經》的空性之義,而無著菩薩則以三無自性性的唯識見解釋了《般若經》,中觀師和唯識師都一致地認為《般若經》是一切經中最重要的經典!透過二大車對於《般若經》的闡示,後世的弟子們才有一條正確的道軌能夠去探究佛陀在《般若經》中所宣說的密意,就是依靠《般若經》怎麼樣去觀察痛苦的根本,怎麼去修鍊解脫這個痛苦的根本。在二大車著作的論著當中,關於《般若經》的解釋,龍樹菩薩就寫了《大智度論》,逐字解釋了《般若經兩萬五千頌》的經文;另外又寫了《中論》等理聚六論,非常系統地專門解釋空性的意涵。像我們寺院有一些法師背完了理聚六論,雖然它不是很厚、不是很好背,但是非常值得背。法師們背會了,常常再串習一下講述空性的這樣一個句義,比如走到林邊啊,可以背一下;從這個寮房走到上課的地方,也可以背一下,常常串習啊,非常非常重要! [09′31″]</p>
<p>   無著菩薩,寫了《兩萬頌實性決定論》,他完整解釋了《般若經兩萬五千頌》。另外在《瑜伽師地論.攝決擇分》這裡邊也詳盡地闡述了三無自性性的意涵。所以這些論著,都成為了後世的佛弟子學習《般若經》的最重要的依據。 [09′57″]</p>
<p>   回首歷史啊,一千八百多年前東漢的時候,月氏國的支婁迦讖還有天竺的竺朔佛,他們共同譯出了《般若道行品經》,它成為了漢土首度翻譯出的《般若》經典。另外在魏晉南北朝的時候,西域的譯師們也開始依次序地譯出了《大明度無極經》、《放光般若經》,還有《光讚般若經》等《大品》、《小品》的《般若》。其中《放光般若經》在兩晉的時期,經過道安法師等很多祖師的宣講和闡述,一百多年間,《放光般若經》廣弘一時。到了一千六百多年前,鳩摩羅什大師組織了譯場,很有規模地重新翻譯《摩訶般若經》,《般若經》的譯本就超過了之前的譯本,所以從那個時候漢地開始有了略微完備而且比前面更精準的《般若經》譯本。 [11′06″]
<p>   大家好!又到了我們一起學習的時間了,非常非常地開心!希望大家能夠調整自己的意樂,端正自己學法的一個動機——為了利益無窮無盡的有情,必須發起菩提心;發起菩提心之後,才能夠成就正等覺位、才能夠成佛。雖然我們每次聽法的時候都是這樣作意,可能我們會覺得說:啊!我也好像沒有真實的菩提心,但是我們這樣造作菩提心,先好像是假的一樣去造作,造作久了之後,我們就會在學法之前,自然地想要在心裡現出這樣的吉祥的心念。 [00′49″]</p>
<p>   諸佛出世,是為了救度我們在輪迴裡的痛苦,因此才說了八萬四千法蘊,尤其是《般若經》,就是專門為了對治我們輪迴的深重的痛苦才說的。佛說《般若經》的時候,在佛的座下聽法的那些有緣的人,得到了他們該得到的果位。現在經過了這麼多年之後呢,我們還是能夠讀到《般若》,而且還能夠學到《般若經》的註釋——所以就提到佛陀授記的兩位菩薩,他們能夠寫釋論、解釋《般若經》——這是多大的福分!所以一定要造作一個大乘的作意來學習《廣論》,這對我們的無限生命、對我們的現世和來生,都是有著不可思議的一個牽引的力量。所以每次學習的時候,大家不要忽略這個動機的策動。 [01′53″]</p>
<p>   曾經有一段時間,我被問一個問題:是不是在這一次學《廣論》的時候,大家都熟悉的就不用講了,然後講一些可能大家不熟悉的,或者就《廣論》的難點去解決。我也深刻地思考了一下這樣的問題,後來我把這個問題請問仁波切,然後仁波切說:「雖然很多概念、很多道理大家都懂了,但是有沒有改變內心呢?有沒有在內心中生起如你懂了的道理那樣的一個證量呢?如果那樣的證量沒生起的話,還是要講的。」重複地講自己聽聞過的或者已經很熟悉的經典,就是要讓我們在內心中生起這樣的一個證量。 [02′42″]</p>
<p>   不能只想聽一些沒聽過的,對聽過的,心裡就沒有那樣的希求心,甚至有一些麻木感和不認真,或者不恭敬的心態。雖然我們聽過了、我們知道了,可是我們的心有沒有依據它做轉變?就像善知識講的,有沒有在內心中生起那樣的量呢?這個還是我們要對內心觀察的。當我們做這樣的觀察之後,我們就會發現:啊!其實我自己和我所聽聞的那個道理相差地還是很遠的,所以還是需要數數地提醒、數數地憶念。我們在這點上要持續地思考。 [03′21″]</p>
<p>   其實,師父也這樣講過。比如「供養三寶」這件事,所有的佛弟子都知道這件事,我就請問師父:「供養三寶這件事已經講過了,還要再講嗎?」然後師父就說:「唉呀!真如啊,這個講了之後大家會忘的呀!所以一定要重複地講,因為會遺忘,所以一定要不停地提醒!」 [03′45″]</p>
<p>   思考善知識的法語,或者善知識希望我們怎麼學,還要思考一下廣論同學的願望,還有我自己的心願,我們還是決定細細地學過。但細細地學過並不等於時間要拖得很長,我們可以加速。我的意思就是你們不要著急! [04′07″]</p>
<p>   上一講我們講到《般若經》傳進了漢土,鳩摩羅什大師,已經翻譯了《摩訶般若》。所以,我覺得大家應該了解一下玄奘大師,因為玄奘大師當年如果沒有求法、翻譯的話,我們現在可能也看不到這個版本的《般若經》。所以我覺得我們所有的佛弟子應該去了解一下玄奘大師,甚至我覺得有時間我們可以把玄奘大師的傳記好好學一下。因為今天時間有限,我就略略地講一下。 [04′43″]</p>
<p>   一千三百年前,初唐的時候,玄奘大師為了去求法,做了很多很多的準備,包括他鍛鍊身體。他是心意決定一定要去求法的,不管怎樣他一定要成辦。可以說決志——沒有任何疑慮——一定要成辦求法這件事,應該說捨生忘死前往印度求法。他求法的過程,大家可以去了解,很多過程是非常驚恐的,沒有一個極大的勇氣、膽略和堅強的意志,沒有人經得了那種摧殘,應該都退掉了,看到幾個困難擺下去大概就不想走了。但玄奘大師說:「寧可西行一步死,不向東土半步生!」就是這種勇氣哦!才走到了印度! [05′37″]</p>
<p>   他去求法之後,歷經了十七年!歷經十七年!行程大概是五萬里哦!前後到過一百多個國家!那個時候不是像現在有飛機,幾小時就到,全憑走的或者車馬,走了一百多個國家,終於把他要學的學了。學了之後他又回國,為我們帶回了六百五十七部梵夾的經典。這個梵夾是什麼?就是那個時候的書,是用棕櫚樹的樹葉做成的。把棕櫚樹的樹葉剪下來,然後放在滾開的水裡面煮,煮過之後再把它陰乾,陰乾之後再切成長條形的,像長函那樣。就是那個時候印度的紙張。最後的書皮和封底,它就用兩個木板相夾,夾起來,就做成了長條形的梵文的典籍,這樣的梵文典籍,就是貝葉經。當時玄奘大師就帶回了六百五十七部這樣的梵文經典。 [06′53″]</p>
<p>   大師回國之後,深得唐太宗的器重和歡喜,經過唐太宗的支持和號召,集合了天下的高僧,組織成嚴密的譯場,然後進行了十餘年的翻譯工作,他翻譯了七十五部啊!一千三百三十五卷的經典! [07′16″]</p>
<p>   大師到了晚年的時候,才開始啓動《般若經》的翻譯。但是多達六百卷的《大般若經》啊!這是一個非常浩大的翻譯工程,晚年的時候,去挑戰這樣的一個很大的翻譯,也是要相當強的心力的。所以,他想要把自己在印度所蒐集的各種《般若經》集結成一部最完整的《般若經》,然後他想把它翻譯成漢文。 [07′48″]
<p>   在《大唐大慈恩寺三藏法師傳》裡邊就有這樣的記載:東土重視《般若》,在前代雖然也曾翻譯過,但是不夠完備,所以大家就祈請玄奘大師是不是可以重新翻譯呢?因為《般若經》的部頭很大,那個時候大師在長安的事務非常多,很繁忙吧!玄奘大師就擔心人命無常,很難完成這樣的翻譯呀!於是他就向唐高宗——那個時候是唐高宗了——請求:能否到玉華寺翻譯呢?居然得到了唐高宗的允許。玉華寺應該是沒有那麼多人,可能相對地清淨,比較能容易完成這樣的譯著。 [00′49″]</p>
<p>   所以在顯慶四年冬季的十月,大師就帶領著譯經的大德和弟子們,從長安一同出發前往了玉華寺。他在顯慶五年春天正月一日那一天,大師開始翻譯《大般若經》。《大般若經》的梵本共有二十萬頌,經文非常地廣博、非常非常廣。所以一同翻譯的這些弟子們面對二十萬頌的翻譯,大家就有一些想法,想要請求大師可不可以刪減或者省略經文,甚至多次請求大師刪減、省略經文。 [01′34″]</p>
<p>   這個時候,玄奘大師也動了這樣的心念,想要隨順大眾的想法,比如說像前輩譯師鳩摩羅什大師翻譯的《摩訶般若波羅蜜經》那樣,他就是刪除了比較繁複的經文。大師動了這樣的念頭之後,發生什麼事了呢?大家可以想一想。結果玄奘大師晚上就做惡夢了,非常非常恐怖的惡夢,夢見自己身處凶險的地方,還有夢到猛獸來抓他......等等這些夢,然後被惡夢嚇到流汗、顫抖,才從夢中很不容易地脫離、醒過來。 [02′19″]</p>
<p>   當時醒過來之後,就感到非常地驚慌恐懼,他驚慌恐懼的應該是考慮到譯經的一個方式問題。所以他就告訴大家:「還是要依照原典廣泛地翻譯,不刪!什麼都不刪了!」當大師把這件事告訴大家,把譯場怎麼譯《般若經》的這個原則楷定下來之後,當晚大師又做夢了。惡夢都消失了,然後就夢見諸佛菩薩眉間放光,照在自己的身上,心裡感到非常地歡喜和舒適;然後看到自己手裡拿著花、燈,供養著無量諸佛;又夢見自己登上了法座,為大眾說法,被很多人圍繞、讚歎、恭敬;還夢見有人供養珍貴的水果,這都是在傳記裡面記載的。這是一個非常吉祥、很喜悅的夢嘛,大師他也覺得非常非常地歡喜,所以那時候徹底地決定不能再刪減《大般若經》,完全遵照梵本翻譯。 [03′26″]</p>
<p>   在《大般若經》初分中有〈嚴淨佛土品〉,在〈嚴淨佛土品〉說到:菩薩摩訶薩眾為了《般若波羅蜜多》,運用神通、願力,盛滿大千世界的上妙珍寶、諸妙香花、百味飲食、衣服音樂、隨意所生的五塵妙境種種供養,莊嚴說法的處所。這是在經典裡講的。說那些菩薩摩訶薩,都是大菩薩喔!他們為了供養《般若波羅蜜多經》,運用神通、願力,三千大千世界像一個容器一樣,裝滿了上妙珍寶。你可以想我們在地球上有多少珍寶?經典上這樣講,其實我們可以照著這個觀想去供養的。那是要多少種珍寶呢?你可以數數你看過的珍寶,不要看到珍寶的時候只想把它買來,或者只想擁有它。要想一想眼睛看到的珍寶也是可以供養的,比如說供養《般若》,供養所有的佛菩薩。 [04′31″]</p>
<p>   還有什麼呢?諸妙香花,比如說花海,不同顏色、不同形狀、各種香味的一片花的海洋;然後百味飲食,不知道大家是不是能想到百味飲食?就是很多種。全部是非常盛大的一個供養;還有衣服,大家去買衣服的時候,其實這是可以供養的,以前聽師父講過,比如說你去逛街的時候,或者去其他地方的時候,不要只是想:「這個衣服我適不適合穿?」可以念嗡啊吽、可以供養的,因為這是我們眼所見的,是可以供養的;還有音樂,聽到音樂別只是沈醉在音樂裡邊,也可以供養佛菩薩。所以隨意所生的五塵妙境的種種供養,都莊嚴說法的處所。 [05′20″]</p>
<p>   當時在玉華寺翻譯的時候,有一位玉華寺的寺主慧德法師,還有一位譯師叫嘉尚法師,發生了很奇怪的事情,他倆居然做了同樣的夢。其實這種事情在世界上是很不多見的,兩個人能夠同樣做一個夢,是很稀有的事情!兩位法師那天晚上都夢見了玉華寺,那個寺裡邊突然好像變得很廣、很大,非常非常地清淨,也是像經中講的被各種美妙的飾品莊嚴,充滿幢帳、寶輿、花幡,還有伎樂,各式各樣的供品;又看到很多很多僧眾絡繹不絕,手裡拿著華蓋、幢幡,還有各式的供品,一起來供養《大般若經》。他們做夢的時候,夢到這樣的一個供養法會。 [06′20″]</p>
<p>   而且寺院裡的道路,還有寺院所有的牆壁,都鋪上美麗的錦緞,這是很難想像的,在夢裡怎麼設計得這麼美!而且寺裡所有的地面,都布滿了非常非常美妙的花,眾人都步行其上。到了譯經院就更加地勝妙了,幾乎就像經典裡記載的那麼美、那麼莊嚴,完全被眾寶所莊嚴的譯經院。而且兩個人哦!他們都聽到了譯經院裡有三間法堂有人在講法,而且夢見玄奘大師他就在中堂說法,兩位法師都夢到這樣的景象。可能兩位都從夢裡醒來的時候大概是很高興吧,居然兩位法師一起去拜見大師!我想那個場景是怎樣呢?哇!兩個弟子一起來找到老師,分別啟白他們做的夢,居然兩個人的夢是一樣的。當時玄奘大師說:「現在正翻譯到〈嚴淨佛土品〉,諸菩薩一定會供養的,你們看到之後是否相信了呢?」 [07′36″]</p>
<p>   當時長在殿旁邊的雙柰樹,那個樹也很奇特,它居然在不該開花的時候開花了,而且還是一再地開花。每一朵花都開出了六片花瓣,紅白相間,非常地鮮艷、非常地茂盛,讓人一看就是:哇!太喜歡了!雙柰樹老是開花、老是開花,好像一直獻供的感覺,所以當時可能大眾也非常非常歡喜吧!大家就圍過去很高興地議論,都說:「啊!這是《般若》再度弘揚的徵兆,花開六瓣,應該代表六種波羅蜜多吧!」 [08′26″]</p>
<p>   出現了種種的祥瑞、徵兆。但是玄奘大師在翻譯《般若經》的時候,應該還是非常辛苦的,因為太過浩瀚,而且不能刪減,決定不能刪減,所以翻譯的工作一定是非常非常繁重的。在翻譯《大般若經》那個時候,其實玄奘大師自己也非常擔心譯不完,害怕無常到來,所以他就告訴僧眾說:「我今年都六十五歲了,一定會死在玉華寺。而《大般若經》它是非常大部的,我非常非常害怕會翻譯不完,希望人人都能勤奮懇切,不要怕辛苦!」大家可以想像,玄奘大師這樣勸勉大眾,他一定是衝在最前面,一定是最最勤奮懇切,不怕辛苦的,因為他都西行求法經歷那麼多了,譯經的辛苦比之那樣的辛苦可能已經算是沒那麼驚恐了,只是體力的付出可能太過巨大。 [09′34″]</p>
<p>   這樣努力到了唐高宗龍朔三年冬天的十月二十三日,終於完成了!一共翻譯出六百卷,稱為《大般若經》。玄奘大師非常非常地歡喜呀!合掌告訴弟子們說:「這部經典與漢地有緣,我能來到玉華寺,完全是仰賴《般若經》之力!以前我在長安,被許多外緣牽纏著,怎麼可能完成此事呢!現在能夠完成翻譯,一定是得到諸佛菩薩的加持、龍天的擁護啊!這部《大般若經》是鎮國之典、人天大寶,大家應該為此歡喜自慶!」自那個時候開始,我們漢土就有了六百卷《大般若》了。玄奘大師說這是鎮國之典、人天大寶! [10′40″]</p>
<p>   玄奘大師在西元六六三年十月翻譯完《大般若經》,然後弟子們又去請說:「可不可以請翻下一部?」然後繼續翻譯《大寶積經》,剛剛翻譯了開頭幾行,玄奘大師就感覺到自己的氣力不足,於是就停下了譯筆。就在隔年三月,玄奘大師就圓寂了。所以《大般若經》是玄奘大師在晚年,用所有的生命、嘔心瀝血翻譯出的一個宏篇巨著!所以我們到現在才能夠讀到《大般若經》,然後讀到兩位菩薩詮釋《般若經》的時候,我們才有得依循。 [11′30″]</p>
<p>   保存經典、傳承經典,也是歷代高僧的神聖使命。師父常常教誨我們說:「莫將經典容易看!」經典的每一個字、每一個字、每一行,都是譯師們用心血和生命換來的,所以我們豈能不珍惜呀?豈能不恭敬呀?豈能不珍愛執持呢? [12′04″]
<p>   在聽聞《廣論》之前,請大家觀察一下自己的相續,看看自己有沒有準備好聽聞前行。其實聽聞軌理是一個很重要的訓練,在《廣論》上思惟聽聞勝利的那一段,對我們每個常常聽法的同學來說,文字上已經沒有什麼難以理解的,但是是否把它串習成慣修的一個習慣,甚至是聽法之前習慣性地就會思惟聞法勝利?可以觀察一下自己有沒有建立一個這樣的習慣。 [00′47″]</p>
<p>   當我們開始專注地思惟聞法勝利的時候,我們的心就會從緣著現世的一些所緣上移開,緣到法對我們生命的利益;緣到法對我們生命的利益,我們就會審視自我的生命:為什麼我們需要法?法對我們的生命的離苦得樂到底有怎樣究竟的作用?最好能夠轉動內心,讓內心感動。如果思惟聞法勝利常常讓內心很感動,我們就會對法生起一個強大的欲求心。這個欲求心,有人形容就像飢渴難耐的人想要喝水一樣。 [01′42″]</p>
<p>   如何能在我們每天忙碌的這些所緣上,認真地做深度觀察、深度思考,把聞法勝利建立在我們的心續裡,可能大家需要持續地觀察修。每一次都要把自己的心調整為——為了能夠讓無窮無盡的如母有情從痛苦的輪迴中解脫出來,乃至究竟地離苦得樂,所以我們必須去希求佛果。為了這樣的一個目的,我們來學習《廣論》。 [02′19″]</p>
<p>   好!如果大家已經觀察調整自己的心續可以了,那今天應該聽到:「<p> 攝二大車善傳流,深見廣行無錯謬,圓滿道心教授藏,敬禮持彼燃燈智。<p> 」 [02′38″]</p>
<p> 攝二大車善傳流,深見廣行無錯謬,圓滿道心教授藏,敬禮持彼燃燈智。<p>   這個傳承繼續地下來,現在又有一個大善知識,那個大善知識,叫作阿底峽,阿底峽。阿底峽,這個西藏人對於這位尊者的尊稱,他是印度人。對於印度人,相當於我們中國宋朝初年,宋朝初年。他出生在宋太宗——宋朝的第二代皇帝,到仁宗年間,相當於公元的九百多年到一千多年。那麼這個大尊者啊,他是東印度的一個王子,從小的時候就一心想出家,一心想出家,絕頂聰明。我給你們那一本書,你們好好地看一看。他只有十幾歲,只有十幾歲啊,就隨便學了一點世間的學問——因明。哦,這個因明對我們來說很難學的東西,十幾歲他也聽人家講了一遍,就運用這個因明的理論跟人家辯論,把當年印度最負盛名的那個那個大學者辯倒了。哇!好不得了。將來如果你們真正地深入,你們都有機會學因明,你曉得因明這個東西非常難學。這個地方說明,這個阿底峽尊者是何等的聰明。 [04′18″]</p>
<p>   好!這個偈頌又為我們介紹了一位大善知識,就是阿底峽尊者。可能很多老學員對於阿底峽尊者已經非常非常地熟悉了,新學員可能還不熟悉。阿底峽尊者,是我們的傳承祖師裡非常重要的一位祖師,也是對我們恩德非常深的一位祖師。尊者是一位東印度的王子,從小就非常非常地聰明,師父就舉了那個例子:尊者在年少的時候就把當時最負盛名的那個大學者辯倒了,所以他是絕頂聰明的一個人。 [05′06″]</p>
<p>   提到辯論,大家會想到《攝類學》吧!學過《攝類學》的同學有人有這樣的經驗:初學《攝類學》的時候會碰壁,有人感覺彷彿墮入黑暗,有時候覺得自己什麼都不知道,原本自以為了解的東西,被別人一問,發現根本不知道;還有一些原以為自己是很聰明的,到了《攝類學》的時候,如果不順,就會發現自己至極愚笨,自信心大受挫折。要爬過黑暗期,慢慢地找到感覺,再開始熟練地運用,在辯論場上悠遊自在地辯論,那可是要花上很大的功夫啊! [06′06″]</p>
<p>   師父說:「<p> 因明對我們來說很難學的東西,十幾歲他也聽人家講了一遍,就運用這個因明的理論跟人家辯論,把當年印度最負盛名的那個大學者辯倒了。<p> 」在傳記裡寫到尊者十五歲的時候,只聽了一遍《正理滴論》,就把最負盛名的外道辯倒了。《正理滴論》是法稱論師所寫的七部量論之一;七部量論有分主體的三本論以及支分的四本論,《正理滴論》是主體的三本論中最略的一本,它闡述了正現前識、相似現前識、正比量、相似比量、正能破、相似能破、正能立語、相似能立語。 [07′02″]</p>
<p>   因明之所以很難學,是因為它包含了非常複雜的規則,我們要了解或者掌握規則之後,才能夠運用這些推理來辨析自己想要明白的那個深刻的道理。比如說:「聲音有法,是無常,因為是所作的緣故。」這個正因論式符合了宗法、同品遍、異品遍的三個條件,而且必須詳細地討論聲音與所作的關係、所作與無常的關係,還有聲音與無常的關係,才能確定這個論式正確無誤。用正確的論式才能成立出正確的立宗,只要其中一個環節有一點點錯誤,就無法立出真正的正因論式;就算你勉強立出了,在辯論時也會被對方攻難。如果遇到高手,那這點小錯誤就不是小錯誤,就會使整場辯論一敗塗地,因為他一定會發現你的錯處,叫慧眼如炬。 [08′29″]</p>
<p>   所以如果沒有經過長時間努力地學習,反覆地探討,經過彷彿頭腦燃燒般的那種風暴思考,而且徹底地挑戰思惟的極限,我們可能很難學會用這樣的論式熟練地思考,因為你可能會很不順暢,或者偶爾中斷,更何況還要用這樣的思惟模式、這樣的論式與這個領域的高手過招。大家可以想一想,如果是聽了一遍《正理滴論》,就敢去挑戰當時最負盛名的人,而且挑戰了之後還把他辯敗!一個十五歲的少年,很難想像的勇氣和智慧!這在今天聽起來也是一大奇蹟呀!所以師父說阿底峽尊者是絕頂聰明的人,我們應該會心服口服吧? [09′37″]</p>
<p>   阿底峽尊者把深見、廣行傳承圓滿無誤地統攝起來,然後圓滿地傳持下來,所以我們禮敬他! [09′50″]
<p>   他的出身這麼地好,後來出了家,出了家以後他從小乘、大乘、性宗、相宗,無所不精,無所不通,到最後是在印度算起來,印度佛教界的頂尖。他的這個傳記後面有簡單的介紹,我在這裡不說了。他這位大德呀,把上面所說的兩個傳承,兩個師承,一個代表「深見」,一個代表「廣行」的大乘的教法,這個教法、這個傳承善巧無誤的這個傳承,他又把它統攝起來。不但統攝到身上,而且圓滿沒有錯誤,把這個東西歸併起來,這個是佛陀的中心的教授。那麼這位尊者,現在來敬禮他![01′02″]</p>
<p>   聽到這一段,想起來當年第一次從師父的講說中聽到阿底峽尊者幾個字,心裡特別高興;有的廣論同學還合掌,笑咪咪地說:「這名字可真好聽!」那個時候我們找不到《阿底峽尊者傳》這本書,所以大家認真地把師父講的關於阿底峽尊者的描述,一遍又一遍地聽,很想聽到很多阿底峽尊者的故事,尤其是去金洲求菩提心教授的故事,而且想要聽所有的細節。可是那個時候沒有書,也沒有辦法找到,就只能忍著。[01′58″]</p>
<p>   我去拉薩朝聖的時候,在一個寺院裡走到阿底峽尊者的像前,站在尊者的像前靜靜地凝視了很久。那尊阿底峽尊者像塑得栩栩如生,好像要跟你講話一樣。後來又去了聶塘寺,朝禮阿底峽尊者常常帶在身邊的度母像。從聶塘寺回來的路上,還寫了一首讚美阿底峽尊者的讚頌,當時很急,所以就寫在一張面紙上。一路在車上、在飛機場、在飛機上,心裡一直縈繞著阿底峽尊者,縈繞著那個旋律,縈繞著對他的感恩和思念。[02′59″]</p>
<p>   再看這一小段,師父是用非常簡要的語言,為我們清晰深刻地描繪出阿底峽尊者不可思議的教證功德。師父用了「無所不精、無所不通」,來描寫阿底峽尊者學修的深度和廣度,真的令人渴仰!可是無所不精、無所不通,要花多大的精勤才能達到這樣的高度!親近善知識有的時候真的需要跋山涉水去到他的面前,要經歷不同文化背景、不同飲食習慣、不同氣候環境的適應,每一種適應都要花下時間和心力;將兩脈的傳承合於一身而聽聞、而修學,要花下何等的精勤才能夠達到呢?[04′01″]</p>
<p>   你們想不想聽一段阿底峽尊者求法的故事呢?我略講一下吧![04′09″]</p>
<p>   阿底峽尊者出身王族,又絕頂聰明,出家前從勝敵婆羅門、明了杜鵑論師,還有一位是阿嚩都帝這樣的大上師,深入地學習了中觀、密法,應該還有因明吧,很多教授。出家前已經在教理上如此地博學了!這樣的博學多聞,在二十九歲出家後,他又用了十二年的時間親近善知識,跟隨法鎧大師學習《大毗婆沙論》。「毗婆沙」就是有部,《大毗婆沙論》廣泛而詳細地闡示了有部宗的宗義,所以稱之為《大毗婆沙論》。透過對這部論的學習,總攝了四部毗奈耶的要義,還有對法七部的一些內涵。那個時候佛法在印度有十八個部派,而阿底峽尊者成為了通曉十八部派的頂嚴啊!眾中頂嚴! [05′30″]</p>
<p>   可以想像一下,已經達到了在當時佛教裡邊非常非常高的這樣一個成就——十八部派的眾中頂嚴,為十八部派共同尊敬,可阿底峽尊者在想什麼呢?在聽聞了當時所有印度顯密的教法而且修持之後,阿底峽尊者到底想什麼呢?他心裡會為此滿足嗎?在傳記上寫說,他常常在想:什麼是迅速成佛的方便?哪一種道能最快成佛?他也多次地啟問本尊、啟問上師:「什麼是迅速成佛的方便?哪一種道能最快成佛?」阿底峽尊者的上師羅睺羅毱多,就跟尊者說要修菩提心;這個時候尊者也在金剛座得到了多次佛菩薩的指示,說要修菩提心。 [06′45″]</p>
<p>   阿底峽尊者思考的這個問題非常大,是修行最核心的問題。在他的教證功德聞名整個印度的時候,可以想像阿底峽尊者常常是靜夜獨思嗎?還是魂牽夢繞地都在想著這個問題?從阿底峽尊者思考這個問題,可以看到他是那麼想要快速成佛,在用他所有的生命探索快速成佛之道。他為什麼想要快成佛呢?快速成佛能做什麼?由此也可看出,他所有的聞思修都朝向這個目標。這樣皎潔無染的目標,他是在為他自己尋覓的嗎? [07′36″]</p>
<p>   在傳記上寫說,阿底峽尊者為了讓菩提心沒有生起的人能夠生起、已經生起的人能夠增長、已經增長的人能夠達到究竟,所以他在探索這個問題。他在想:那麼到底有誰擁有圓滿的菩提心教授呢?然後就去觀察。當時被普遍稱揚的就是金洲大師,金洲大師是菩提心修法的教主,所以阿底峽尊者萌生了要去金洲那個地方,要到金洲大師的座前聽受菩提心修法全圓教授的想法。 [08′34″]</p>
<p>   阿底峽尊者當時居住在印度,而金洲還遠在印度尼西亞的蘇門答臘,看一看今天的地圖,距離應該還是非常遠的。不知道他是怎樣勸說別人的?雖然他已經出家了,但他畢竟是王子出身啊,家族的人不擔心他嗎?弟子眾們不擔心他嗎?傳記裡沒有詳細地描寫。最終尊者還是決定要出發了,他選擇了水路,選擇了跟熟悉這條路的商人們一同出發,當然還帶著他的隨從和隨行人員。終於開始乘船了!乘船就是要在海上,從印度趣往蘇門答臘。 [09′32″]</p>
<p>   不知道大家有多少人有乘船、暈船的經歷?我曾經坐船去普陀山朝禮觀世音菩薩,開始是坐一艘大船,還算平穩,航行了一天一夜。一夜之後,我們要到洛迦山去,所以就換成了另一條船。結果剛登船就起風了,浪非常地大,船身劇烈地搖晃,浪打在窗子上,根本看不到外面是怎樣的,只能看到水,一波又一波的水。船裡的人就都在驚呼,當時可能所有的人都很緊張吧!我在想:三、五分鐘會不會過去呢?結果晃得越來越嚴重。後來就開始聽到有人在嘔吐了,然後越來越多的人都在吐,過一會兒好像到處都是嘔吐的聲音。我在船裡邊拼命地念觀世音菩薩,努力地克制不要吐、不要吐,拼命地祈求觀世音菩薩。不知這樣搖晃了多久的時間,感覺是全程都在搖。後來終於到了,我沒有吐。船停的時候,開始往那個船口走,下船的時候發現船艙的地面上還有嘔吐的那些東西,可能是太多人吐了。 [11′14″]</p>
<p>   走出船的時候,應該是從船上走到地面上這樣一段距離。我走到地面上之後,居然一步也不能再往前走了,因為覺得整個地還在搖,怎麼也走不了了。後來坐著也不行,就只能直接躺在洛迦山腳下。那個時候看著人們排著隊從我的面前經過,我根本起不來。我在想:剛才在船上大家吐得那麼厲害,一下船都這麼精神就走了;我在船上都沒有吐,下船為什麼我走不了呢?也不用想太多了,好好祈求觀世音菩薩。我就躺在地上,覺得天搖地動很久,然後才爬起來,就上洛迦山了。洛迦山有觀世音菩薩的腳印,很大、很深,聽說好像是從哪裡飛來的一個腳印。 [12′19″]</p>
<p>   想一想喔!我僅僅在船上待了幾個小時喔,就成那樣子了!當時阿底峽尊者的船,在海上航行了十三個月之久。十三個月是多久?一年多啊!都在海上。在海上的時候,傳記裡有寫,他化自在天的天魔不能忍受佛陀教法的興盛,就想要障礙尊者的菩提心,所以就故意朝反方向興風作浪,海風呼嘯、大浪滔天,船身可能是非常可怕地搖晃。那時候是帆船吧!強風吹著高高的船帆,如果是逆向風的話,帆就得收起來,否則如果大風吹得天昏地暗,走到哪裡都不知道的。阿底峽尊者的船,真的在巨風大浪中走錯了方向,可以想見有多麼地驚險啊! [13′24″]</p>
<p>   好不容易又找回了方向,結果在船的前面,居然出現了像山一樣大的一條大鯨魚,那隻大鯨魚就擋在船前面。現在我們大家都想要看到大鯨魚,但是如果你自己在海上航行了那麼久,又經歷了大風大浪,好不容易又找回了航向,哇!前面又出現像一座山那麼大的魚,而且這座山隨時移動,隨時可能會衝過來!這不是一般地凶險,因為那大鯨魚可能比船還大,所以對船上所有人的生命都是一種威脅,而且有可能會讓船整個翻掉的。但是阿底峽尊者為了去求法,沒有選擇後退半步! [14′21″]</p>
<p>   那個時候,還有從空中突然打起的那種巨大霹靂,還有出現了很多很凶險的災害。這個時候阿底峽尊者在做什麼呢?他在殷重地修法,尤其是修紅色閻魔敵的三摩地,他一直在修,最終摧伏了這些障礙、摧伏了魔軍!勇悍、慈悲的阿底峽尊者,就這樣經過了十三個月之久,千辛萬苦地終於到達了金洲這個地方。[15′10″]
<p>   到達了金洲沿岸的時候,阿底峽尊者見到了一些修行人在岸邊修習禪定。一問之下,居然是金洲大師的弟子們,所以阿底峽尊者就在那裡小住了十天。看一下喔!航行了一年多之後,小住了十天,算是休息嗎?可是也沒有休息,因為他們還繼續地向這幾位修定者去問:「金洲大師住在什麼地方呀?金洲大師有什麼教授啊?大師有怎樣的事業和行誼啊?」阿底峽尊者心心念念嚮往著金洲大師,想要到他身邊去求法呀! [01′01″]</p>
<p>   而金洲大師的弟子們,也是經過了這十天,聽了阿底峽尊者的弟子講了阿底峽尊者身語意的功德,還有很多事業的這些狀況之後,對尊者生起了很大的信心。然後就很快地回去跟金洲大師啟白了,說:「哎呀,印度的大智者具德燃燈智來到這個島上了!還帶了一百二十五位弟子,他們在海上航行了十三個月,天魔、大自在天作障礙,都被這位尊者懷著慈悲心降伏了,身語意都安然無恙,現在抵達我們這兒了。而且在岸邊還跟我們十多天在一起,我們都在談論著正法、談論著您的言教,令我們十分地滿意、心悅誠服!現在他們來到這裡的目的,就是想要那位大智者能來到您的座前。」金洲大師的弟子就在跟金洲大師啟白。大智者就是指阿底峽尊者。他們說:「那位大智者能來到您的座前,主要是渴求聽聞三世佛母《大般若經》的教授,生起願行菩提心、修習大乘修心。」還表達說:「希望日夜行持上師您如大海般的教理,祈請能夠慈悲地安排見面。」看一看!金洲大師的弟子們在為阿底峽尊者祈請。 [02′45″]</p>
<p>   這之後一切都很順利。當阿底峽尊者師徒來到了金洲大師的宮殿附近的時候,金洲大師也是非常隆重,他帶領了很多比丘前來迎接阿底峽尊者。當時傳記上有一段非常非常精彩的描寫,說金洲大師帶領著披著同樣顏色比丘三衣、持著蓄水瓶還有莊嚴的錫杖、人看了能夠極大地引生淨信心、每個都像阿羅漢一樣的五百三十五位比丘,還有六十二位沙彌跟隨。乍看之下,就好像佛陀世尊在世時為阿羅漢所圍繞那麼莊嚴、那麼神聖,能讓人引生極大的淨信心還有不可思議的歡喜心。這是金洲大師那一面的隊伍。 [03′51″]</p>
<p>   接著這一面是阿底峽尊者的隊伍。阿底峽尊者為首,然後是常常出現的班智達地藏,還有精通五明的班智達、善巧三藏的這些比丘,個個都是博學多聞,一共是一百二十五位。他們都沒有穿鞋,赤腳而行,而且他們身上穿著袈裟的顏色是喀什米爾紅花所染色的,它是為大眾部所極其讚美的三法衣。因為有一個盛大緣起的緣故,所以阿底峽尊者身邊的比丘們都捧著合量的這種鐵缽,都有持缽,缽底都是非常完好、不能有漏的,大家還攜帶著能盛滿摩羯陀升量的紅銅蓄水瓶。「摩羯陀升量」就是描寫能夠裝多少水的一個量,是個數量詞吧,就是能裝那麼多水的蓄水瓶。想想喔!他們捧著缽、攜帶著蓄水瓶,還持有著佛世尊所讚美的錫杖,完具了一切僧人的形象。而且所有的人還戴著沒有驕慢的班智達帽,手持著白色的拂塵。大家可以想像一下:一百二十五位隨行在阿底峽尊者的後方,每個人的間距都非常地勻稱,不遠也不近,連貫不斷地就像五色的彩虹那樣,向著金洲大師的住處在移動。 [05′39″]</p>
<p>   當時兩邊的隊伍在向對方走近的時候,大家可以想像,如果在街上出現了這樣的場面,那我們一定就趕快去看了!所有居住在金洲那個地方的這些人士,在傳記上寫,還有善神,很多人在看。看到這一幕,對兩位大德的事業還有所有的一切,都生起了很強的信心和歡喜心。兩位大師相見的時候,由於他們宿世就有業緣——師生有的是多生多劫的緣分呀——所以好像本來就認識一樣,已經認識很久了。這裡面有個描寫,就像大樹連根拔起一樣,阿底峽尊者對金洲大師進行了大禮拜,那可能是用盡所有虔誠的禮拜。之後金洲大師就把他的手放在阿底峽尊者的頭上,念誦了很多吉祥頌。這是上師對弟子的一個加持。 [06′46″]</p>
<p>   其實在傳記裡還有特別描寫阿底峽尊者供養金洲大師的一個大寶瓶,說那個瓶子的特色就是腹部大而飽滿,瓶底也是很堅固的,但是瓶子的頸部非常地修長,而且最重要的是它是透明的,能從外面透視到內部。阿底峽尊者在這個瓶子裡裝了金、銀、珍珠、珊瑚,還有吠琉璃等這些寶物,他就是托著這樣的瓶子供奉到金洲大師的手上。班智達地藏還有尊者的這一切弟子眾,也對金洲大師做了供養。 [07′25″]</p>
<p>   然後阿底峽尊者他們就進入了金洲大師的寢宮,供養曼達之後,就請求傳授《大般若經》的內義和心要,就是大寶菩提心。這個菩提心未生者令生、已生者增長的方便,就是大乘道次第圓滿的道體。它是由怙主彌勒傳給聖無著兄弟、由至尊文殊傳寂天菩薩,次第而來的這個圓滿的教授。阿底峽尊者就跟金洲大師做了這樣的祈求,祈請要得到菩提心的教授。金洲大師說:「傳授這個教授需要經歷很多年,你如果能在這個地方久住的話,無論如何我都會傳授。」阿底峽尊者聽了就啟白說:「不論需要多長時間,都要圓滿地聽受!」看一看這個師生的相應度!從那個時候開始,十二年期間,在傳記上寫著金洲大師將總的大乘道體,尤其是大寶菩提心的修心教授,如瓶注瓶地傳授給了阿底峽尊者。他們在十二年間都在一起。 [08′48″]</p>
<p>   經過了十二年之後,阿底峽尊者就要返回印度。說那種感覺就像一個入海求寶的商主,他終於拿到了如意寶珠,可以還歸故里了。但是我在想阿底峽尊者要回去應該會很難過吧,捨不得金洲大師吧!金洲大師還把他小的時候獲得的一尊釋迦佛的金像賜給了尊者,加持阿底峽尊者成為佛教之主。那個時候,阿底峽尊者師徒經過了十二年之後,才又乘船從海上回到了印度。 [09′30″]</p>
<p>   在傳記上有寫一段滿感人的。阿底峽尊者應該是很思念金洲大師、很感恩吧,所以阿底峽尊者沒辦法直接稱呼上師金洲大師的名諱。聽到有人談到金洲大師的名諱,他會馬上阻止,而且立刻站起來磕頭,說:「像我的上師那樣的悲心,別人是沒有的!」然後就會在那裡流淚、哭很久。有人問尊者:「在您眾多殊勝的上師當中,為什麼您對金洲大師這麼感念啊?」尊者回答說:「我什麼功德也沒有,能有一點點賢善之心,全都是因為我這位上師的恩德呀!」阿底峽尊者的行誼,值得我們學習呀! [10′31″]</p>
<p>   阿底峽尊者把他所有的生命都奉獻給了聖教和有情,在他的心續中執持著聖教的大寶庫藏。這個庫藏裡總攝了深見廣行道完整無誤的教授扼要,這些扼要正是我們無死的甘露法藏,我們最需要的、我們最渴望的!他用他全部的生命在傳持著這些傳承,才使得現在的我們能夠聽到這個傳承、能夠學到這個傳承,所以我們真的應該好好地珍惜這一切,應該盡我們一切的努力來學修啊!所以「<p> 敬禮持彼燃燈智<p> 」的敬禮,是發自內心深處最虔誠的禮敬! [11′29″]
<p>   這個地方,我們有一點要說明的,就是前面我們已經了解了,佛陀——這個是圓滿教法的根源,圓滿教法的根源!那麼他這個圓滿的教法啊,是主要的內容是分成功大悲跟大智,或者悲、智二點。對我們來說,這個悲是圓滿我們的功德,說福德;智是所以那個功德能夠得到圓滿的進步,而不是有漏的話,那就是靠那個智慧。換句話說一個是報身因,一個是法身因,那個化身就包括在報身當中的,就這樣。 [00′53″]</p>
<p>   在這一小段裡,師父又再度地提起:佛法分成大悲跟大智,而佛陀是這圓滿教法的根源。「悲」,圓滿我們的福德——福德它是色身因,色身分什麼?報身和化身;而「智」,是讓那個功德能夠得到圓滿的地步,而不是有漏。智慧就是法身的因,法身包括智慧法身和自性法身。 [01′27″]</p>
<p>   佛陀教法的內容主要是分悲、智兩個功德這樣去修。有沒有想到:在我們的生命裡,我們沒有善知識啟發的時候,如果問從生到死求什麼?我們可能會說:快樂呀、真理呀等等,但是到底什麼樣的真理是真正能給我們帶來快樂的,讓我們究竟能夠快樂的呢?如果沒有善知識這樣教我們的話,我們是不會想到要去獲得悲功德和智功德,也就是不會想要去成佛,當然也不會想要去證得法、報、化三身或者四身。 [02′06″]</p>
<p>   在月稱菩薩所著的《入中論》中有這樣的偈頌:「<p> 悲性於佛廣大果,初猶種子長如水,常時受用若成熟,故我先讚大悲心。<p> 」悲心對於我們成就佛果來說,最初就像種子一樣,生起悲心,才能進一步生起菩提心而趣入大乘;在修持菩薩道的過程中,如果沒有不斷串習悲心,是根本無法完成六度萬行,所以在修行的過程中,就像不斷地澆水、澆水,種子才能生長;成佛後,之所以能盡未來際利益眾生,也是由於具足究竟圓滿的悲心。由於在初中後三個階段,悲心都是極為重要的,所以月稱菩薩在造論之初,首先禮讚了大悲心。所以悲心對我們修行人是非常非常重要的修鍊。 [03′16″]</p>
<p>   《現觀莊嚴論》有這樣的偈頌:「<p> 智不住諸有,悲不滯涅槃。<p> 」由於證悟無常等十六行相的智慧,能令有情脫離生死,這是智慧的部分。那麼大悲的部分,就是能令菩薩不停滯在已經獲得的功德上面,而一心尋求圓滿的佛果,一直要精進的,他是不共於小乘聖者的,是什麼呢?學過幾輪《廣論》的同學能答出來嗎?是荷擔利益一切有情重擔的大悲心的作用,也就是增上意樂。雖然在《入中論》、《現觀莊嚴論》上,我們會讀到這樣的偈頌,但是大悲和智慧在我們的生命中到底跟我們的苦樂有一些什麼樣的連結?我們怎麼能夠從心髓裡發出想要獲得這樣功德的一個希求心呢?實際上,沒有善知識的講說、勸導,甚至是手把手地教我們,我們是很難生起的。 [04′34″]</p>
<p>   從一開始師父講《廣論》,到現在講了這麼多,非常非常密度高地提醒我們「悲智」,對吧?「悲智」,一直這樣提醒。一旦善知識在我們耳邊一直提這兩點的時候,其實這個就在我們的心中留下很深刻的印象。我不知道大家偶爾會不會想一想,比如說:我的生命要不要去獲得這種悲智功德? [05′03″]</p>
<p>   所以「悲智功德」在我們的生命裡,如果沒有善知識來醒覺我們的話,我們很少會想這是我要求的。我們也不會想到跟著一個老師要學悲功德、智功德,也是不會現起的。所以每看到這一段,都很感恩師父在我們的生命裡一再地啟發我們要去成就圓滿的佛果,要追求大智、大慧、大自在這樣的一個境界。 [05′34″]</p>
<p>   好,那大家接著聽下一段。<p>   那麼這個東西啊,它演繹成教法時候這樣地下來,下來呢,然後當機慢慢、慢慢地低下的時候,所以留在世間的教法,它也同樣地慢慢、慢慢地層次或者程度的降低。所以第一個是有兩位等覺菩薩,最高的人;再下面的話,次一層。就是像我們現在學校裡面教書一樣的,現在是大學教授,欸,可是現在我們只有中學、小學程度,所以不行,要用中學教員或小學教員來教我們,這個是。那麼為什麼到後來又傳到一個人,他下面這個人又不分成功兩部分,而是說併到一人身上呢?這有它特殊的道理的,這有它很特殊的道理的!因為當一個教法流傳下來了以後啊,它自然而然會有一種偏向,特別講智慧的人啊,偏向到後來,往往把這個方便這一部分會忽視;反過來,講大悲這樣的話呢,他會把智慧忽視。 [06′59″]</p>
<p>   在這一小段,師父解釋說到了阿底峽尊者統攝於一身的傳承,為什麼會變成這樣呢?然後師父在這裡解釋說:對於學人來說,在學習的時候都會發現有一種偏向,比如說講智慧的人到後來會有一種偏向;講大悲的話,也會把智慧忽視。 [07′24″]</p>
<p>   傳承祖師為什麼做這樣的示現,把這兩個傳承統攝在一身呢?是不是還是為了校正我們某一方面的缺失,作這樣的示現。另外,也是再再地顯示阿底峽尊者他的絕頂聰明,他可以學很多很多,這方面也是可以對阿底峽尊者修信的。師父這樣的一個觀點、對於這一段的詮釋,到底要啟示我們內心的什麼問題?想要讓我們發現什麼?我覺得這是這一段的關鍵。 [07′54″]</p>
<p>   從前面那裡可以看到:欸!佛陀講一座法,聽完了之後,在經典裡常常看到有很多有情發菩提心了,然後多少、多少人登地,又怎樣、怎樣……。我們都念了很多經對不對?念經的時候,現在我們能做到專注就已經是很厲害了,把原來煩煩惱惱的事都忘掉,然後專注地誦經就已經覺得很可以了!或者在誦經的時候能感覺到身心皎潔,得到佛菩薩的加持,然後誦完經之後再去學教典的時候,覺得:欸!好像比原來理解更深了!這樣也是很好的。可是佛陀講的經典,當時應機的人聽完了之後馬上就登地的、馬上就發心的。而我們現在聽了之後是聽不懂,所以一定要有這些傳承祖師為我們做詳盡的解釋。師父又再再地揭示了傳承的重要性、傳承祖師的重要性! [08′50″]
<p>   大家好!新年快樂!又到了我們一起學習《廣論》的時間了,這兩天過年了,不知道大家有沒有去給長輩拜年啊?都很開心吧!所以我決定在研討《廣論》的時間,給大家講一個佛經故事,這個是源自於《雜寶藏經》的故事,不知道你們覺得這樣好不好呢?我聽一聽——哦!大家覺得還不錯,那我就開始講囉! [00′36″]</p>
<p>   《雜寶藏經.棄老國緣》——這個故事的名字。說佛陀在舍衛國,那個時候世尊說:「恭敬年長的長輩會有很大的利益——過去沒有聽過的事能夠聽聞並且了解,美名遠揚,被智者恭敬。」諸比丘說:「如來世尊常常讚歎恭敬父母及年長的長輩。」佛陀說:「不只是今天而已,我在過去無量劫中都恭敬父母及年長者。」比丘又請問佛陀說:「過去您恭敬的那些事蹟到底是怎樣的呢?」 [01′32″]</p>
<p>   佛陀開始講說:在過去久遠以前,有一個國家叫棄老國——丟棄的棄。在那個國家裡,老人就要被驅逐到遠遠的地方,不去管他們,就像拋棄了一樣。有一個大臣,他的父親年事已高,按照國法,是應該驅逐到很遠的地方不去管他。但是這個大臣很孝順,不忍心棄父親於不顧,於是想出了一個辦法,就在家裡深深地挖掘了一個地下的密室——挖掘了地下,然後把它建成一個密室——讓父親就住在裡面,隨時地孝敬和供養。當然這一定是秘密的,不能被別人發現的,為什麼呢?因為會犯國法的,如果養父親會犯國法的哦!聽聽這個國家的法令是多麼地殘忍。 [02′46″]</p>
<p>   後來,有一個天神,這個天神就抓了兩條蛇,來到了國王的宮殿上,就問國王說:「如果你能分辨出哪條蛇是雄蛇、哪條蛇是雌蛇,那你的國家就能安定;如果國王你分辨不出來,你和你的國家七天之後都將覆滅。」天神哦!縱然國王威震四野,也不敢惹。所以國王聽了之後,就非常地憂惱,立刻跟大臣商量該怎麼辦呢?然後每個大臣都應該是挖空心思地想也想不出來,所以就紛紛推讓,說他們沒法分辨。於是就懸賞全國——誰能分辨出來,一定會加官進爵,厚加賞賜。大臣回家之後,就去請問父親,父親回答兒子說:「這件事很容易!把蛇放在纖細柔軟的物品上,躁動不安的就是雄蛇,靜止不動的就是雌蛇。」照做之後,果然分出了雌雄。 [04′17″]</p>
<p>   這個天神好像不甘心,又繼續問:「誰與睡著的人相比是覺者?誰與覺者相比是睡著的人呢?」又來問國王了。國王答不出來,大臣也答不出來,於是又懸賞全國,也沒有人能回答。然後大臣又問父親說:「這句話是什麼意思呢?」父親說:「有學位的人,與凡夫相比,是覺者;與阿羅漢相比,就像睡著的人。」就這麼回答。有學位是指加行位到修道位之間的修行者,其中包含了凡夫及聖者,像加行位就是凡夫位,見道位、修道位就是聖者,他們為了斷除煩惱而修道所以就叫有學位。 [05′19″]</p>
<p>   這個問題就又答完了。然後天神可能還不甘心,又來問了第三個問題,天神又問說:「這頭白象有多少斤重呢?」很顯然可能有一頭大白象在那裡。然後可能那頭象太大了,所以大臣們討論了半天,也沒有人知道,太重了,怎麼量呢?又懸賞全國,都沒有人知道。然後大臣就問父親,父親又說了:「把大象牽到船上,看船在池水中下沈了多少,沿著水面畫一條線,然後把大象牽出來,再把石頭放在畫線的這個船上,直到船下沈到同一條線,就知道大象有多重了。」於是就回答了天神,可以用這個方法,所以第三個問題又過關了。 [06′21″]</p>
<p>   可是天神還是不滿足,又來問了第四個問題。天神又問說:「用一捧水比大海還多,誰知道這是怎麼辦到的呢?」群臣們又開始討論,討論了半天,還是不知道,問了所有的人都不知道。所以大臣又去問父親:「這句話是什麼意思啊?」然後父親說:「這句話很容易!如果有人懷著清淨的信心,用一捧水供養佛陀、僧眾、還有痛苦的病人,由於這樣的功德,在數千萬劫中受福無窮。海水雖然很多,但是存在的時間不過一劫而已。所以一捧之水,能比大海多過百千萬倍。」就這樣去回答天神。我解釋一下,為什麼大海存在這麼久?每個世界都會經歷成、住、壞、空的階段,壞劫出現的時候,這個世界的一切都會被破壞,即使是大海水,也會由於火劫、水劫、風劫而被破壞,所以說海水存在的時間不過一劫。大家可以看這一段,這個父親啊,他是深信因果、博學多聞,連成住壞空全部都了解,大家可以想想這個父親,到底是什麼人呢? [07′56″]</p>
<p>   天神呢?第四個問題被答了,天神還是不甘心,又來問了。這次天神變成了一個飢餓的人,餓成什麼樣呢?瘦骨嶙峋、形銷骨立,就是非常非常地可憐,就問說:「在這個世間上還有人比我更加飢餓、更加貧窮、更加瘦弱、更加痛苦的嗎?」大臣們又開始左思右想,答不出來,這可能已經到達了一個頂點了。所以大臣又去問父親了,父親的答案是什麼呢?大家可以聽一聽,父親說:「世間上有人慳貪嫉妒、不信三寶、不能供養父母師長,將來之世會墮入餓鬼道中,百千萬年都聽不到水還有飲食的名字;身體像山一樣,腹部像山谷一樣,喉嚨像針孔一樣,頭髮就像錐刀一樣,而且纏住身體一直纏到腳,只要身體一行動,四肢的關節都會燃燒。這樣的人比你的飢苦百千萬倍還苦啊!」就用這一番話回答天神。 [09′28″]</p>
<p>   現在被問幾個問題了?上述這幾個問題,你們有沒有想啊?有沒有答上?有沒有答案?然後天神還不滿足,又開始第六個問題了,大家考慮考慮哦!這個天神又變化成一個人,這個人手腳都套上了枷鎖,連脖子上都掛著鎖鏈,而且全身冒火,舉體燒爛,又問說:「這個世界上,有人比我更痛苦嗎?」國王和大臣都沒有人回答,沒有人知道,也答不出來。你們想一下,你們會想什麼呢?這個時候,大臣又回去問父親了,父親回答說:「世間上有人不孝父母、忤逆傷害師長、背叛丈夫——這當然指妻子,然後誹謗三寶,來世就會墮入地獄,地獄裡有刀山、劍樹、火車、爐炭,身陷沸屎之河,還有刀道、火道——就是那個路上都是倒刺的刀、燃燒的火,受無量無邊的痛苦不可計數,他比你痛苦可是超越百千萬倍呀!」就這樣如此回答天神。 [11′01″]</p>
<p>   然後天神又變化成一個女人,相貌端嚴美好,超越世人,又問說:「這個世間上,有人像我長得如此莊嚴嗎?」國王及大臣都沈默了,答不出來,所以大臣又去問父親了。父親當時就回答說:「世間有人,信奉尊敬三寶、孝順父母、喜好布施、忍辱、精進、持戒,能夠投生天上,相貌端正,出眾又美好,超過你百千萬倍,與他相比,你就像瞎眼的獼猴一樣。」就用這番話回答天神。 [11′57″]</p>
<p>   這個問題答完,天神又來了,拿了一塊正方形的、真正的檀香木,然後就問說:「哪一邊是樹根的部分?」國王及大臣的智力有限,答不出來。這段在佛經上沒寫懸賞全國、有誰回答,多半都是沒有人回答。然後大臣就回去問他住在地下密室裡的父親,然後父親說:「這很容易了解,把檀木放在水裡邊,根的部分一定會下沈,然後尾部一定會上浮。」就用這句話回答天神。 [12′40″]</p>
<p>   後來,天神又牽來兩匹白馬,身、色都一模一樣,天神又問說:「哪一匹是母馬,哪一匹是小馬呢?」君臣都答不出來。然後大臣又去問父親了,父親回答說:「給牠們草料,讓牠們吃食,若是母馬,必定會把草推給小馬吃。」 [13′11″]</p>
<p>   國王回答了所有的問題,天神非常地歡喜,饋贈國王大批的奇珍異寶,跟國王說:「你現在的國土我當擁護,讓外敵不能侵害你的國家。」 [13′29″]</p>
<p>   國王聽了之後,龍心大悅,就問大臣說:「這是你自己知道的,還是有人教你的?因為你的才智,才得以保護國家的平安,我獲得了那麼多的珍寶,又被天神擁護,這都是因為你的力量。」於是大臣就回答國王說:「不是臣的智慧,希望國王施直言無憚的恩德,我才敢跟國王您一一稟告。」國王說:「即使你今天有萬死之罪,還尚且不問罪,何況是小的罪過?」於是大臣啟稟國王說:「我們這個國家有一個制度命令,不允許孝養老人。而臣有一個老父親,我不忍心遺棄他,所以冒犯了王法,把父親藏在地下密室裡面。臣之所以能回答那些問題,都是父親的智慧,而不是我的力量。只希望大王的國土之內,都能准許孝養老人。」 [14′46″]</p>
<p>   國王聽得非常地讚歎,心生喜悅,就奉侍大臣的父親,而且尊敬他,把他當成老師。然後國王說:「您救了全國上下所有人的性命,這樣的利益不是我所能了解的。」於是就宣布命令,昭告天下說:「從此以後,不允許棄養老人,要孝養老人。誰不孝順父母、不敬師長,當判為大罪!」 [15′21″]</p>
<p>   佛陀講完過去的因緣之後,佛陀說:「當時的父親,就是我;當時的大臣,就是舍利弗;當時的國王,就是阿闍世王;而當時的天神,就是阿難。」 [15′41″]</p>
<p>   故事講完了,大家在想什麼呢?像舍利弗,他在因地當中,在那麼艱難的狀態下,冒犯王法也要孝養自己的父親。可是在今天,如果我們不孝養父親的話,是可能會被王法制裁,也會被社會的道德人士所譴責。所以我們生在這樣的一個時代,孝養父母,是沒有人阻礙你的。可是在我們的生命中,看看自己和周圍的人,孝養父母、尊敬師長這件事,做得如何呢? [16′24″]</p>
<p>   所以在過年的時候,多去感恩自己的父母,如果自己的父母已經不在了,就好好地念經,為他們做一些功德,迴向給他們。 [16′36″]</p>
<p>   聽了這樣的故事,大家可以想想,前面非常像腦筋急轉彎,也轉不過來吧!所以想一想釋迦佛在因地的時候,哇!不僅僅是博學多聞,真是智慧如海呀!所以,發願生生世世能夠皈依佛、皈依法、皈依僧,能夠在這個世界上自作教他,然後行十善法,好好地守持律儀。 [17′06″]</p>
<p>   在過年的時候,受持五戒的同學,尤其是受持了不飲酒戒的同學要注意哦!在大家親朋好友相聚的時候,你要特別清楚,你如果受了不飲酒的戒,不要忘記哦!另外不要殺生,多吃素對身體比較好。 [17′25″]</p>
<p>   再次地祝大家新年快樂、諸事大吉! [17′31″]
<p>   為什麼會導致學這個、學那個有偏失呢?下面一段師父會講得很清楚,大家接著聽。 [00′07″]</p>
<p>   譬如說我們世間看很多事情,有很多人講那個事業的——佛法事業,講佛法事業,事業推展得很廣啊,但是他跟法慢慢地往往有點脫節現象。另外一種呢,他就講如法,講如法但是他那個事業慢慢地就慢慢地縮小,這我們就不大容易產生圓滿的這種答案。那麼假定自己修行來說,那個沒有關係,如果是你想把那教法的圓滿地傳開的話,這個就不足,這樣。所以在任何一個時候,總要把這兩樣東西能夠配合、調和得恰當,那麼這個教法才圓滿。 [00′51″]</p>
<p>   到這一段要觀察自心了。師父說:世間看很多事情,有很多人講佛法事業,比如說佛法事業推得很廣啊,然後往往就跟法慢慢有點脫節。這個不知道大家作何感想?佛法事業推得很廣,為什麼跟法有點脫節了呢?不是很如法才能很廣嗎?為什麼會脫節呢?你們的答案是什麼呢?另外一種就是講非常地如法,但他的事業就慢慢地縮小,師父說:假定你自己修行的話沒關係,如果想要把教法圓滿地傳開的話,有這兩種問題都是不行的。「<p> 所以在任何一個時候,總要把這兩樣東西能夠配合。<p> 」注意!師父講了:「<p> 調和得恰當。<p> 」 [01′47″]</p>
<p>   現在我們來觀察一下,師父說第一種現象——「<p> 講佛法事業,事業推展得很廣啊,但是他跟法慢慢地往往有點脫節現象。<p> 」佛法事業推展得很廣,這句應該並不難理解,但是跟法慢慢有點脫節到底是什麼呢?首先要思考什麼是法?法的定義?法是具有救護和悲憫的功能。救護和悲憫什麼呢?我們這顆充滿煩惱和痛苦的心。所以談到法,一定是要拿這個法向內調伏我們的心、調伏我們心的煩惱。如果說向內調伏煩惱的話,拿什麼調伏呢?拿一個標準。什麼標準呢?比如說法律是標準,道德也是標準,還有佛說的戒律也是標準。戒律的核心就是不要傷害其他有情,止息我們這顆心向惡的那種力量,一定要扭轉它,讓它向善,在一切緣起點上都要向善,讓我們的心去造作善的意樂,身口也去造作善業。 [03′22″]</p>
<p>   如果事業推廣得很廣的時候,忽略了內心捨惡取善的功夫,慢慢地滋長了內心的慢心、名利心,我執越長越大,位置也越來越高了,常常會看別人的毛病。看久了之後,就會習慣看別人都不對。如果看別人都不對,生起了利他心還好;如果看別人都不對、都是對不起自己的,而且自己是最厲害的,恭敬三寶、孝順父母、恭敬眾生,這些最重要的原則如果沒有辦法精進地執持,甚至忙著、忙著,這些都慢慢模糊了,只剩下把事情做大、把事情做大、把人聚多、把人聚多,卻忽略了法的清涼的特質。如果一個事業體,各個部門之間不能配合、都想壯大自我,甚至產生惡性競爭,其實這樣在裡邊工作的人們就會越來越不快樂、越來越有壓力,因為宗旨模糊了,這樣跟法真的就會慢慢脫節了。 [04′46″]</p>
<p>   提到法,一定要有聽聞的時間、思惟的時間,而且對境一定要練習提正念,過正念的人生。我們的事業,就是造集善業,一群人在一起斷惡修善,扭轉惡習,培養善妙的習氣,一切境界上都要修鍊自己的心,所以我們應該對法要很熟練,一定要有學法的時間。所以現在大家天天都能夠學《廣論》、天天學法,真的非常地好!我們常常聽經典上佛菩薩的教言,我們就不會得到一種失心瘋——瘋到哪裡去了?瘋狂地迷戀事相,忽略了對內心的注視還有調整。所以隨喜大家能夠堅持這麼多年聽聞佛陀的教法,非常認真地聞思,而且基本上養成了一個聞思的習慣,我們會一直小心自己不要變成像師父說的這種跟法脫節的現象。 [05′52″]</p>
<p>   一旦發現只重視表象、忽略內心的惡習出現的時候,就要趕快調整,這樣就不會脫節。脫節一定是從心念上先開始的,沒有及時發現,所以絕對不能夠忽略自己的心啊!這顆心從推展佛法事業的動機開始,就要安立好,絕對不能忽略發心!發心是非常容易忘記的一件事情。發心很重要!串習得不熟練,就容易忘記。所以無始劫來,我們是不是串習得最不熟的就是發心吧?不然為什麼那麼容易忘記呢?我們不認為發心對我們的生命有多重要。每節《廣論》課都要發心啊!如果我們聽了二十年了,那你就練了二十年了。隨喜自己吧!練了二十年發心喔!也隨喜很多同學!這個善行可不容易啊!發心就是一個方向,它不是為了名聞利養,而是為了淨化煩惱、對治我們的無明,徹底消滅痛苦。為了生起真實饒益一切有情的心,哪怕只有一個念頭,都會累積不可思議的資糧! [07′04″]</p>
<p>   由皎潔的發心開始的佛法事業,一直在一個對自心的煩惱的對治中開展的事業,是否可以做到事業越大、煩惱調伏得越多、利益的人越多呢?而不是很多人一起跟佛法脫節了,自己浪費了生命,虛度了人生,在值遇佛法的時候,沒有好好地改變自我的生命,這是多麼大的損失啊!我們都自稱是學佛的,自己不可不慎啊! [07′36″]</p>
<p>   無始劫來,我們習慣在外境上去找尋自己苦樂的原因,甚至是達到苦樂的方法,所以說:「眼睛長在臉上,就一直看著外面,耳朵也聽著外面。」我們會常常在外境上去尋覓自己離苦得樂的原因和那個結果,所以跟很多人在一起互動的時候,常常把自己痛苦的原因加諸在別人身上。但是佛陀告訴我們,修鍊自心的解藥是在我們自己手裡邊,我們這個痛苦的心,要吃什麼樣的藥才能夠快樂呢?就是要拿法來向內調伏。 [08′29″]</p>
<p>   在剛剛開始訓練的時候,我們會常常忘記用這味法藥:我們會常常還是按著原來的習慣,這條路走得太熟了,一走,就馬上眼睛去看別人、耳朵去聽別人,然後就覺得是外境上出了所有的問題,我的心沒有太大的問題!所以我們就在外境上錙銖必較,花很多時間去諍論、去對抗,卻沒有反思一下自己的思路、自己的習氣有什麼問題。 [09′00″]</p>
<p>   一開始把這個方向向內扭轉的時候,是不太習慣,甚至是看不到自己有什麼問題。但是在班裡邊多多地學習,然後再承擔一些事情,從承擔一點點,然後慢慢承擔越來越多,慢慢地讓自己的心裡面多放一些人、多放一些人,在不停地學習這些教理的過程之中,我們就會訓練向內觀察的這個習慣。 [09′27″]</p>
<p>   不知道諸位現在在各自的班裡訓練得怎麼樣了?在家裡訓練得怎麼樣了?現在你沒走神吧?你有在聽嗎?你有在聽嗎?不要走神喔!訓練得怎麼樣了?是小有成就呢?還是一塌糊塗呢?還是越訓練你會覺得失敗率越高呢?無論是怎麼樣的一個成績,現在的你就是在聽,在聽教理呀、在修學呀!所以要堅持下去,堅持就會練習會的,因為這個方法是正確的、是清淨的——傳承是清淨的,很多人依著這條路修行成功了!為什麼你、我不行呢?所以堅持練下去,我們就能夠讓我的心跟法緊緊地連結在一起,絕對不要脫節!而是慢慢地在很多事項之中,把法放到自己的心上去觀察,一邊忙事情、一邊去觀察內心,練久了之後就越來越熟了。 [10′36″]</p>
<p>   熟了之後就輕鬆了,因為費一點點力氣就可以好像進步很大;就不會費了很大的力氣,怎麼好像進步很小呢?其實對一個惡念的控制力的成功,也是很殊勝的。比如說你對別人笑不出來,你想跟他生氣。但是想想:「不行!要觀察內心,我要對別人觀功念恩、努力地微笑一下!」這個努力也是很值得稱讚的,因為畢竟是我們向調伏內心的修鍊功夫的一個進展,哪怕只有一吋、只有一分、只有一秒,都是非常值得恭喜的!如果你做了這樣的努力,那隨喜你喔! [11′28″]
<p>   推廣佛法事業,就會想如何讓更多的人能夠學習佛法?就可能辦很多活動啊、去做計劃,這一群策劃活動的人非常地疲憊、非常地忙。忙著忙著之後,就只在意:「欸,又有多少人學了?」盯著那個數字,忽略了什麼呢?忽略了自己內心每一次的動機都是為了利樂他人、都是為了向內調伏。這個用法觀照內心的功夫,在一忙亂的時候可能就沒有那麼靈光了,尤其是很多人一起忙的時候,時間卡得滿緊的,到那個時間就必須做這個、做那個,就像沙盤推演,它是滿嚴絲合縫的一個集體活動。在這個集體活動之中難免磕磕碰碰的,有各種各樣想法的不一樣、習慣的不一樣,甚至萬一出了一點小問題,大家處理的方式也都是不一樣的。這樣的話,就要很多人一起完成一件事情,有的時候一不小心就把煩惱給勾出來了。 [01′01″]</p>
<p>   這個時候如果忘記了法對於內心的攝持和調整,我們就會陷入彼此諍論、內心裡對抗、悄悄生悶氣,甚至也沒有溝通的動力......許多煩煩惱惱的心境就都會顯現,也會出現煩惱的過患。這時候我們就會發現:啊!我的煩惱一做事情就這麼重,好像什麼都能夠引生不愉快的感覺。當然這裡邊也有居士是另一種,就是承擔的時候很生歡喜心,但是我們這裡邊主要要調整的是前一種。所以在這個時候,當我們發現我們內心煩煩惱惱、很躁亂的時候,師父就教誡我們一定要把法的速度跟上,速度!所以叫「法人」,就是要法鏡內照,要向內調伏。這時候一定要想起來憶念法,用法來調伏,而不是習慣性一味地怪自己周圍的人。 [02′17″]</p>
<p>   我們會發現我們很需要和人在一起,可是和人在一起很麻煩;完成一件很大的事情,一個人是完不成的,要很多人和自己配合,如果是一個人的話,可能要面對很多困難,比如說生病的時候,我們自己躺在床上,沒有人是不行的。那麼一群人一起進步,一起來成辦一個事情,也一定要用法來調伏內心,才不致於大家湊在一起吵架,甚至沒有管好自己的心、沒有管好自己的身口,互相地傷害。所以當我們感到痛苦的時候,能不能想起來這可能是不善業導致的?我自己是有責任的!應該憶念法,用法的鏡子自己照一照,透過修鍊自心的方式去對付痛苦、去打擊內心的痛苦。 [03′23″]</p>
<p>   而不是跟別人互動現起痛苦的時候,一味地在對方身上找自己的苦因,因為這樣找來找去你一定會找到對方的錯。找到對方的錯,我們怎麼能夠讓對方認錯呢?有的時候認錯的方式可能你自己也是不接受的,這樣處理起來,非常地麻煩、非常地複雜,因為別人的心不是你的心,別人的人生也不是自己的人生,你如何讓他符順於自己的心意呢?如果是對付自己的心的話,就比較容易,因為你可以看到你的心。透過觀察、透過法來調伏自己的心,你是可以有一定的自由度的。 [04′05″]</p>
<p>   所以一旦常常練習用法來向內調伏,所謂向內調伏就是自己的痛苦要想法自己處理好,自己去面對它,而不是自己一有痛苦的時候,就一定要怪很多人,而是你自己要面對這個痛苦,去處理它。用修鍊自心的辦法來對付痛苦,憶念法,讓法在我們的心上顯示它的功能——悲憫、救護,來對付痛苦。這樣的話,我們就不會一忙事業就跟佛法脫節了,也不會要修行就必須不要管太多。比如說忙事業的時候,哇!發現煩惱出現了,趕快調!這樣的話,出現多少次就調多少次,實際上這也是一個越來越緊,而不是脫節的過程。 [04′52″]</p>
<p>   然後師父說的另一種現象就是:「<p> 他就講如法,講如法但是他那個事業就慢慢地慢慢地縮小。<p> 」我們一定會問說為什麼?為什麼如法,事業就會慢慢縮小呢?可以觀察一下自己的心,如果我們很在意自己的心有沒有生煩惱,我們就知道大家在一起做一個善行,很容易生煩惱。而自己一個人靜靜地看書、打坐,不要管太多事,好像很容易控制內心的樣子;人一多心就亂,人一多就沒法修行。可以想一想:如果學校的老師們都這樣想的話,每個班裡的孩子越少越好,那未來的孩子們怎麼辦呢?人們好像彼此會互相打擾,而不是互相幫助,大家都要一個獨立的空間,越清淨越好。 [05′53″]</p>
<p>   如果師父想要越清淨越好的話,我們應該就聽不到一百六十盤的《廣論》帶了。師父是一位高僧,為什麼他要選擇關心土地、關心教育、關心飲食、關心各方各面的我們的生活?這樣心不是會被攪亂嗎?如果他只是想要自己清淨,現在的你我還不知道在哪裡呢!如果他覺得人越少越好,那也不用建立僧團了!僧團那麼多來自不同地方的出家人,生活習慣都不一樣,那大家聚起來不是讓師父很累嗎?那也不用建立法人,也不用開展法人事業,因為這都很累,都是很多人在一起,很麻煩的! [06′43″]</p>
<p>   可是看一看師父,他在他每一篇的日記裡都那樣嚴格地要求自己、審視著自己的一言一行,兢兢業業地耕耘著自己的內心。幾十年如一日,師父示現認真地學習教典,嚴格地持守戒律,然後再開展僧俗的事業,師父的示現是不是最好的答案呢? [07′14″]</p>
<p>   如果有人說:「沒錯!師父的示現是最好的答案!但那是師父,他是一位高僧,他能做到,我做不到啊!」大家想一想這個該怎麼回答?最近攝類學結業的同學有答案嗎?還沒學的有答案嗎?用學過的《廣論》的理路也可以回答。 [07′43″]</p>
<p>   那我再問一個問題:人多不能修行,人少就一定能修行嗎?有時候家裡只有兩個人,就沒有家庭戰爭嗎?管別人會生煩惱,不管別人就會斷煩惱嗎?如果修行人一上手,就不願意管別人、不願意關心別人、不願意為大眾做點事情,怎麼樣能夠擴展我們的心,關心到更多、越來越多的有情?甚至關心到所有的如母有情?怎麼趣向菩提心呢?那麼為什麼我們還會喜歡菩薩呢?是真的喜歡嗎?哎呀!因為我是凡夫啊!師父說:「正因為我是凡夫,所以才要學習佛菩薩。正因為我是凡夫,我才要努力學習、努力改變自己呀!」我是凡夫,不是不上進的理由,而是應該上進的理由啊!不是這樣嗎? [08′50″]</p>
<p>   再回到阿底峽尊者的示現,看他把所有的傳承都集聚一身的時候,我們應該向阿底峽尊者學習。所以師父說:「<p> 在任何一個時候,總要把這兩樣東西能夠配合、要調和得恰當。<p> 」像有的人說:「啊,事情一幹多了之後我就生煩惱,那索性什麼也不做!」就坐那兒看自己的心。這樣的話,有人就說:「他不發心。」有人就辯論說:「我坐在這裡,我就沒發心嗎?我可能也是發心了!」這些討論是可以的,但終歸是要向內調伏的。比如說不去承擔很多,會不會真的就少生煩惱呢?習氣、毛病不出來,就有機會調伏嗎?也不一定。忙多也好、忙少也好,最重要的問題是——我們能否把所學的教理結合內心,向內觀察。 [09′43″]</p>
<p>   無論是很多人在一起的時候,還是自己一個人的時候,都能夠真心地把師父講的這個法向內觀察。對於其他人懷著一種謙虛學習的心態,謙卑地學習;對自己懷著一個很深的警惕,比如學《廣論》,還有推展各種事業,要考慮考慮是不是有在膨脹我愛執?是不是把佛法事業做成了去拓展自己的事業、自己的能力,忘記了這是一個緣起之法,是因為佛陀的加持力、眾生的善根力,還有很多很多緣起出現的吉祥的事情。一旦不去想緣起的話,就會發現自己在這個善業裡好像很突出的樣子,自己好像做了很多,但實際上沒有上師的加持,我們在行進於無上菩提的路上豈能前進一小點兒呢? [10′37″]</p>
<p>   所以一旦把這所有進步的緣由歸就於上師三寶的深恩,甚至眾生的深恩,這樣的話,我們每走一步,都會讓我們的虔誠更加地深刻、更加感到自己有很多不足。這個不足不是自卑,而是看到自己的不足了之後要發願,讓我的不足能夠得到全面地改善,而不是看到不足馬上低落,說:「好,那我什麼也不幹!」不是這種心思!這種已經是過了,要被破斥的。 [11′08″]</p>
<p>   所以事業廣了之後,未必慢慢地就脫節;特別特別在意法能夠清淨地傳承下去,也不一定事業會變小。師父其實想要立出一個這樣的宗,對吧?但是現象是這樣的。所以說我們就要回歸自心去觀察一下:我是不是有這樣的毛病?如果我有這樣的毛病,我就要改善。而不是聽了這段,說:「啊!對、對、對、對,某某人就是這樣!我看他這麼多年,他就是這樣子!」這個念頭一出來你就知道說聽法聽錯了,典型的法鏡外照。這個要看自己!要看自己! [11′45″]
<p>   好,那我們再聽下一段。<p>   同樣地,我們學的時候也是如此,是,我們每個人有我們的不同的根性,可是假定說你在這個地方,你能夠注意到這一點的話,你這麼走上去的話,最省事、最圓滿。偏重智慧的人,是不要忽視這個方便;偏重方便慈悲的人,也不可以忽視智慧。要不然我們很容易地了解,你講處處方便,現在的話叫「方便出下流」,完了!到外面來看,出下流的話,看得一團糟,實際上呢對我們來說的話,這結果是墮落。儘管你一番好心,說我要弘揚佛法,我要修持佛法,修了半天到地獄裡去了!那不修還好耶!所以,任何時候要把這兩樣東西圓滿地配合,這是很重要的。 [00′59″]</p>
<p>   提到根性,師父說我們每個人有我們不同的根性,根性有利鈍的差別——有人比較聰慧,有人比較愚鈍。體現在學法上,可能就會有快慢之分。但萬一他愚鈍,但是他拼命用功,不停地廣泛學習教典,深入經藏,也可能變成利根。不同的根性,需要不同的引導;不同的習性,造就了不同的根性。我們所有的人都希望自己能夠變成利根,如何能用很少的力氣,就能夠達到很高的成就?沒有人不想要這樣修行,可有的時候用了很大的力氣,恰恰是反而倒退了。 [01′50″]</p>
<p>   師父說如果在這個地方能夠注意這一點的話,那麼你走上去就變成最省事、最圓滿。偏重智慧的人,不要忽略方便;偏重慈悲的人,也不可以忽視智慧。注意!他說:「<p> 假定在這個地方,能夠注意到這一點的話。<p> 」這一點是哪一點啊?哪一點啊?是不是偏重這樣的要注意?但是如何能知道自己是偏重哪一方面的?我們自己看自己,會不會看得很清楚我是偏重哪一方面呢?比如說有一些人,我們會很明顯地看見他好像情緒起伏比較大,情緒起伏較大是偏重什麼的?也不知道,就是看到有的時候會好像心裡不太平靜,容易痛苦、也容易歡喜,對吧?有這種類型的。還有喜怒不形於色的,看似平靜,有一天突然山洪暴發,嚇人呀!我們覺得這個人一向平和,怎麼會突然變成這樣?所以到底一個人的習性是怎樣的,認識自己的習性,並非易事!所以當我們觀察自己的時候,還有諸多疑惑,有時甚至完全看不明白的。這個時候,一個過來人的指導,對於我們是多麼地難能可貴啊! [03′20″]</p>
<p>   我們自己有一些什麼樣的偏失,通常都是要去請問善知識才會更精確地了解。比如這一段時間自己努力、很用功,然後很開心,好像對法有很多受用的樣子,但是到師父那兒一問,有可能師父會說:「啊!已經過頭了!」然後師父說:「自己覺得很高興的事情,可能要把它拆掉,去做另一件事情。」所以這個地方就再再地顯示了修行的路上是不能離開善知識的,因為善知識就會校正我們的根性還有習性上的一些弱點;因為自己是看不明白自己,我們對於自己引導自己是沒有經驗的。 [04′09″]</p>
<p>   親近了善知識,善知識就會告訴我們到底要如何修行自己,就像一面鏡子,讓我們不停地、不停地看清楚自己到底有哪方面的偏重、有哪方面的忽略。習性,想了解自己的習性,自己給自己下定義,自己知道什麼地方不足、什麼地方超勝,又知道如何改變,其實這並不是一個容易的過程。一開始如果沒有過來人指導,很容易自己給自己開藥全開錯了。所以怎樣能夠從偏重某一方面調整過來,變成是圓滿的一個調配,而且是任何時候都是圓滿地配合,這是相當有難度的。沒有善知識的指導,絕無可能!怎麼可能在任何時候都能夠做到圓滿的配合呢? [05′15″]</p>
<p>   比如說他偏重於在乎別人的感覺,好像比較容易理解別人的痛苦,比較容易看到別人難過的那一點;但是他過分地發展了這個心——體諒別人的痛苦之後,是否會疏忽原則呢?比如一個吸毒的人,你幫他戒毒的時候,如果你太在乎他毒癮發作的痛苦,一發作了,你就受不了了,無法堅持,最終還是幫不上他戒毒的這件事。所以,這種在乎,是在乎他一時感覺上的痛苦,卻忽略了長久以來被惡習折磨的痛苦,所以這種在乎是短視的,這種所謂的體諒是帶有毒性的,並不是真正意義上的體諒和關心,大家認為呢? [06′13″]</p>
<p>   比如說關愛教育,有人就問我說:「如果都講關愛教育,原則怎麼辦?」其實我心裡的答案是:如果不關愛,談何原則呢?關愛本身也是原則。關——關注他的眼前和未來的方向;愛——與慈悲同義,拔除他的痛苦,給予歡樂。所以關心生命的方向,要建立崇高生命的理想、正確的離苦得樂之路,其實也就是正知見的建立。在建立的過程之中,去體諒學生的難處,陪他一起找方法、突破難關、離開痛楚,走上康莊之路。 [07′03″]</p>
<p>   你只有對一個有情特別特別地關注之後,你才能把一些底線性的、原則性的東西輸送給他,而不是強加給他,讓他能夠接受。所以關愛教育是第一步。可是,有一些同學就把關愛教育弄成是可以無底線地縱容,或者好像給別人很多方便,這樣的關愛其實已經不叫關愛了,可能叫禍害!這樣的教育也不是教育,它已經失去了教育本身。 [07′35″]</p>
<p>   因為所謂的教育,我覺得跟慈悲的特質是一樣的,是給予歡樂、拔除痛苦。給什麼樣的歡樂,拔什麼樣的痛苦呢?究竟的苦和樂不能只從一時的感覺來判斷,一時快樂,並不代表是真正的快樂、以後都快樂,也並不一定是快樂的因。究竟的快樂一定是無罪的快樂,不會產生後患的歡樂,善知識給予我們的就是這種快樂。師父說:只要我們不放棄,可以陪我們走完最後一程。其實這就是一個菩薩的誓言啊!我發現很多很多弟子被師父的這個誓言所鼓舞,當我們無力前行,被境界的苦楚逼迫,瀕臨退心的時候,都是師父的這句話給了我們自己莫大的援助,跌倒了再爬起來,不停地向上!師父教導我們捨惡取善,原則要非常清楚,縱容惡習的所謂關愛是錯誤的;只講原則而沒有去體諒他人、為他人著想,也會讓學的人非常地辛苦,甚至退心。所以,如何將生命的原則和動人的關愛完美地融合,真的是一種長久的修鍊。 [09′01″]
<p>   在跟師父學習的時候,曾經看過一個這樣的例子:某位法師一直要推展事業,有很多很多的計劃,很希望師父能夠批准他的計劃,但實際上師父是一個也沒有批准的。後來我就請問師父說:「為什麼他不能做那些事業?」師父就說:「哎呀!某人啊!非常容易好高騖遠,沒有注意到當下的緣起,而且一衝起來誰也攔不住,到時候他要吃很大的苦頭,他那個習性很難轉彎!一旦強轉,必定弄得人仰馬翻、頭破血流!」師父對他的指導,就是攔截他的計劃,給他踩煞車,外相上看起來就是這個也不讓做、那個也不讓做,只能老實看經典、學習。一直喜歡做很多事情的人,可能就會覺得憋悶。但是這個時候,如果能夠調整自己,隨順善知識的言教,用這段時間用心補足過去在學習教典上的缺失,那該是多麼令人高興的事情。而且在自己最執著的事情上,也能夠修行觀父容顏、棄自自在、捨於尊重,很美好! [01′33″]</p>
<p>   但談到棄自自在,談何容易啊!自己的習性,會一直把自己拉到自己特別執著的那個地方,所以這個時候要再把自己努力拉回來。在拉拔的過程中,一不小心對善知識非理作意,會認為善知識不信任自己、不重視自己,甚至會懷疑善知識覺得自己沒用,這樣的心思一旦出現,又沒有及時調整,就會跌入觀察過失、非理作意等等這樣的深淵。一旦沒有注意努力修信——修改自己內心中不信的那些觀點和感受,在善知識調整自己習性的時候,那是很危險的!反之,要朝著善知識指導自己的方向認真地改變自己,努力在很多緣起點上修信念恩,踏實地追隨善知識,調伏自己。幾年之後,我們可以觀察自己和他人,順善知識教和不順善知識教的這兩類,結果一定是天上地下,實在是差距太大了!十年看下來、十五年看下來、十八年看下來、二十年看下來,會越來越覺得師父的洞悉力是那麼準確、那麼慈悲!不敢忽視啊! [03′05″]</p>
<p>   還有的人,除了學經典,其他事情也不想管。能夠深入經典,不是一個很美妙的習氣嗎?對此,師父會鼓勵一種人繼續學、繼續深入,很讚歎他認真學教典;而對另一種同樣很喜歡學教典的人,師父就會勸他多承擔,因為他越來越喜歡獨自寂靜、少事少業少希望住,越來越離群索居,一跟大家在一起就不能修行,看到人會覺得有點煩,這樣的話,怎樣去關心他人呢?實踐利他的這個修行的目標也很困難,所以善知識一定會調整我們的。但被調整的時候,千萬不能錯以為師父是不喜歡自己學經典。要被調整的是那個學經典的動機和以後的方向,一定是為了利樂他人、解決一切有情的憂苦,而不僅僅是為了自得其樂呀!所以善知識有如我們修行的眼目和燈塔,會讓我們注意到腳下,也會讓我們瞭望到遠方。 [04′24″]</p>
<p>   師父又提到說:「<p> 處處講方便,方便出下流!<p> 」方便本來是一種善巧的方式,對吧?好像是一種捷徑。在幫忙他人的時候,給別人一個很容易的下腳處,然後步步增上,這也很好。但是這個方便,如果變成處處講方便,會不會沒有向上一步呢?只是注意到怎樣更容易,而沒有注意到該守護的原則?在需要、絕對要守護原則的時候,如果開了方便,就是放棄原則,那即不是方便,那是走下坡路,會一天不如一天!一旦曲解了方便真正的意思,而隨了自己的習性,如果沒有善知識指出來,還覺得自己不錯、挺聰明的,遇事腦筋靈活、左右迴旋,殊不知忽略了正道,再聰明也沒用啊!反而越是聰明,還被聰明害到,所以修到後來就修到地獄去了!因為在方便與戒律上,如果方便到連戒律都忽略了,而以那種方便為主要的方向,忽略了戒律,而養成惡習、在因果上都不在意,來世堪憂啊!堪憂的地方,就是三惡道啊!所以我們一片好心想要幫忙他人,如果沒有重視戒律,雖然一片好心,也是徒然,只是對自他傷害罷了。 [06′07″]</p>
<p>   像這一段,師父提醒我們:不同習性的人有不同的特點,如何能夠擺脫自己的習性給自己帶來的困境?對我們來說,最重要的就是親近善知識,聽聞正法,依著善士的言教觀察內心。如果發現內心有不順善知識言教或教典所開示的次第之處,應該及時調整。在修行上真的不能以自我為中心、自己教自己怎麼修行、過分注重自我的感覺,甚至以感覺為主來修行,忘記了自己是個凡夫、很多感覺是顛倒的、很多感覺是宿業的再現。這種宿業,如果是順生死流轉的,甚至是趣向惡道的,那怎麼能夠隨順?而大乘善知識的言教,恰恰是讓我們出離生死、遠離惡趣的,所以才需要棄自自在,捨於尊重。棄了什麼自在啊?棄捨了流浪三惡趣的自在。祈請善知識引導我們脫離惡趣、脫離三有,在任何時處準確地捨惡取善,邁出當下踏實的、向上的一步。所以師父這一段的叮嚀、殷重的叮嚀,如果能放在心上,常常警誡自己,這一生乃至生生世世都會受用無窮啊! [07′52″]
<p>   在上《廣論》之前,請大家還是要觀察一下自己的相續,調整一下自己的動機,要把自己的續流調整到準備聞法的一個狀態。那麼準備聞法的狀態和其他的狀態有什麼不同呢?最根本性的就是它的目的非常地明確——為了利益無窮無盡的有情,必須去希求佛果。在這樣的一個動機下,我們所做的聽聞,才會符順於我們所學習的大乘教典。 [00′43″]</p>
<p>   在平常忙忙碌碌、不停更換所緣的狀態下,有的時候我們可能會忽略我們的動機,在這些可能是很瑣碎的事務中消耗了生命的光陰,對自己三業的省察可能也沒有那麼嚴格。但是在聽聞的時候,因為我們的所緣都是法義,所以比較容易將所聞的法義來觀察自己的現行,率爾、率爾觀察三門,然後調伏,其實這樣是比較方便的。 [01′21″]</p>
<p>   在每一節課之前,聽聞動機的策動是很必要的一個習慣,非常希望大家能夠養成這樣的一個習慣。因為在我們還沒有學《廣論》之前,我們是沒有這樣一個習慣的,我們不知道在聽聞前的發心,乃至思惟聞法勝利做前行是這麼重要的。因為如果前行沒有的話,其實會影響正行;正行如果被影響了,那所迴向的可能也有太多的染雜。所以前行從來都是很重要的事情!前行做好了之後,正行可能就會很少失誤;再按照上師教我們的去迴向的話,聽聞這一座法所累積的資糧可能就是非常可觀的,或者是我們生生世世受用不盡的一個資糧。 [02′11″]</p>
<p>   所以前行是非常重要的!希望大家不要嫌麻煩,因為一旦這件事情成為你的習慣之後就不麻煩了,就像我們自動地呼吸、我們的眼睛會自動地看什麼一樣,是我們的一個習慣。所以聽聞之前我們會自動地去思惟聞法勝利,將我們內心的續流轉向感恩三寶、專注於法義,希求解脫乃至成就無上菩提,這是非常美好的對自心的一個訓練。但是要成為習慣的話,一定要刻意訓練,不刻意訓練會忘記的,甚至久了之後會忽略,認為聞法勝利沒有什麼重要。其實這樣的話會輕視法的,輕視法,會有很大的過失! [02′55″]</p>
<p>   所以無論我們已經學了多少年了,當「思惟聞法勝利」的這種勝利還沒有在內心中如量地、如法地生起的時候,還是希望大家能夠勤勉地、能夠不厭其煩地說服自己的心,在每一節課聽聞之前,要做這樣一個聽聞前行的策動;策動到一個量——我們的心,要因為這個策動而改變,比如說:緣念到佛陀的時候會心生感動,還有會覺得這個聽法的機會很難遇、很珍惜,甚至生起極強的歡喜心和希求心。所以,想到:能有今天這樣一次聞法的因緣,不知道往昔我們都做了多少勤苦的努力?而且從佛陀的那一方面講,成就一個佛果,要多少大劫積聚資糧?要捨頭目腦髓這樣的苦行,換來這樣的教正法和證正法。然後,還有很多傳承祖師,也都為法忘軀,所以我們才有這樣一個傳承。現在,我們才能夠聽到。 [04′15″]</p>
<p>   此時此刻,還有多少有情在三惡道?想一想:他們或者趴在幽暗的洞穴裡面,或者在一個不見天日的深深的海底裡,還有的在曠野裡奔跑,正在吞食其他的生命,或者被吞食;一旦淪為三惡道的有情,像海裡的大魚,一張嘴,一吸的時候,可能很多生命就不見了,所以活一天,都是要用眾生的血肉來維繫自己的生命,想想造很多惡業啊!餓鬼道的有情,要忍受長劫難以想像的飢渴呀!我們一天不喝水,或者幾天不吃飯——就那種飢渴,要忍受難以想像的時間長度的飢渴;而地獄道的有情,那就更可怕了!此時此刻正在地獄道的有情,他們就處在無量的痛苦之中,而且是極其難忍的痛苦之中。而現在的你我由於上師三寶的恩德,有幸暫時脫離了三惡趣,有這樣一個隨順暇滿的所依身,而且非常非常幸運地值遇了大師的教法,我們現在就在聽《菩提道次第廣論》,一起研討。這樣的時光不是一揮而就,好像天上飄來一片雲那樣輕鬆的,是往昔我們花了多少勤懇的努力才得到的現在的機遇。得到了之後,這個心續剎那剎那一刻不停地向前奔流著,在老死還沒有被究竟地滅除之前,我們依然會遭受到生老病死的折磨,而現在正是一個能夠解決這種痛苦的最好時機。我們來聽聞正法,一定要讓這難得易失的暇滿時光發揮最大的效用,對什麼發揮最大的效用?對自他的離苦得樂,要產生最有力的、最真實的饒益。 [06′56″]</p>
<p>   所以聽聞前行的策動,我認為是非常非常重要的!尤其是班長,在帶班之前如果能夠好好地祈求的話,那麼這節課我們就能夠感受到佛菩薩很大很大的加持。這樣的話,在跟其他同學一起研討的時候,可能突然間就會靈光乍現,對某一個問題有更深入的了解,或者對內心產生更深入的一個感動,或者扭轉習氣。這都是有可能發生的,可能發生在瞬間! [07′32″]</p>
<p>   今天我們就往下聽。上節課學到:「<p> 攝二大車善傳流,深見廣行無錯謬,圓滿道心教授藏,敬禮持彼燃燈智<p> 」。接下來我們要聽下一段。準備好的話就可以聽了! [07′53″]</p>
<p>   那麼現在這個尊者就在這地方示現,喏,他就是這樣!所以他能夠把這個圓滿的這個教授,一點沒有錯地配合起來,這樣。所以他本身示現的位次我們不知道,根據他的傳記,他剛出家的時候,剛出家哦!就證得那個量是什麼?加行位上的位次。這個加行位相當於我們中國的大師當中選一位的話,是天台的兩位祖師——天台智者大師以及他的老師慧思禪師。哇,那高不可攀哪!這個有一個祖師就是憨山大師,這是明末四大師也是啊,一般人把他推崇為明末四大師之首,就是說四個人當中最高的。人家問他,說:「大師啊,你這麼了不起啊!那個比之於古人啊……」他要用、找幾個古人跟他比一比,他就隨便談幾個——天台智者大師。憨山大師怎麼說?「欸,我怎麼可以跟智者大師相比啊!那我只是開悟了得佛性,那個大師的位次是高得不得了!」 [09′02″]</p>
<p>   在這一小段我提出一個問題:「為什麼要跟中國的祖師的位次做這樣一個對比呢?」有沒有想到?會不會想到三十年前有多少漢人了解阿底峽尊者?有多少人想要知道宗大師?那時候可能是完全都不了解的,《阿底峽尊者傳》應該沒有多少人知道。那我們怎麼樣了解一下這樣精彩的一位傳承祖師呢?所以師父就把我們漢地了不起的高僧大德,這樣地稍稍對比一下。 [09′46″]</p>
<p>   因為在下一段師父說:「<p> 為什麼要舉這個例子呢?<p> 」然後師父說:「<p> 我們哪,因為你沒有真實地認識,我們種種增上慢會很容易產生。<p> 」其實看到這個問題的時候我還是有疑問,我的疑問是:難道學的人會覺得自己比阿底峽尊者還厲害嗎?因為他並不了解嘛!那麼,這個問題是下一段提出來的。在這一段,為什麼要提一個我們漢地的祖師做這樣的對比?這是一個問題,可以先放在這兒。 [10′21″]</p>
<p>   阿底峽尊者有多了不起呢?這一層一層的,有憨山大師;然後比之於憨山大師,憨山大師說:「我怎麼可以跟智者大師比啊!我只是開悟了得佛性。」看一看!開悟的人他說:「我只是開悟了得佛性。那個大師的位次是高得了不得!」就是被大徹大悟的人所崇仰的智者大師。那麼阿底峽尊者的本地風光到底是如何,我們是沒法去揣測的,所以師父舉了這樣的一個例子。 [10′58″]
<p>   那麼我們再聽下一段。<p>   我為什麼要特別舉這個例子呢?我們哪,因為你沒有真實地認識,我們種種增上慢心很容易生。欸,往往人家聽見大徹大悟,好像那個大徹大悟成了佛一樣。不是!大徹大悟有層次不同的,凡夫也是大徹大悟,也可以,就這樣;然後佛也是,天台智者大師也是。那我就特別說明一下,像憨山大師這麼地了不起的人,看那個天台智者大師這麼高。然後天台智者大師他最後走的時候,人家弟子問他說:「大師啊,你證得什麼品位啊?」「我只登五品,只登五品。」那還是在「觀行位」上當中的人哦,他的老師才是「相似位」當中的人。我們這位阿底峽尊者他不是最後哦,他剛出家的時候,哦,還沒有出家,他去參訪善知識,他那個善知識最起碼的都是加行位上的人,有很多是地上菩薩,就告訴他他自己的經驗,然後他照著修持,當時就證得他老師相應的位次。這樣高的一個人,出家,然後幾十年! [01′14″]</p>
<p>   這一段不知道大家聽完之後有沒有疑問?可能很多同學疑問的是:聽到大徹大悟,好像大徹大悟就成了佛一樣,師父說:「<p> 不是!大徹大悟的層次是不一樣的。<p> 」這裡邊有一句話,說:「<p> 凡夫也可以大徹大悟。<p> 」注意哦!這裡邊說什麼?佛坐在菩提樹下,是不是也夜睹明星大徹大悟了?還有天台智者大師、憨山大師都徹悟了。這裡邊可能一些同學會有疑問:大徹大悟的還是凡夫嗎? [01′53″]</p>
<p>   我稍稍作一個解釋。在這裡邊,徹悟肯定是對於空性的證悟力——了解。對於空性的了解,首先要從比量上證得,在比量上證得就屬於思所成。那麼比量證得為什麼叫「比量證得」呢?就是要依靠正因而證得它的所立,這就是「比量證得」。那麼在正因上,有「自利時」還有「他利時」。「自利」就是自己思惟,比如說成立空性的這個正因,思惟之後而證得了空性,這樣是比量,這個就叫「自利時比量」。「他利時比量」就是從他陳述的這個正因,聽到之後他證得了空性,這個叫「他利時比量」。但是都是要依靠正因去證得什麼?所立,所以它是比量證得空性。比量證得空性可不可以叫徹悟?也可以吧!比量證得空性,是凡夫否?是的,所以他也是凡夫。 [03′01″]</p>
<p>   證悟空性,在《現觀辨析》裡邊列舉了九種正因去成立空性。有幾種還記不記得?大家還記得嗎?五相、七相、金剛屑因,還有離一異、破有無生、破四邊生、破四句生、對立可得因,還有一個緣起因。透過這九種正因去成立無自性的道理,然後行者要對這個無自性的道理進行思惟。剛才我講的是比量證得,比量證得屬於思所成;接下來用〈奢摩他〉去證得空性,它屬於修所成;修所成之後,再來用止觀雙運證得。這個之前還是屬於什麼?分別心的,還是屬於分別心證得,止觀雙運之後最後現證空性的那個行者才是聖者。不是用分別心證得,它是現證。那個時候,如果是大乘行者的話才是登初地,然後還要兩大阿僧祇劫累積資糧,去成就無上正等菩提。 [04′18″]</p>
<p>   大家可以想想這個過程哦!依據教理去判斷一個大德他的所證,不是說:啊,看起來像怎麼樣!因為有嚴格的教理的基礎來判斷。所以像這裡邊寫到,阿底峽尊者他的老師最起碼都是加行位的。加行位是什麼?就是剛才我們說止觀雙運去證得空性,還是在分別心上證得,還沒有現證之前,那時候是加行位的。有記得這段吧?師父講到:「<p> 有很多是地上菩薩<p> 」,就是阿底峽尊者的老師哦!「<p> 就告訴他他自己的經驗<p> 」,就是他的老師把他的經驗告訴他,「<p> 然後他照著修持,當時就證得他老師相應的位次。<p> 」所以這是絕頂聰明的一個修行者,他的成就是很難想像地高!師父說:「<p> 這樣高的一個人!<p> 」所以他才能把幾派的傳承融會於一身嘛! [05′18″]
<p>   師父說:「<p> 為什麼要舉這個例子呢?我們哪,因為沒有真實地認識,我們種種增上慢會很容易產生。往往聽見大徹大悟,好像大徹大悟成了佛一樣。<p> 」 [00′14″]</p>
<p>   在這裡邊,師父提到了增上慢這樣的一種心態,那麼什麼是增上慢?在世親菩薩所著的《五蘊論》,還有安慧論師所著的《廣五蘊論》中,提到「慢」總共有七種,增上慢是這七種慢中的第五種。在玄奘大師所翻譯的世親菩薩所著的《五蘊論》中說:「<p> 云何為慢?所謂七慢:一、慢,二、過慢,三、慢過慢,四、我慢,五、增上慢,六、卑慢,七、邪慢。<p> 」什麼是增上慢呢?就認為自己已經獲得自己尚未獲得的殊勝所證法,心高舉為本性,這就是增上慢。所謂他自己認為他已經獲得了自己尚未獲得的殊勝所證法,殊勝所證法到底是什麼?就是指聖果及禪定等等。聖果,從大小乘來分的話,小乘的聖果就是預流果一直到阿羅漢果,大乘就是初地一直到佛地之間。由於我們沒有真實地認識,所以自己會認為自己已經得了這些聖果乃至禪定等等。 [01′42″]</p>
<p>   為什麼我們沒有真實地認識,會產生增上慢呢?或者判斷別人判斷錯了,或者判斷自己。「真實地認識」請問是來源於何處呢?現在我們大家都知道一定要詳盡地、仔細地聽聞教典,然後開始廣泛地去辨析、了解,透過紮實地對教典的學習、對教理的聞思修,我們才能夠知道判斷的界限。比如剛才我說的聞、思、修三個層次的證悟,甚至加行位的證悟到最後登地,它的位次、它的界限是非常非常清楚的。但是如果我們不仔細地學教典的話,我們就會把一個凡夫的大徹大悟和一個登地菩薩的大徹大悟,甚至和一個十地菩薩的大徹大悟全部混成一團,完全無法判斷。甚至如果有一個人在我們面前說他大徹大悟了,我們都不知道他到底徹悟什麼,都不會去詢問。祖師曾經說過:如果廣講加行位菩薩的功德的話,一個普通的凡夫可能會認為那是佛陀的功德,加行位哦!但是,一個普通的凡夫聽起來的話,哇!會覺得他的功德跟佛陀幾乎是沒有差別的,甚至就是佛陀的功德哦! [03′08″]</p>
<p>   所以師父在這一小段,看這幾句話:「不是!大徹大悟有層次不同的,凡夫也是大徹大悟。」可以想見三十年前哦!三十年前《菩提道次第廣論》還沒有在漢土流行,那麼師父怎麼樣把這個嚴密的教理給我們講清楚呢?你看,師父用了三行就講成這樣子了!但是這個三行我們要學好多。那麼對於教典沒有學習的初心行者來說,透過這幾句話可能就會去鑽研了,比如說:欸,為什麼大徹大悟層次差這麼多?而且凡夫也大徹大悟了?沿著這個疑問大概就可以去學教理。 [03′45″]</p>
<p>   所以我會自己想:為什麼師父要舉這樣一個例子呢?透過這樣一段描寫,當然是讓我們去稍稍了解一下阿底峽尊者他到底是怎樣成就的一位高僧大德;另一方面,提到了天台宗的判教的方式,如果我們不去廣學教理的話,其實是沒法理解師父在講什麼的。所以師父在講《廣論》的整個過程,都在鼓勵我們一定要深入、廣泛地去學習教理。學習教理了之後修行會快得多,而且不會走上歧途。因為就像一個地圖,你要沿著地圖去到一個沒有經過的地方,而且要有善知識引領的話,這就變得方便得多! [04′31″]</p>
<p>   師父在學教理這一點上,示現的是非常非常嚴謹的。師父幾乎有閒暇的時間——我們說的閒暇就是他沒有在見人、沒有在開會、沒有在各地跑法人事業、四處去鼓勵同學的話,幾乎都在看書。像我的其他善知識們也都是這樣,都在看經典。師父看經典的時候,有的時候會發現師父非常非常地感動,講不出話來,然後他會在佛堂裡走來走去、走來走去,就是很激動;有的時候,師父看經典會流眼淚。在旁邊看著師父的時候,會感覺到經典上所顯現的一切,彷彿都顯現在師父的內心之中。你跟著師父的話,就會覺得經典上所講的一切,其實一個學佛的弟子只要好好地努力,是可以把它現證在內心中的。但是要嚴格地按著道次第的修行,不能人云亦云,或者自己想我的證悟經驗是怎樣。 [05′33″]</p>
<p>   師父這兩小段,由阿底峽尊者的證悟,結合到我們漢土的高僧大德,他對我們寄予了深刻的希望,就是希望我們能夠把佛陀所講的法詳盡地學好。如果想學好的話,一定要學傳承祖師所造的論,因為論就在釋經,要把這個學好才能夠知道路徑,我們才能夠開正知見眼。有了正知見的眼睛之後,我們戒律的腳才能夠走向正確的地方,所以這是非常非常重要的一點!師父在這兩段裡對我們寄予了這樣的厚望,所以他這樣講。不知道你們聽的時候你們有什麼高見?我也很想知道! [06′16″]
<p>   好!那我們大家來聽下一段。<p>   那個時候他參訪善知識十幾歲,到七十幾歲死,你可想而知他多高。但他沒有說明,至少從我們現在有的傳記當中,他沒有說出來「我自己到了什麼位次」,這個沒說。但它至少這個地方說明了,他這個大師,有把佛陀的這個教授圓滿地擺在這裡。這所以為什麼當年在印度啊,他在所有一切的宗派都崇奉他——你念佛的,你跟了他一定成功,你參禪的,跟了他一定成功,不管你禪、淨、律、密、教,因為他得到圓滿。所以這個地方的,它這個表示這個傳承,有它殊勝意義。 [00′50″]</p>
<p>   這一小段,師父說:阿底峽尊者他把佛教的教授圓滿地傳承下來,當年在印度達到什麼樣的成就呢?就是各宗各派尊奉的大師。他腰間掛著一百零八所寺院的鑰匙,所有的寺院都尊他為頂嚴,不管是哪個法門的,都跟著阿底峽尊者修行。可以想見,把這樣一位大德請到西藏該多麼困難,那個可能不僅僅是國寶級的問題了! [01′30″]</p>
<p>   阿底峽尊者離開榮耀的最頂端,然後去藏地,語言也不通。大家如果到阿底峽尊者駐錫過的聶塘寺,可以看到房子是很矮的、很小很小的一個寺院。他當年為了把教法傳持下來捨壽二十年啊,就為了把這個道次第的傳承傳下來,所以真的要感恩阿底峽尊者的深恩啊! [01′59″]</p>
<p>   我們現在所學的一切,如果沒有諸位大德捨卻一切,這樣弘法利生的奉獻,我們現在豈能聽到這樣的傳承呢?所以「<p> 敬禮持彼燃燈智<p> 」的「敬禮」,應該是發自我們內心深處的最最虔誠的一個敬禮,而且要盡未來際地感恩下去、禮敬下去!如果沒有這麼精彩的傳承祖師,我們現在縱然是想要出離生死、想要發大乘心,甚至想要去成就佛陀那樣一個大覺佛位的果位,我們如何能夠找到路徑呢?如何能找到次第?如果沒有這些先賢大德們為我們作種種的示現和教導,我們真的是不知道該如何修行,所以「<p> 敬禮持彼燃燈智<p> 」! [03′04″]</p>
<p>   現在大家把《四家合註入門》打開到六十一頁,還是要看中間的藍字和紅字、黑字的部分。說:<p>   <p> 其次<p> 禮讚造此道者獨一天尊:<p> 從二大車<p> 依次<p> 善<p> 為<p> 傳流,<p> 圓具詞、義、加持等,非有間隙及含毒等。<p> 由<p> 深見<p> 以及<p> 廣行<p> 二門,往趣圓滿佛地之<p> 道<p> 次第、<p> 體性及其差別等悉皆<p> 無謬,<p> 此復完具齊備,故為<p> 圓滿<p> ,又<p> 攝<p> 道之支分等至言密意<p> 扼<p> 要<p> 、一切經續之<p> 教授<p> 無盡<p> 寶王<p> 藏<p> 、善妙生源<p> ,敬禮持彼<p> 吉祥<p> 燃燈智<p> 慧<p> 。<p> 此讚無等覺窩大師。<p>  [04′02″]</p>
<p>   下面就看六十二頁,我們的《講記》哦!說:「<p> 其次<p> 禮讚造此道者獨一天尊<p> 」,「造此道者」是指道次第——《菩提道炬論》的造者,就是指勝阿底峽尊者。「獨一天尊」,就是至尊的意思。這一偈就是對阿底峽尊者作禮讚。 [04′24″]</p>
<p>   下面又有問題,說:「『道』是什麼?」仁波切回答說:「『道』就是指道次第。這個教授的造者是誰呢?就是覺窩具德阿底峽。」 [04′34″]</p>
<p>   「從二大車」,從上面的龍樹、無著菩薩傳下來的傳承,注意!圓具了詞、義,還有加持力,在加持力的力量上是沒有散失和減損的,就是他的傳承加持力傳承到現在是沒有一點點減損的,這是上師傳持下來的傳承所必須的,就是加持力沒有凹凸的。他為什麼會具有這樣的力量呢?因為沒有間隙;間隙就是中間有空掉,傳承就斷掉了。而且就算沒斷,下面說「含毒」,比如說一杯奶茶如果有一滴毒藥的話,那可能就完全不能用了,那已經不是飲料,是毒藥!所以它這裡邊沒有一點點摻雜不清淨的、有毒的部分。 [05′24″]</p>
<p>   「間隙」,它原來是指房子與房子中間的空隙,用此比喻傳承間斷;「含毒」,就是在傳持它的時候,混雜了煩惱的意樂,這個是指惡劣的意樂。但是我們這個傳承不是上述的情況,所有的傳承祖師在傳它的時候,沒有含混著非常惡劣的意樂。心中的想法,沒有被過失、雜質染雜,完全沒有這些過失;它是極其清澈、極其清淨的傳承。這裡邊說:加持力完全沒有散失、沒有減損的一個強大的傳承,而且是「<p> 依次<p> 」傳下來的傳承。 [06′11″]</p>
<p>   善傳「<p> 由<p> 深見<p> 以及<p> 廣行<p> 二門,往趣圓滿佛地之<p> 道<p> 」,它傳持了深見和廣行兩個門徑。注意!它這個善傳流這個「善」,必須是毫無間斷的傳承,加持的威力也沒有散失,沒有被破壞誓言的雜質所染汙。這裡邊所有的傳承祖師,都沒有破壞誓言的雜質,這都是清淨傳承所必須的,清淨傳承是非常非常重要! [06′46″]</p>
<p>   回憶一下:具備了詞和義,還有什麼?加持力!注意!詞、義、加持力,沒有間歇——沒有空隙、沒有含毒。而且是依次由深見及廣行兩個門徑,趣圓滿佛地的這樣一個傳承。我們現在聽的就是這樣的傳承,所以是何等地榮幸! [07′14″]</p>
<p>   「<p> 往趣圓滿佛地的<p> 道<p> 次第、<p> 體性和差別等悉皆<p> 無謬<p> 」,就是完全沒有錯謬,一點點錯謬都沒有的!「<p> 此復完具齊備<p> 」,這裡邊體性、加行等等這些道次第全部是圓滿的,「<p> 故為<p> 圓滿<p> 」;「<p> 又<p> 攝<p> 道之支分等至言密意<p> 扼<p> 要<p> 」,都在裡邊。那麼攝集道的支分等八萬四千法蘊,也就是十二分教扼要,或者說一切經續的教授,像什麼呢?仁波切這裡邊講:「就像如意寶庫般的『<p> 寶王<p> 藏<p> 』」,如意寶庫,是「<p> 無盡<p> 」的「<p> 善妙生源<p> 」。「<p> 持彼<p> 」,執持這個寶庫的到底是誰呀?就是「<p> 吉祥<p> 燃燈智<p> 」——覺窩具德阿底峽尊者。 [08′07″]</p>
<p>   前面讚美了那麼多這個傳承的美好,那麼這個這麼優美的、完全清淨、有力的傳承,傳持到哪裡了?傳持到勝阿底峽尊者,他把它一肩擔承,是持有這個寶庫的所有者。所以敬禮覺窩具德阿底峽! [08′29″]</p>
<p>   在最後面又有人提問題,說:「到底執持了幾個傳承?」仁波切在講的時候,非常強調說:「是三個傳承!因為這裡邊有間接顯示了偉大行派,是至尊文殊怙主、寂天菩薩的傳承,稱之為偉大行派。這個沒有直接說出來,但是在其他地方都有提到三脈法流匯為一,所以阿底峽尊者完全擁有這個三脈傳承的法流。」三脈傳承法流的匯合,就像長江大河匯合到大海一樣,匯合到阿底峽尊者的身心上。所以對這樣的傳承祖師,獻出我們從內心深處的禮敬! [09′11″]
<p>   我們接著聽「<p> 遍視無央佛語目,賢種趣脫最勝階,悲動方便善開顯,敬禮此諸善知識<p> 」這一個偈子: [00′12″]</p>
<p>   那麼再下面呢,除了這個正支以外,其他的相關的、旁邊的一些什麼人,下面那個偈。<p> 遍視無央佛語目,賢種趣脫最勝階,悲動方便善開顯,敬禮此諸善知識。<p>   除了這個正統的這個一脈相傳的我這個師承以外,其他的相關周圍的這些大善知識都在裡頭。而大善知識每一個的條件都是什麼?「遍視」,這個遍是普遍,他沒有執著的。而是什麼?「無央」,一切諸佛的這個經教,一切諸佛的經教。他了解這個道理,而且都是「賢種」,種就是種性住,平常我們叫三賢十聖。真正具足善根,已經一定走上大乘路子的這個行者。所謂「最勝階」,表示大乘的這樣的那個祖師們。由於他這個悲心的關係,所以用種種的善巧來說明這個佛、菩薩殊勝的意義,教導我們的那些諸大善知識。這個是歸敬,也一方面是歸敬求加持、消業障,另外一方面表示這個傳承,也讓我們知所歸趣。<p>   所以我們真正要學佛法的話,最重要的,剛才說你要得到善知識,那麼什麼叫善知識呢?後面會詳細說明。可是這個裡邊,真正地要了解這個善知識,你沒有智慧辨別不清楚。有一點容易的,換句話說他的世系如何?他的傳承如何?這個東西大家不能亂的。這一點我們不必用智慧去辨別,你能夠找到這個的話,確定都是圓滿無缺的善知識。所以他這個地方也簡單地說明了這一點,也就是說本論真正殊勝之處,這樣。 [02′33″]</p>
<p>   好!我們看一下師父對這一段的解釋。說:「<p> 其他相關周圍的大善知識在這裡邊<p> 」。注意哦!師父說:「<p> 大善知識每一個的條件<p> 」,這些了不起的大善知識哦!每一個條件都是什麼呀?它這裡邊有個「<p> 遍視<p> 」,普遍的、沒有執著的,都是什麼?「<p> 無央佛語目<p> 」。「無央佛語」就是一切諸佛的經教。一切諸佛的經教到底有多少啊?流傳在我們人間、我們南贍部洲沒有散失的經教,乃至在很多個世界的那些經典,他們都遍視了嗎? [03′13″]</p>
<p>   以前有跟法師們討論過這個問題,當我提說:「遍視了嗎?」提這個問題的時候,有法師回答說:「道次第能夠總攝一切佛語的扼要,通達了道次第,也算是某種程度的遍視無央佛語。」還有一個法師回答說:「《廣論》所皈敬的傳承祖師,主要都是道次第的傳承祖師,因此這裡稱讚諸大善知識遍視無央佛語,也應當是從這些道次第的傳承祖師通達道次第的角度而做讚歎。」 [03′46″]</p>
<p>   在慧海大師所著的《廣論講誦筆記》裡,也有這樣一段。提到慧海大師,慧海大師是清朝乾隆時期的人,他是拉卜楞寺的大德,被譽為整個格魯派耳傳教授最清淨、最完整的寶藏。拉卜楞寺是對傳承要求非常嚴格、非常清淨的,這裡主要就是看他的上師法,如果有一點點跟上師矛盾,或者違背跟上師誓言的,大家就不會去跟他求法。像慧海大師他寫的密法的著作就成為上下密院的課本。就是這樣的一位傳承祖師——慧海大師,在他所著的《廣論講誦筆記》裡,有講到二世嘉木樣大師的一段話。 [04′50″]</p>
<p>   關於二世嘉木樣大師,不知道大家有沒有了解,拉卜楞寺就是一世嘉木樣大師建立的。那麼二世嘉木樣大師跟章嘉國師是同時代的人,六世班禪的傳記就是二世嘉木樣大師寫的。隆多喇嘛仁波切曾這樣說:「當時藏地生起菩提心的典型人物就是永津班智達,而通達空性見的典型人物就是二世嘉木樣大師。」《廣論講誦筆記》裡說:「二世嘉木樣大師在傳《安樂道論》的時候曾說:『要徹底地傳授《安樂道論》的引導,需要花上一個多月的時間,但我現在太忙,恐怕沒有時間。雖然是這樣,可是如果圓滿地講授獲得道次第的引導的話,就代表獲得八萬四千法蘊的引導;能夠講聞道次第,就能夠代替講聞八萬四千法蘊;能夠複誦道次第,就等於複誦八萬四千法蘊』。」慧海大師說:「對於上述這些話,要是真正懂得思惟的話,《廣論》的每一句話都會攝持八萬四千法蘊的修持。」 [06′12″]</p>
<p>   到底可不可以達到「<p> 遍視無央佛語目<p> 」這樣的境界呢?怎麼能夠達到呢?諸位的答案是什麼呢?大家也可以觀察思考一下。 [06′24″]</p>
<p>   然後又解釋了「<p> 賢種趣脫最勝階<p> 」,這樣了不起的祖師們哦,被大悲所繫縛的祖師們,他們用種種的善巧,來為真正具足善根的所化機開顯了菩提道,所以禮敬這些善知識。 [06′46″]</p>
<p>   接著師父下一段講了一個問題,說:「<p> 我們要真正學佛的話<p> 」,注意哦!注意,不要走神!「我們真正要學佛法的話」,注意!又出現了那個「真正」兩個字,記得師父在前面的磁帶也講過,說:「如果想真正地學佛的話。」這裡邊出現了「真正」,要考慮考慮:我們平常是想要真正地學佛法呢?還是沒有那麼真正? [07′17″]</p>
<p>   說:「<p> 如果要真正學佛法的話,最重要的,就是要得到善知識<p> 。<p> 」師父說什麼樣的才叫善知識後面會說。但是這裡邊對於我們一個初機的學者,到底怎麼去找善知識呢?怎麼辨別呢?很困難,但是師父說:「<p> 有一點是容易的<p> 」,有沒有發現師父在教我們?「<p> 換句話說他的世系如何?他的傳承如何?<p> 」這個善知識他是不是有傳承的?這個是不能亂的。如果說他是有清淨傳承的這樣一個傳承善知識,「<p> 你能夠找到這個的話,確定都是圓滿無缺的<p> 」,是確定他有清淨傳承。這裡邊可能包括教正法、證正法很多傳承哦!所以可以想見師父講了前面的這些偈頌,在很多處都在告訴我們:學佛最重要的一定要尋覓善知識,然後一定要依止善知識;那麼依止善知識,一定要去尊重這個傳承,學習這個傳承。所以在這點上,我們可以再再地觀察一下我們自己:在我的心中,有沒有特別特別重視傳承、珍惜傳承? [08′38″]
<p>   我們現在要看《四家合註入門》,所以請大家把書翻到六十三頁,還是要看那個紅字、藍字和黑字的部分。<p>  [00′13″]<p>   說:「<p> 其次讚歎尊師自身之親傳上師——虛空幢及法依吉祥賢等:<p> 猶如<p> 遍視<p> ﹝無邊故為<p> 無央<p> 。﹞﹝一切語中最為勝,故為<p> 佛語<p> 。﹞<p> 」<p>   這個「<p> 最為勝<p> 」是解釋佛語的。<p>   「<p> 目<p> 之道次第與善知識<p> ,<p> 三士道次以及詮說彼諸至言,<p> 易於趣入復賜大義,是故猶如<p> 賢種趣脫<p> 之<p> 度越輪迴大海<p> 最勝<p> 階磴或<p> 津<p> 梁<p> ,<p> 而於如此道次第,因由<p> 大<p> 悲<p> 愍<p> 撼<p> 動<p> 其心,<p> 令無自在,<p> 善<p> 巧<p> 於<p> 依所化心志三種次第,引導直至佛地之<p> 方<p> 便<p> ,<p> 一切時處<p> 依道次第之門,由聞思修而<p> 善開顯<p> 一切至言文義<p> ,敬禮此諸善知識。<p> 此為禮敬其餘此法諸上師。<p> 」 [01′14″]</p>
<p>   我們下面看仁波切的講記。語王大師註解說:「<p> 其次讚歎尊師自身之親傳上師<p> 」,「尊師」,指宗喀巴大師,是語王大師對宗大師的敬稱。宗大師是從何處聽聞道次第的呢?洛札大成就者虛空幢上師,和依怙大堪布——「<p> 法依吉祥賢<p> 」。宗喀巴大師從這些上師聽聞了道次第,所以他在造《廣論》的時候,禮敬自己的親傳上師。 [01′56″]</p>
<p>   「<p> 遍視無央佛語目<p> 」,「無央」就是指「<p> 無邊<p> 」,「<p> 猶如<p> 遍視<p> 一切<p> 佛語目<p> 之道次第與善知識<p> 」,這個「目」到底是指什麼呢?「應該理解為道次第」,注意!這是一種解釋,「和自己的善知識」。「<p> 賢種<p> 」就是賢善種性,趣往解脫和一切遍智。「<p> 度越輪迴大海<p> 最勝<p> 階磴或<p> 津<p> 梁<p> 」,這個「津梁」是指碼頭。所謂的「階磴」,本來是指河壩、高起的台階,但這裡也是指碼頭;這句的意思是具有賢善種姓者從這裡出發,這是能渡越輪迴大海最殊勝的入口,是在讚美善知識,也可以說是在讚美道次第、三士道次以及詮說彼諸至言。為什麼這樣講呢?因為道次第是善知識——也只有善知識——能夠傳承給我們的。 [03′06″]</p>
<p>   那麼這裡的階磴或津梁指什麼呢?就是「<p> 三士道次以及詮說彼諸至言<p> 」,這是巴梭法王的註解。如果再加上妙音笑大師的註解,這句話可以指道次第與善知識,道次第的部分就包含了三士道次及詮說三士道次的經論。大家可能想說:三士道次及詮說三士道次的經論,有什麼差別呢?在這裡可以理解為,三士道次就是指內心中生起了三士道的證德,是證正法;詮說三士道次的經論,就是教正法。 [03′54″]</p>
<p>   「<p> 易於趣入復賜大義<p> 」,這是妙音笑大師的註釋。「易於趣入」,是指如果修持三士道次第的話,不會走入錯道,非常容易趣往佛地。「復賜大義」,是說如果修持三士道次的話,能夠獲得佛果位的大義利。「<p> 於如此道次第<p> 」,對這樣清淨的至言,「<p> 因由<p> 大<p> 悲<p> 愍<p> 撼<p> 動<p> 其心,<p> 令無自在<p> 」,就是佛菩薩由於大悲心不能自在。依一切種「<p> 所化<p> 」的眾生的「<p> 心志<p> 」,結合著下、中、上三士夫的根機,三種次第,引導到哪裡呀?直至成佛、佛地的所有方便,而作善巧地宣說。這樣善巧地於「<p> 一切時處<p> 依<p> 」三士「<p> 道次第門,由聞思修而<p> 善開顯<p> 一切至言文義<p> 」<p> ,敬禮這樣的善知識!所以「善開顯」,就是由聞思修而開顯道次第的修持,令未解的能夠解,以前不懂道次第的修持,上師宣說之後懂了修持,就是「善開顯」。另外這裡邊還有增廣的這個意思,增廣什麼呢?聞思修的證德。如果在世間的話,有人給我們介紹了一個賺錢的方式,而我們就用這個賺了萬貫家財,簡直是取之不盡,用之不竭;而善知識,善於開顯能夠趣入解脫道和一切智智的方便,就像賜予我們一個如意寶,這個如意寶可以解脫所有的悲愁,賜予最殊勝的快樂。而這種快樂,沒有痛苦煩惱的染雜,一旦得到這種快樂,將永遠不停息地綿延下去,這就是善知識賜給我們的大義,大義是什麼?就是最勝的快樂! [05′53″]</p>
<p>   後面又有問題了!說:「『<p> 敬禮此諸善知識<p> 』,是指除了深見派、廣行派、偉大行派,和匯集三派的傳承者阿底峽尊者之外的善知識嗎?」這個前面都講過了,當時我沒聽明白,我又來問。然後仁波切說:「主要是頂禮宗喀巴大師自己的上師——虛空幢及法依吉祥賢。虛空幢所傳的道次第,實際上就是阿底峽尊者所傳的《菩提道炬論》。」 [06′17″]</p>
<p>   然後某人就說:「啊,那弟子明白了!我想這三士道,好像只有阿底峽尊者明白地闡述出來,怎麼又有一派祖師闡述出來了?」當然現在我不會有這樣的疑問了。還說:「好像都是道次第?」然後仁波切說:「道次第是自己的上師傳持下來的。道次第也不是宗喀巴大師自己創造出來的,而是從阿底峽尊者一代一代這樣傳下來,一直傳到他自己的上師——虛空幢尊者和法依吉祥賢尊者,所以在這裡面主要是頂禮自己的上師。」 [06′47″]</p>
<p>   然後說:「師父,如果是頂禮自己的上師的話,那第一句『遍視無央佛語目』,『遍視』是好像這一切他都看見了,他看見的是什麼呢?整個佛陀的語教嗎?」仁波切說:「對、對、對!透過道次第,八萬四千的法門都容易理解,就像自己的眼睛一樣,大體就是這個意思。」然後說:「『目』在這裡面有一個解釋,就是道次第,還有一個就是善知識。」這裡面就是一些討論。 [07′15″]</p>
<p>   後來仁波切又說:「對於自己的上師禮敬這個偈子,要把自己的上師和一切上師都攝入其中。觀視佛語的『目』,要理解為道次第與善知識,善知識是指自己的上師。而『此諸善知識』,指禮敬一切有結法緣的善知識,禮敬一切的善知識!」後來師父又說:「讚歎這個道次第,也是讚歎自己的上師啊!道次第,這個道次第誰來給你傳呢?就是上師傳的呀!需要具足這兩個涵義。所以之前的註解也有提到『道次第與善知識』。」這裡邊還是解釋那個「目」字,就是道次第和自己的善知識要一併禮敬的意思。 [08′02″]</p>
<p>   跟隨著善知識們學法的時候,會深刻地發現自己的善知識他們對自己的上師,都有著非常深刻的感恩心,應該說永銘肺腑那樣的一個感動。以前聽仁波切講最初教他《現觀》的老師,還有講教他很多經典的老師、小的時候幫他學習的老師。我記得在很小的時候遇到仁波切的時候,仁波切說:「其實我的上師是一個普通的僧人,沒有什麼名氣,但是我所有的修行的來源都是他恩賜的!」那個時候我還不了解傳承,才剛剛開始跟仁波切學習,仁波切就非常非常感動地跟我講了這句話。當時因為仁波切的表情讓我印象很深刻,所以直到現在還歷歷在目。 [08′58″]</p>
<p>   所以當我們接觸到這個傳承的時候,傳承師長就會把對上師一份感恩、滿滿的感恩、深深的尊敬,還有從上師那裡來的加持力,傳遞到我們的身心上。所以在學習的時候,要注意跟自己的善知識好好地祈求,要恭敬虔誠,這樣可以得到所有學法的加持力,乃至源源不絕的動力! [09′26″]</p>
<p>   〈皈敬頌〉可以總攝整本論的內涵,字數不多,但義理很深!仁波切常說:「學習〈皈敬頌〉主要是要生起信心,生起了信心之後,後面的法類就很容易生起。」要再再地思惟、再再地修才能夠生起。透過憶念善知識的功德、隨念深恩,才能生起。仁波切特別特別強調這一點,很多善知識也極為重視我們的信心。在很多經論裡都用大量的譬喻讚美信心的功德,所以我們在聽聞和學習的時候,最好能夠轉變內心,能令內心發生歡喜、發生感動! [10′15″]</p>
<p>   為什麼對上師生起信心那麼重要?生起信心,可以得到三寶的加持。上師是一切諸佛的總聚體,透過對上師修習信心、隨念深恩,能夠獲得解脫、一切智智,這是最大的恩德,不是給我們一點點眼前的利益所能相比的。如果對上師習慣觀察過失、常常觀察過失,是很容易生起邪見的。如果生起了邪見,就得不到加持!善知識有很多功德,不是這樣隨便講講說:「啊!善知識很有功德。」應該再再地觀察思惟,沿著〈皈敬頌〉的文句義理,多次反覆地思考、專注思考、凝神思考。如果我們能對善知識生起信心的話,那我們學習《廣論》就太有意義了!最殊勝的修行方法就是這個! [11′23″] 
<p>   大家好!又到了我們一起學《廣論》的時間了。這次我們將要聽聞的這一小段,不知道大家課下有沒有認真地聽聞一下?原來在研討班要研討下一節的時候,通常大家都會很認真地多聽幾次,甚至有的是小組的,大家在一起討論討論。這樣的話,等到大班研討的時候,就是第二輪或者第三輪了,那個時候就會對我們所提出的問題有更深一步地了解,而且讓我們的思考更具有一個很廣闊的角度,而且有些問題和回答聽起來也是非常有趣的、非常有意義的。 [00′53″]</p>
<p>   那麼在聽聞之前,請大家還是要好好地觀照一下自己的三業。觀察的時候,有時候會發現我的身體是處在一種緊張不舒服的狀態,或者呼吸不是很通暢,這樣的話,自己就做一下調整,調整一下姿勢。那麼再觀察一下:我的內心現在有沒有準備好要研討《廣論》呢?還是我的心在剛才的續流,續流很猛還沒有停下來?所謂的觀察三業,就是此時此刻我的身體在做什麼、我的心在想什麼,要有一個明確地了知。當我們明確地、清晰地知道我此刻在做什麼的時候,我們就可以接下來調整自己身體的姿勢,讓它處在一個比較愉悅、比較威儀的狀態。 [02′07″]</p>
<p>   那麼我們的內心,研討《廣論》之前要準備好一個大乘的發心——為利無窮無盡的有情,我們必須去希求無上菩提。這一節課的聽聞如果由趣向於無上菩提這樣的一個目標所攝持的話,那麼生生世世我們由於這節課積累的福德,猶如一滴水融進了大海是沒有窮盡的。與其沒有特別特別地觀察、策勵自己的大乘發心,和認真地策動自己哪怕是相似的一個大乘發心,這兩者都用了相等的時間聽聞,而有策動的很顯然是佔了非常大的便宜。我們都是花了同樣的時間、同樣的體力,可是一旦有一個殊勝的發心在攝持的時候,對自他來說,利益都是非常非常大的。 [03′08″]</p>
<p>   今天我們會開始聽「<p> 今勤瑜伽多寡聞,廣聞不善於修要,觀視佛語多片眼,復乏理辯教義力。<p> 」好!如果大家準備好的話,那我們就開始聽一小段。聽的時候,注意!要專注、專注! [03′38″]</p>
<p>   那麼再下面那個呢?第二個叫造論的宗旨,有了這個歸敬以後,那麼他要開始造論。說我造這個論,是為什麼原因呢?目的何在呢?我希望達到什麼樣的效果,什麼樣的效果呢?那我們看一下。 [04′03″]</p>
<p> 今勤瑜伽多寡聞,廣聞不善於修要,觀視佛語多片眼,復乏理辯教義力。<p>   說這個現在很多修行的人哪!「瑜伽」翻成中文叫作相應。真正講修行的,不單單是嘴巴上面空講,一定要跟教的道理,你跟它行持相應。所以通常瑜伽分成境、行、理、果,就是說什麼境界我們所對的,那麼你怎麼去行持,根據什麼道理,產生什麼結果等等,一定的。等到你修行到什麼程度,那麼你就有什麼的結果,一步一步,不是單單講一個空話。 [04′51″]</p>
<p>   我們先聽這一小段。不知道大家聽這小段會不會認為師父在解釋「今勤瑜伽」的「瑜伽」、這句話裡的「瑜伽」?但是我聽這一段,我會認為這一小段,師父實際上講了一個真正想修行的人他的正常狀態應該是什麼樣的。 [05′16″]</p>
<p>   所以在這裡邊,你看師父說:「<p> 真正講修行的,不單單是嘴巴上面空講,一定要跟教的道理,你跟它行持相應。<p> 」在這裡邊再一次提到了「真正」二字,在前面師父也提到過很多次。如何對真正兩個字我們去比對內心觀察一下呢?可能很多時候我們都會覺得「我很認真修行」,但是師父為什麼一再要提說:「真正講修行的,不單單是嘴巴上空講的」?這個真正二字,我會覺得值得我們一直揣測下去、揣摩下去。 [05′59″]</p>
<p>   接著師父提到了「境、行、理、果」,這個境、行、理、果出自於唐朝的窺基大師他的《成唯識論述記》,那裡邊的原文是說:「<p> 言瑜伽者名為相應,此有五義故不別翻。<p> 」這個「瑜伽」就是相應的意思,這個有五種意思,所以不作另外的翻譯,就是它是音譯。下面還是原文:「<p> 一與境相應,不違一切法自性故;二與行相應,謂定慧等行相應也;三與理相應,安非安立二諦理也;四與果相應,能得無上菩提果也;五得果既圓利生救物,赴機應感藥病相應。此言瑜伽,法相應稱,取與理相應,多說唯以禪定為相應。<p> 」這一小段,其實就是師父解釋這個境、行、理、果,說它是分四個角度來詮釋,一個真正想修行的人他所要具備的這一切條件。 [07′18″]</p>
<p>   前面那一段,他說:境相應的話,就是不違一切法的自性;行相應,就是要跟定慧相應;第三個與理相應,就是「安非安立二諦」,就是說是二諦還是不是二諦,二諦是遍於一切的;四與果相應,這個果是怎樣呢?一定是無上菩提的果,得果之後就利樂有情。他這裡邊取相應的意思。後來他說:「多說唯以禪定為相應」,有一些人就把它這樣理解了。 [07′54″]</p>
<p>   師父在講《備覽》的第十一卷也有這樣相關的,那個時候師父解釋「教、行、果」,說:平常是有不同的開合,各家都是不同的,賢首宗就用信、解、行、證。教、行、果有的時候也叫「境、行、果」,名字是不同的。教是說明道理,啟發我們的信解,詳細的就叫信解,簡單的就叫教;行就如何行持;最後證得果。關於教、行、果三方面,說得最清楚明白,而且大綱最完整的有一本特別的論。師父說:這本論跟《廣論》有特別的因緣,這本論就叫《現觀莊嚴論》,是至尊彌勒造的。太虛大師在《現觀莊嚴論》當中有一篇序,他有一段話說:「除非是補處菩薩,除了彌勒菩薩這樣一個了不起的大菩薩,沒有一個人能夠這麼簡單明暸把全部的宗要都說得這麼清楚。這三樣東西是從凡夫地一直到究竟佛果,他說得清清楚楚。」 [09′02″]</p>
<p>   這三樣東西就是境、行、果。師父後來又解釋一下說:這個果就是指佛的法身,換句話說境就是凡夫是什麼、聖人是什麼;從凡夫轉到聖人該做些什麼行為;透過種種的行持,能夠把凡夫身轉成佛的圓滿的法身。所以大家可以看到在《備覽》裡師父還是這樣解釋。所以怎麼樣從一個凡夫到佛地,它的修行應該修出來的次第、教理,我們是應該先聽聞的。 [09′39″]</p>
<p>   師父在這一小段,揭示了一個真正講修行的人一定要跟教的道理相應,還要跟行持相應。 [09′49″]
<p>   那麼「今勤瑜伽多寡聞,廣聞不善於修要」,往下列舉的是什麼呢?是有一些修行人犯了一些這樣的過失。你說修行人不真正想修行嗎?可能也挺好樂修行的,但是呢有一些人會持著這樣的見解來修行。 [00′18″]</p>
<p>   你看我講了這麼長一段,其實師父這麼幾行就講清楚了。當我們開始在聽《廣論》的時候,我們其實也不知道這「境、行、理、果」是出自於哪裡,然後師父這樣解釋一下,我們就了解到:喔!一個真正的修行人要了解這麼多,不聽聞是不可以的!所以師父把很濃縮的教理,用非常簡潔的話,讓我們聽起來根本都不吃力。如果像我這樣念了然後引證出來,對初學的人來說,尤其是還害怕學很多的,那可能就學不下去了。所以師父總是把一些非常難,聽起來很深邃、很複雜的教理,用非常淺白的文字清晰地講給我們,讓我們能夠輕鬆地趣入,而且能夠理解師父到底在講什麼。但是不能因為好像文字上理解了之後,我們就覺得對這一段話已經理解地非常清楚了。實際上你去想這一小段,它所包含的義理就是整個《現觀莊嚴論》,是非常非常地深邃的! [01′23″]</p>
<p>   大家可以看到由於師父的恩德,我們能夠略略地了解一下一個真正想修行的人他所應具備的狀態。這裡邊還有一句話,說:「<p> 什麼境界我們所對的,那麼你怎麼去行持,根據什麼道理,產生什麼結果等等<p> 」,下面那三個字,如果看手抄你注意!「<p> 一定的。<p> 」、「<p> 等到你修行到什麼程度,那麼你就有什麼樣的結果,一步一步,不是單單講一個空話。<p> 」這段話看起來字面就是這樣,似乎是很容易了解的,但是對什麼境界,然後依著什麼道理修行,修行什麼程度,得到什麼結果......,師父說這個是一定的! [02′22″]</p>
<p>   這裡邊會對付到我們內心什麼樣的一個見解呢?比如有人說:「啊!我用功了很久啊,好像我也修不出來。」但是當你產生這樣的感覺,或者這樣的一個困境的時候,看到師父的這句話,會不會好像被打了一下?「我都種因了,然後我會認為修不出來——那個因長不出果來。」我們不是在這兒嘆息,就該去考慮是什麼原因。因為師父在「今勤瑜伽多寡聞」這一節裡講到是一定會出生那種結果的。那為什麼我沒出生呢?肯定是因上哪裡缺了條件!這樣的話,就不容易讓我們動搖我們對這條修行的路的堅持。 [03′08″]</p>
<p>   還有一點,師父說:「<p> 一步一步,不是單單講一個空話。<p> 」簡單的幾句話就行雲流水這樣地講出來。「一步一步的」,那是不是我現在還沒到可以看到那個結果的那一步?比如說舉個最簡單例子:背書這件事,在寺院裡在小沙彌還有法師們中間推背書的時候——大家都知道我們寺院已經推行二十多年了——背書這件事就是拿書把它記住,但是背會了之後,最大的敵人就是遺忘。當你把整本的《辨了義不了義》背完了之後,當時背會了,可是如果一段時間你不去再度再度地複習的話,還是會被遺忘毀壞掉,會斑斑駁駁的。一定是循序漸進、循序漸進,然後越來越熟、越來越熟,到最後可能你熟到不再忘了。 [04′01″]</p>
<p>   我曾經問過仁波切說:「到底要背到什麼程度算是可以的呢?」仁波切就笑了,講一個譬喻說:「有一隻藏獒在後面追你,你在前面跑,一邊跑還能背出來,就要熟成那樣子。」大家都知道我們在背書的時候用非常快的速度背,背了之後等有一天善知識說:「我們全部用這樣的一個調背這一個偈子。」比如說像這個「今勤瑜伽多寡聞,廣聞不善於修要,觀視佛語多片眼,復乏理辯教義力」,背的時候就很快,但是全班一起背的時候要是有一個調——「~今勤瑜伽多寡聞~」,這樣整個的背誦就變慢了;如果把那個句子再拉更長更長,發現第二句就掉了,就不會了。所以考背書的時候,要是把它安上一個調子讓全班一起背,那又是一個檻兒,大家又得練。所以這一步、一步、一步、一步的,換著法地背,然後還有不同階段的考試,實際上也是我們對教典越來越熟悉的一個過程。但這個過程,如果沒有真正地坐在班上花心思背的話,實際上也不會了解背書的種種難題,以及突破難題的喜悅。 [05′16″]</p>
<p>   所以提到這個「一步一步的」,就讓我們回首我們的學制,這麼多年了,大家還是積累一些經驗,所以修行不是一蹴而就的事情,但是它一定會有一個由因到果的成熟。師父講的這個「一定的」,等到你修行到了什麼程度,那麼一定就會有那樣的結果。師父輕輕地用非常有力的這樣一個見解,破斥了我們內心中無始劫來熏習到的「我種了什麼因好像不會感得那種結果」的這種邪見。比如說:我此刻聽聞一定是可以趣向無上菩提的,我就是種這樣一個因,那麼將來就會成熟於這樣的果!這樣的話,我們就不敢忽略發心,因為它會引導我們趣向那裡。 [06′12″]</p>
<p>   所以我認為這個「一定的」很重要!如果能把它默背在內心中的話,當我們內心中感到乏力的時候,開始懷疑我這樣做會不會有那樣的結果呢?然後師父這個「一定的」加持力就會出現,可以對治我們內心中關於「如是因結如是果」的不確定性或者疑惑,甚至是否定它的那個邪見。 [06′40″]
<p>   那麼接下來,什麼境界是我們所對的呢?在對到這樣的境界的時候,我們應該怎樣去行持?身語意三要怎麼樣作意?為什麼要這樣作意?根據什麼樣的道理?為什麼要選擇這種作法呢?以及這種作法會產生什麼樣的結果?所以師父後來講了:「一定的!」就是一定會產生那樣的結果。如果你那樣做了之後,尤其是等到我們修行到什麼程度的時候,就會有那樣的結果。所以這不是用了很多功然後結果什麼都沒出現,不是這樣一件事情,是說造了那個因、修了之後,一定會出生這樣的結果。 [00′44″]</p>
<p>   那麼我們修行所要得到的結果到底是什麼呢?我們想要成為菩薩,脫離生死,甚至想要成就無上的佛果,這就是我們期待的果。那麼就要討論一下我們所面對的狀況,比如說生老病死一定是我們所面對的,對不對?六苦、八苦都是我們要面對的,上師三寶也是我們要面對的境界,經典也是、佛菩薩......。佛菩薩是我們所對的境界嗎?當我們有信心的時候,我們會覺得:啊!我一定能夠對佛菩薩這樣的境界生起信心、生起感動,所以我就會得到佛菩薩的加持。 [01′31″]</p>
<p>   我們現在在學習宗大師寫的《菩提道次第廣論》,在學習菩薩的心續裡流淌出來的這些甘露正法,很顯然會對到兩種境,一種境是能夠讓自己的染汙習氣生起來的;一個是讓我們往上走的這樣一個境界。雖然境是上師三寶這樣一個境,但是如果內心沒有信心的時候,也會對他造惡業。所以不論境界上殊不殊勝,我們的內心殊不殊勝才是最根本的道理。而我們的內心殊不殊勝,為什麼會選擇去勝解作意?這裡邊還是有一個結果,這個結果就關乎到我們生命真實的苦樂問題。 [02′24″]</p>
<p>   大家都知道帳房先生,在老的電影裡邊都是在打算盤的,現在沒人打算盤了。我們在計算是苦還是樂的這個算盤,要在內心裡計算得非常非常清楚的:我如是做就會得到如是的結果,這一點自己在心裡邊要算得清清楚楚的。那麼我們為什麼能夠把它算清楚的原因,就是因為我們聽了佛陀講的業果的道理——如何是苦因和苦果,如何是樂因及樂果;我們對這樣的道理反覆思擇之後,選擇去種善因、結樂果,對治惡因、苦果。所以還是師父說的那句話——這是確定的,不用懷疑! [03′18″]</p>
<p>   下面我們再聽前面那一小段的後一部分。<p>   但是現在那些修行的人,他要講修行啊但是不懂道理。請問:你不懂道理,這個道理是告訴你怎麼修行的,你怎麼修法?我們現在變成閉門造車。實際上閉門造車,多多少少造了一點哪!但是他在門外空轉,轉了半天是原地踏步,不僅僅是忙一生,多生多劫這麼空忙,這個很可惜,這個很可惜! [03′58″]</p>
<p>   接下來這一段,就講了「今勤瑜伽多寡聞」的這個現象。師父在這裡邊說:「<p> 他要講修行但是不懂道理。<p> 」那個非常努力修行的那個人,他可能不會認為他不懂道理,他會認為他已經懂了,所以馬上就開始修了。然後師父就說:「<p> 請問:你不懂道理,這個道理是告訴你怎麼修行的,你怎麼修法?<p> 」如果是那個弟子的話,就會說他已經懂了,所以才坐那兒修呀!那麼懂了什麼呢?接下來就討論懂了什麼。我在想如果師父坐在面前給我們講的話,我就會提一個這樣的疑問說:那樣修行的人他不會認為他不懂道理,他認為他懂了。所以這裡邊師父說的「不懂道理」,和那個學的人他認為他懂了,他懂的東西到底是什麼呢?他懂的東西在善知識看來恰恰是不懂,或者說一知半解。這個懂與不懂之間,要有明眼人看你懂了才可以,不然我們了解的東西可能就是錯的。 [05′13″]</p>
<p>   就像我小的時候剛上學,我認為:寫 3 為什麼要站著呢?3 應該寫個「m」形,就是都趴在地上。為什麼呢?因為這樣 3 可以休息,不然 3 要一直站著呢!所有作業本上的 3 都站著,我應該讓它趴在紙上。我認為這是對的,所以老師把我的 3 字改了之後,我還認為我寫的是對的。然後老師問我說:「為什麼給你改了這麼多次之後,你這個 3 還要這麼寫呢?」我說:「因為 3 累了!」天下哪有這樣的道理呢?說數字累了。但是一個小孩就是那樣想的,一個小孩!而且會覺得特別有道理。每次 3 字一定會被老師用紅筆打一個叉,逢 3 就是叉,如果那一頁上 3 字很多,我就全是紅色的叉字。大家都知道上學的時候如果你的本上都是紅色的叉字,這是一件很丟臉的事情。但是我都非常堅持,因為 3 要休息。所以哪有道理呢? [06′22″]</p>
<p>   所以要說服我們自以為是的道理,善知識真的要花一番苦口婆心的力量。師父這裡邊說:閉門造車還多多少少地造了一點,我們是什麼?是門外空轉,是完全不懂道理,都修錯了!而且他不是這一生浪費了,是多生多劫都在這兒空忙。師父說:「<p> 這個很可惜,這個很可惜!<p> 」 [06′51″]</p>
<p>   看到這一段的時候,大家會不會覺得我們不是那個很可惜的人,因為我們非常重視聽聞,對吧?每一節廣論班的課程我都參加,而且有的時候會參加六、七個課程,我是很重視聞思的!那麼,到底聽了之後懂不懂修行的道理,到底是不是在門外空轉?對師父講的這樣的一個提醒,還是要向內心仔細地觀察。 [07′21″]</p>
<p>   修行一定要聽聞,沿著聽聞的道理修行。如果拚命用功而忽視了聽聞,這是一個非常大的錯誤,這是在經典裡被所有的善知識所呵責的。像有一本論叫《喜金剛釋難花鬘》,這裡邊有一句話就是師父這句話的寫照,說:「沒有智慧的人,就沒有聽聞;沒有聽聞,就沒有思惟;遠離了這兩者,就沒有瑜伽;而沒有瑜伽,就沒有成就!」所以看起來是很有智慧的人才能夠重視聽聞。希望所有想修行的人都能夠趣入努力聽聞的廣大門徑,使自己的心沿著正確的道次第好好地行持,不要一生空忙,甚至多生多劫都空忙。這不是一般的悲慘喔! [08′29″]</p>
<p>   所以在前一小段說造論的宗旨,說為什麼要造這本論,就是為了點醒這樣用功又自以為在修行的人呢!佛菩薩悲憫我們,所以才給我們講這樣的道理。那對我們自己來說,要不要信受、要不要聽聞過來人的經驗呢?因為如果不去聽的話,可能修不出來東西,或者一開始是錯的,到最後都錯的,自己都不知道,還以為自己修到什麼什麼地步了。因為我們沒有拿一個正確的教理作為我們的一面鏡子,或者一把尺,去丈量我們到了什麼地步。我們完全跌落在自己的感覺裡,自以為是的,比如說修出來這個啦、修出那個......,完全是自我的感覺,而不是佛菩薩在經典裡告訴我們的那樣的原則。而我們感覺很好,但是未必是很好的。 [09′33″]
<p>   那麼說:好、好、好!那既然要修行啊要多了解、多聞,結果多聞的話呢,說「廣聞不善於修要」,聽了很多道理以後,他又在文字上面去摸索去了,不善巧這個修行,這是一種。還有一個毛病哪,他聽了很多以後啊,他自己不修還這專門管別人閒事。這個事情的的確確很容易,因為我們的眾生的常態。平常我們哪,這個任何一個人,因為無始以來我的習氣在,所以看自己不大容易,看別人很容易。那麼世間的人來說,他那個標準本來世間的標準,大家都馬馬虎虎。現在你修學佛法了以後,了解那個標準提高了,結果你提得很高那個標準,拿那個標準去照別人的話,那害了!像個照妖鏡一樣,這一看哪!世間所有的人都是妖魔鬼怪,沒有一個像樣的,只有一個人沒看見——自己!就是這樣,這個是非常嚴重的事情! [00′58″]</p>
<p>   好!師父在這一小段裡,非常精闢而又犀利地指出了我們的現狀。前面說了修行一定要多聞嘛就多聞,聽了很多道理,結果在文字上面摸索去了,不善巧這個修行。說:「在文字上摸索」,那我先問大家說:「在文字上摸索」是不是必要的?是必要的。那麼僅僅停在文字上的摸索,就是不可以的。那麼為什麼他僅僅停在文字上了呢?那文字到底懂沒懂呢?為什麼導致他不善於修要呢?聽了那麼多應該很懂得修行啊,因為道理就是為修行而說的,而我聽聞也是為了修行。那麼為什麼到最後還不善巧修行呢?什麼原因? [02′01″]</p>
<p>   所以,廣聞不善於修要。師父在這裡說:在文字上摸索,然後不善巧修行。這種狀態就是文字可能是特別特別地熟練,但是一談到內心的行相的時候,就無法對焦了。 [02′22″]</p>
<p>   比如說舉個最簡單的例子:「<p> 諸惡莫作,眾善奉行<p> 」就這麼幾個字而已。「諸惡」,大家可以想到大的惡行和小的惡行,大的惡行不要做,五逆十惡不要做,那麼小的惡行呢?比如說背後議論人啊、議論人是非呀,對別人說話不是很客氣、沒有敬意啊;比如說某一天拿著經典也沒有什麼敬意,就這樣就過了。這些看起來都是一些不經意的時候所犯下的一些過失。那麼如果我們去學了教理的話,我們就知道在因果部分,就算是小的惡行也不可以做的,因為小的惡行會累積成大的。還有如果是對殊勝的對境所做的,一瞬間所積累的惡業也是不知道多大的。 [03′17″]</p>
<p>   這樣的道理是一下就聽了,但我們在自己的心上怎麼可能建立出這樣的一個量?所以文字上看起來就是這樣念懂了,也知道這什麼意思,但你到底內心上能不能如文字上所闡釋的生起那樣的量,還是有一個很長的距離。所以說既要「廣聞」又要「善於修要」。 [03′46″]</p>
<p>   其實這裡邊著重點是說要「修要」,對吧?不能只是在廣聞。然後師父在這裡邊還是很溫和地說:「<p> 不善巧這個修行<p> 」。像親近善知識法,其實如果在《廣論》裡沒有這樣子詳細地闡釋的話,可能我們讀《華嚴經》啊、讀一些其他的經典,也會注意到實際上修行要有一個善知識引導的,但是會不會有這樣明晰的次第呢?修信、念恩,還有怎麼樣一步一步的、華嚴九心等等,會不會有這樣的嚴格的次第呢?就不知道該怎麼做了。一旦確立了這樣的一個次第之後,對於我們的心來說,我是聽到了之後就覺得「我知道了」,還是我會在心裡邊把它當作一個我的目標,我要如我聽到那樣去做到它?注意!是做到它。不是僅僅聽到耳朵裡就算懂了,就我明白了、我聽到了,而是說我要把它做到,就是要如經典上所詮釋的那樣,在我的內心中生起那樣的量,這才是廣聞的目的。 [05′04″]</p>
<p>   為什麼停留在文字上?剛才我問大家說,有一種是他不知道為什麼要聽,他聽完就以為完了,就覺得聽到了,佛法大概就是這樣,我都懂了,道理都懂了。我要辯論可以辯論,要討論問題都可以跟你討論,而且我都可以做很多引證,但是不止於此啊!所有的這些都是為了改變自心的惡習氣,要挑戰自我的煩惱,要打擊以自我為中心的這種煩惱,打擊、徹底地對治自性執,對吧?所以從這個角度來說,修心啊!廣聞,要善於修心啊!這個也是在很多經典裡、很多善知識的開示裡邊一直叮嚀我們的,一定要把所學的拿來在內心上去運用。所以師父說:不善巧這個修行,這是一種「廣聞不善於修要」。 [06′07″]</p>
<p>   列舉完這種了,我們剛才總結為:他可能聽聞的時候動機就不對;再一個可能是整天忙著聽聞,聽很多很多,就是沒有把它善巧地攝為修心,然後在警醒自己的三業上再念念去用功,缺了這個功夫,這是一種;還有一種,現在我們應該所有的同學好像全都知道了,就叫「法鏡外照」對吧?聽了很多之後,師父說:「他自己不修,還專門管別人閒事」。我問大家一個問題:管別人累不累呀?累吧!那管別人的閒事不是代他操心、是一個好事情嗎?師父在此處為什麼說:「管別人閒事」呢?好像別人的事情都是閒事嗎? [07′04″]</p>
<p>   師父為什麼會這樣說呢?管別人好不好呢?很難說喔!為什麼別人的事是閒事呢?難道只有自己的事是正事嗎?別人的事都是閒事嗎?那要怎麼理解這句話?明明別人的事也都是大事,有的都是很重要的事,為什麼師父稱為閒事? [07′28″]</p>
<p>   比如說修行這件事情,如果自己不修的話,他會不會有引導別人的經驗呢?因為那經驗,尤其是修心這個經驗,你如果不走過這個路,你怎麼知道哪裡有坑坎、哪裡該左轉、哪裡該跳過去?你是不知道的。 [07′46″]</p>
<p>   那麼我完全沒有經驗的時候,我去管別人的話,能不能管到當處呢?能不能管到恰到好處呢?管不到,對不對?管不到,那做的一切就成了閒事了,對不對?因為你沒有經驗,你去引導別人,欸!比如說我要去一個什麼什麼鎮,我要去那裡,結果有一個人完全沒有去過那裡,然後他自己還路痴,他帶你,但是走來走去、走來走去,就走到另一個地方去了,那不就是閒功夫,都浪費時間了,對不對?所以,當我們自己沒有獲得修行的經驗的時候,我們管別人,師父還放一個「專門」管別人閒事,看來是很熱衷的。 [08′28″]
<p>   師父說:「<p> 這個事情的的確確很容易<p> 」,管別人閒事很容易,大家會認為管別人閒事很容易嗎? [00′11″]</p>
<p>   首先我們可以區分一下,管別人閒事是不是出於利他心?我是因為想幫忙別人才管別人的,那為什麼管別人成了閒事而不是正事呢?師父不是教導我們要利他嗎?要代人著想?那管別人閒事是不是關心別人?管別人閒事的行相和定義到底是怎樣的?大家可以想一想。 [00′50″]</p>
<p>   從師父講的上下文看來,如果一個不會修行的人管別人閒事,如果一個不會修行的人管別人修行,必須用到照妖鏡,為什麼呢?為什麼沒有一個美麗的觀功念恩的鏡子呢?因為我們未曾慣修,那個鏡子還沒有修出來,只有照妖鏡,所以只好用照妖鏡照別人。用這樣的鏡子照了別人之後,別人的生命會變美好嗎?別人會因此變善良嗎?真的能夠幫忙到別人嗎?如果幫不到,會怎樣呢?反而以這樣的習慣傷害了自己對他人的恭敬心,自己也害了。所以從令自他都變美好這樣一個目標和願望來看,這個目標和願望根本沒有達成,浪費了時間、浪費了心力,是不是就成了管別人閒事呢? [02′05″]</p>
<p>   為什麼管別人很容易呢?因為「<p> 我們眾生的常態。<p> 」這句話有一個很深的、很深的玄機。說:「這個事情」,請問這個事情是什麼事情?是不是自己不修,還專門管別人閒事?這很容易吧?說:「的的確確很容易」。我們眾生的常態是什麼意思?就是我平常就是這樣子的,我們不習慣也不善於修行自己,卻習慣到處看別人毛病,因為向內觀察、向內調伏的功夫還沒有學會。 [02′49″]</p>
<p>   所以說師父說:「<p> 平常我們哪,這個任何一個人,因為無始以來我的習氣在,所以看自己不大容易。<p> 」無始劫來的習氣,無始劫來多長?多長時間呢?什麼叫習氣?沒有開始,經過長劫無法計算的時間一直到現在,我們泡在一種習慣中,這種習慣是那麼熟練,習慣到自己都沒有發覺就可以做、可以想,習慣到自己不用特別策勵,就輕而易舉地那樣做出來的。哪樣做呢?就是什麼?看自己不大容易,然後奇怪了!「<p> 看別人很容易。<p> 」這兩句話大家在心裡可以認可嗎?修行這麼多年了,十年了、二十年了,有的三十年了,會覺得看自己不容易、看別人容易嗎?還是你們覺得看自己也不容易、看別人也不容易?看別人很容易,對不對?比如他有什麼問題,就好像一目了然的樣子,對不對?看兩眼就覺得好像看懂了。然後看自己,看自己會看不懂嗎?會覺得我們看不懂自己嗎?你會覺得你是自己的陌生者嗎?你會覺得你的心是一個陌生的人,好像你跟一個陌生的人同路走了這麼多年一樣? [04′28″]</p>
<p>   會覺得看自己不容易嗎?其實你認真地去抉擇師父的話,你會覺得是這樣嗎?我說的玄機即在此處,師父說我們的常態就是「愛管別人閒事」,而且很容易就管了,為什麼呢?因為無始劫來就這樣。無始劫來為什麼這樣?大家可以好好地去參究一下。其中有一個理由,我們會認為我們生命的痛苦都是別人和環境造成的,會一直看著別人,希望別人能夠改正,從境那方面調整,我們的心、我們的生命可能就快樂了。我們沒有意識到心有明而覺知的力量,心的本性是光明的,如果能夠在心上明了無自性,去除心中的苦因,就能夠徹底地解決生命的痛苦。我們就是因為迷惑此點,長劫串習自性執,不曾明了自心啊! [05′53″]</p>
<p>   如果看了這句話的話,我們怎樣拿這句話來修正自己呢?其實可以想一想:我早晨一起來,我是把所有的注意力更關注在我的三業、我所造作的業的觀察上?還是像師父說的。眼睛都長在外面看別人怎樣怎樣、都看外面?很容易,我們的六根馳於外境——六塵,很難收攝內心;有的就算收攝了,一會又放出了;一收攝的時候甚至是什麼也看不到。所以這是第一個問題,無始劫來我們的習氣是不是很難看到自己?看到別人很容易。 [06′40″]
<p>   那麼第二個部分就是:世間的人來說,世間的標準馬馬虎虎,互相就這樣看了。但是如果學佛法的話,標準提高了之後,拿這樣的一個標準,注意!拿這個標準應該是先看自己的,但是他忽略了第一個程序,跳到了什麼?還是順了無始劫來的習氣去看了別人。那麼一看別人的話,都比原來看得還糟,為什麼呢?因為這個鏡子太厲害了,這個標準太高了!師父說:「<p> 害了!<p> 」說拿那個標準去照別人的話,害了!像個照妖鏡一樣。「<p> 這一看哪!世間所有的人都是妖魔鬼怪<p> 」,下面一句話就更可怕了!「<p> 沒有一個像樣的,只有一個人沒看見——自己<p> 」,說:「<p> 這個是非常嚴重的事情<p> 」。 [01′11″]</p>
<p>   想一想喔!在三十年前,師父就告訴了我們這個現象。當我們拿法的標準去衡量別人的時候,我們的心會越來越快樂嗎?是否會有幾許失落、幾多悲憤,理所應當地成立別人都沒有努力修行?是這樣嗎?好像自己都很努力修行的樣子,是這樣嗎?如果一直這樣認為,會不會我慢呢?會不會產生像《廣論》上所說的「我是超勝我第一」這樣的想法呢?抑或「眾人皆醉我獨醒」?把自己放到一個很高的平台上去評判別人,彷彿自己已經是一切遍智了,已經徹底了達了自心和別人的心,沒有任何錯誤地判斷出別人沒有修行。這樣走著走著,就越來越孤單了,因為前後左右都看不到友伴,因為前後左右都是妖魔鬼怪,只有自己一身潔白。可能嗎?我們這個世界是凡聖同居土,我所遇到的人哪一位是聖者可能完全不清楚。萬一我們眼拙,用那個鏡子照到了菩薩,那個扭曲的鏡子到底會把我們的來生帶到哪裡去呢?我們這樣照下去,得造多少惡業?那損失實在是太大了!用師父的話來說:那就害了! [02′56″]</p>
<p>   有一句話說:「高高峰頂立,深深海底行。」我們一旦確立了正確的修行見解,絕對不可以忽略平常的行為,所謂不可以因為善小而不為。舉個簡單的例子,打招呼,就是看到人微笑、打個招呼,這樣是挺好的、挺親切的,但是我們會不會忽略這個呢?比如說我們到了一個新的居住的地方,我們會不會很注意跟鄰居先交個朋友?然後見個面很熱情,甚至有點什麼事情請他幫個忙?大家迅速地就開始融洽了。這樣別人也不會擔憂,我們自己可能也在新的地方居住得很順心。還有就是跟父母親說話盡量和顏悅色,不要跟父母親吵架,用非常柔和的語言和態度對待自己的父母親,其實這也是很基礎的,也是很重要的事情。 [04′13″]</p>
<p>   像有的時候我們開新班,有一些新的同學來到班裡之後,當我們發現他好像有點跟我們所學的真理不相符順的時候,我們有的時候就直接去說了。是不是要等一下,觀察一下他的個性啊、脾氣啊、秉性啊?看一看他學佛多久了?然後再看一看他有沒有什麼困境?這些都是要做觀察的,然後再給別人一點意見。尤其是新的同學在班裡有的時候會提問題,因為很多重要的原則可能還不知道,所以他提問題的時候,如果馬上就跟他說:你這樣是對這個不恭敬、對那個不恭敬!他連提問題的機會都沒有的話,那會不會給新同學融入、開始學習造成一些困境呢?所以有的時候我們會特別特別地執著,也希望別人能做到那些。但是對剛開始學習的人來說,還是要一長段的時間熟悉這些重要的原則的。 [05′36″]</p>
<p>   這樣的話,注意調整這些方便,我們就不會特別特別執著,見到一個人就把很多道理擺在他面前,而且一看到別人就容易去調整別人、去指出別人的問題,自動地就成為校正別人的小老師了,忘記了佛法的第一步是要觀察自心、改正自己的缺點和毛病。如果我們不會改自己的毛病,甚至看不到自己的毛病,修心經驗不足,甚至沒有,甚至連正知見都沒有獲得,那我們豈能把別人看明白,豈能夠幫別人改毛病呢? [06′19″]</p>
<p>   學到這裡,有人說:「因為我什麼也不會,所以我也不能幫人。老實修行自己,大家的事一概不承擔,因為我沒有能力!」請問大家要怎樣思考這個問題、回答這個問題呢?佛法還提出一個觀點叫「隨分隨力」,總有一些責任和義務是自己要承擔的,不能把所有的事情都推給別人。如果不曾學會,那麼就現在開始學嘛!什麼也不做,就會修行了嗎?如果什麼都不想承擔,那麼在各種境界中歷事練心的方便也沒有機會去練習了吧!如果都沒有機會練習,怎樣獲得呢? [07′07″]</p>
<p>   實際上一旦我們看自己,當我們鎖定我們的內心好好觀察的時候,我們也會看到越來越多的自己的錯誤;當我們看到越來越多自己沒改正的地方之後,我們自然不會對別人那種態度。我們就會知道自心是一個很神秘的事情,好像有太多重的風光。無論幫忙別人,還是幫忙自己,如果都能從修鍊自心的角度、成長美德的角度去努力,那師父就不會那麼擔心我們。把師父的提醒放在心上,怎樣放在心上呢?怎樣能夠不拿照妖鏡照別人呢?當發現自己那個鏡子又拿起來的時候,停止一下、觀察一下:我是不是又拿照妖鏡照別人?我們應該以法自照。那麼以法的標準來衡量自心的話,是不是以法自照呢?如果以法自照、以法自明,我們就自然看周圍的人不再是妖魔鬼怪,我們就會發現很多很多要向別人學習的地方,發現很多很多人其實都很努力,甚至非常地善意。我們將在明了自心的過程中,去發現這個世界的美好,其實這是一種很有趣的經驗。 [08′45″]
<p>   還有一點,如果我看我自己有這麼多毛病都沒有改,我如何在大眾中自我傲慢呢?學了很久、聽了很多,但是有依照經論修改自心嗎?修改了,修改的深度又如何呢?論典有修治和救護兩種功德——修治煩惱,救護我們脫離惡趣。我們都了解惡趣也是由於煩惱導致的,可是煩惱和惡趣的因在哪裡呢?在我們的心裡邊。所以最關鍵的問題是:聽了很多,真的有沒有聽懂?聽懂了的話,是不是一定會把佛法用在身心上?因為佛菩薩就是為了改變我們痛苦的現行才說法的,不是讓我們聽聽就算了,因為光是聽到了,沒有真實地對治苦因的話,痛苦是不會消除的;更不是讓我們聽了很多很多,徒具多聞的虛名。佛法是要在身心上真實操作的,所以一定要改惡向善,改變缺點一定是首當其衝。 [01′47″]</p>
<p>   學久的人應該是什麼樣?應該習慣向內觀察,對法義串習得相對熟練。一旦我們認真地降伏自己、觀察自己的時候,我們就不會拿這個照妖鏡到處去照別人的過失,我們會去判斷內心和自己的行為,何者是照妖鏡的老習慣,何者是法鏡自照的新習慣。一旦我們看自己的缺點、看自己的內心,越看越多、越看越深,一個問題後面還有一個問題,我們會忙於對自己相續的觀察、探索,會發現內心真是千變萬化,每一天、每一個小時都會有不同的顯現。在這個顯現中,我們怎樣提正念?用所學的教典引導自心朝向解脫、朝向菩提心,甚至朝向思惟空性的方向。 [02′56″]</p>
<p>   我們會發現以自我為中心的行相:凡有事情發生,是基於此世的安樂考慮,還是有發生希求後世安樂之心呢?觀察越久,越發現我們的現行是經典的對面,要改的東西幾乎比比皆是,凡有力量都想用來改變內心,改變內心不如法的現行,也即是修改苦因,也即是改缺點。我們好想體會佛法深邃偉大的改變內心的力量! [03′37″]</p>
<p>   如果你拚命地想改變自己的話,那麼當我們遇到一個人,我們會從哪個點去看他呢?我們會發現說:喔!他好像比我更敬重教典;他背經、背論,背得好多,比較厲害;還有他思辨的理路比較犀利;還有這個修行人他比較踏實,口業守得非常好,幾乎很少出口傷人。雖然這個修行人其他的優點都不是那麼突出,但語言真的是非常地調柔、不傷人,這一點就會讓我們五體投地地佩服,因為自己做不到嘛!對不對? [04′25″]</p>
<p>   當我們想要改變我們內心的一個缺失的時候,我們就會一直在尋找誰在那一點做得好?做得好,我要趕快學他是怎樣改的。舉個最簡單的例子——收拾廚房,當我們想要把一個廚房擦乾淨,確立這個目標,我們就會留心哪些人特別擅長整理廚房,他整理的廚房井然有序、乾淨、光潔,所有的器物都一塵不染,好像會發光似的,他是怎麼用心的?他有什麼方法?我們一定就會從這些角度去觀察、學習他的發心和技巧。所以一旦我們把目光鎖定改變自己的時候,不知道為什麼就好像很多順緣都會出現,因為你會發現這個人也在教我、那個人也在教我,這個人也比我強、那個人也比我強......,每個人都有比我強的點,那麼我在大眾中,還怎樣傲慢呢?我還怎麼看人家都是妖魔鬼怪?自己心裡的妖魔鬼怪都已經降伏不完了。 [05′46″]</p>
<p>   我們看很多人都有那麼多優點,因為自己有太多不足的東西。師父的這個話再反過來一個狀態,其實應該是那樣的,所以有「眾生腳下行」。大德們的修行,對一隻螞蟻都不曾輕視,因為他說:「這個腳下的螞蟻和我誰先成佛還不一定。」像我常常說我曾經在求法的時候,在五臺山遇到一位法師,他遇到任何人都觀想在那個人面前頂禮三拜,因為他說他一定會拜到佛菩薩,因為不知道誰是佛菩薩,我們這個地方是「凡聖同居土」。 [06′40″]</p>
<p>   一旦我們注意到所聞的法義能結合內心修習的時候實在是太少太少,聽到和做到距離很是遙遠。珍貴的法理,佛菩薩、善知識完全是為了我們能夠用在內心上講的,因為真正的苦因就在自己的內心,苦因不去消除,苦果就會再度出現,我們就會在痛苦中漂泊、沉淪,無法獲得生命的大自在。所以「廣聞不善於修要」,這該有多麼地遺憾!如果把這個毛病改了,開始拿所聞的法義來修心的話,我們看世界、看外面,「沒有一個像樣的」、「世界這麼多妖魔鬼怪」這種所謂的顛倒的、在內心上顯現的現象,一定也會翻轉過來的。 [07′36″]</p>
<p>   既然觀察自己的內心、改變內心這麼重要,那是不是其他的都不重要?我什麼都不想管,因為沒能力管。大家想想,觀察內心的時候遇到了這個念頭怎麼辦?因為我們會發現忙碌的時候,看內心就很不得力,好像有很多閒工夫才能看到內心。所以到這裡問題的關鍵演變成了什麼呢?是不是成了忙很多事還是不忙?可是真正的問題是向內調伏還是不向內調伏。 [08′14″]</p>
<p>   我看自己到處都是毛病,不是什麼也不要做了,而是說正因為有這麼多毛病,我要趕快積資糧啊!我趕快承事父母師長、承事大眾呀!我這麼多缺點,還不累積資糧,怎麼能夠改變越來越多看到的缺點呢?所以看到自己毛病的人是很忙的,不是說他不敢去做事情,他是透過做事情要改變自己,這是師父說的歷事練心啊!在事項上忙碌,只重視事項的成敗,這是以往的習慣。我們要把做事情當成是修行,就是修行本身,在做事的時候精勤地觀察內心、提起正念、向內調伏。 [09′12″]</p>
<p>   每一件事都會推動我們的心去靠近真理,每一件事都提醒我們自己:我在哪裡對境又迷失了正知正念?在做事的時候,會跟很多人打交道,我們可以觀察「以自我為中心、沒有替他人著想」的老習慣是怎麼出現的?行相是怎樣的?把每件事很莊重地、很認真地做好,盡心盡力地做好,專注地做好。以此集資淨障,實踐以法調伏內心的生命宗旨,雖然辛苦練習,但這才是佛菩薩所歡喜的修行之路;如果不這樣練習,在煩惱中輾轉不是更辛苦嗎? [10′06″]</p>
<p>   我小的時候曾經看過一個故事,說有一個小男孩有口吃的毛病,可是他卻很想當個演說家,他為此非常苦惱,因為他連講清楚一個簡單的事情都很吃力,一說話就常常被同學們嘲笑,可他並不死心,還是想當個演說家。後來有一個人告訴了他一個方法,從此每天早晨他就去河邊,嘴裡含一塊石頭,練習說話,大聲說話。風雨無阻,日復一日,他從不間斷,即使舌頭很痛,他要克服疼痛,有的時候甚至舌頭磨出了血,他依然不想間斷。後來他改掉了口吃的習慣,開始流暢地表達他的思想,而最終這個男孩如願以償,成了一個大演說家。 [11′14″]</p>
<p>   佛法的事業始終是內心的事業!雖然很多事情做出來了,但是如果只是為了把事情做出來是不行的,最重要的是要在做事情的過程之中調伏煩惱,調伏煩惱才是真正寂靜的事業。唯有調伏煩惱,我們才能夠體會佛法震撼人心的力量,我們才能夠在生命中真實地體驗到佛菩薩所講的法對我們的內心、對我們的生命,甚至對我們的命運到底有怎樣離苦得樂的偉大的作用! [12′01″]
<p>   這裡邊最重要的一點就是:拿那個標準去要求別人,和拿這個標準要求自己,分水嶺就在這裡。那麼,你說可不可以拿這個標準去要求別人?是可以的。但是他出於什麼?慈悲心,就是拔苦與樂、真實饒益他人的心。不是看不起別人,好像覺得自己比別人好,而是真的想讓別人好。我在師父的日記裡曾經讀過好多段,師父會寫到會管如俊法師啊、會管上座法師啊,師父非常非常地在意我是看他不對、不順眼,還是我看他苦想幫他。你看他不順眼去說他,和真的看到了:這是苦因啊,將來會受苦的,所以我要幫你把這個苦因去掉,這兩者的心是有很大的差別的! [01′17″]</p>
<p>   我有一次還看到師父的一段日記裡,我記得大概有這樣一段描述:有一個法師做錯了,師父發現自己非常急切地想要去調整他。當他看到自己的這種心的時候,就選擇沒有去調整。又過了一兩天之後,他發現對這件事情的觀點全變了,他覺得:哎呀,某人啊!這樣做你自己會受苦啊!那個責怪他的心已經全都沒有了,所以這個時候師父就去提醒他。提醒他之後,師父說不管他聽還是沒聽,他已經真實地做到了不是因為煩惱別人,而是因為真正的是我要去幫一下。所以當生起了那種真實的與慈悲相應——師父很謙虛地說「那一點點樣子」——的時候,他自己回去都很歡喜、很歡喜。 [02′32″]</p>
<p>   師父說「照妖鏡」這件事,我覺得我們要一直放在心上。其實如果把這個鏡頭形象化一下,可能會覺得很匪夷所思的。想像有一個人站在高處,拿一個鏡子照天、照地、照人,然後說:「啊,你臉髒啦!」「他那個衣服髒了!」「這個地方需要清掃!」一直在指揮別人。可是他自己呢?他自己的衣服呢?破爛不堪,完全都是髒的!而且臉上全部都沒有洗,一層一層都是髒的,可能頭髮裡面全是油汙、全是灰塵,然後他拿個鏡子。如果這樣一個鏡頭出現我們面前的話,我們會不會覺得這是一個非常滑稽的鏡頭,對不對?他照到的那些人會不會聽他的呢?他照到的那些人會看什麼呢?會看他全身那麼髒,還說別人!就這樣互相照來照去,對不對?所以就變成了管閒事了。 [03′47″]</p>
<p>   師父在這裡邊說:「<p> 拿那個標準去照別人的話,那害了!像個照妖鏡一樣,這一看哪!<p> 」就是拿去照了,看完之後什麼結論呢?「<p> 世間所有的人都是妖魔鬼怪,沒有一個像樣的。<p> 」我覺得更奇怪的還有一件事情,就是「<p> 只有一個人沒看見——自己!<p> 」我們可以想一想,那個鏡子的功能那麼大,為什麼不拿來照照自己呢?為什麼照了那麼多人,唯獨留下自己呢?想想那個站在高處的人這樣照的時候,如果底下有個人說:「你身上那麼髒,你要不要拿那個鏡子照一下自己呀!」那個人會做何想呢?「我說你,你不聽,你還觀過!」會不會?這個念頭馬上就會出來。 [04′53″]</p>
<p>   這是很不可思議的一個事情,為什麼眼睛能看到那麼多、那麼多的人,那麼多、那麼多的現象,唯獨看不清自己? [05′05″]</p>
<p>   我們會認為看不見自己嗎?我們會認為自己不了解自己嗎? [05′12″]</p>
<p>   當我們跟善知識學法的時候,我們會認為自己不了解自己嗎?有些人完全是自己指導自己修行,自己訂一個計畫,然後自己覺得該怎麼樣、該這樣對治、那樣對治,就是弄得可能不知道都偏到什麼地方去了,然後自己覺得都是很有道理的。善知識三令五申的教誡都彷彿聽不進去,或者是完全不理解,以自己的感覺為主。所以以自我為中心,沒有拿自心去校對善知識的教誡、還有經典的標準,自己想做什麼就做什麼,完全不是「觀父容顏」,不是「作師所喜」,而是自己怎麼順心、怎麼開心怎麼做,令自己歡喜。這個完全就是跟第一個道次第顛倒的、反過來的。所以如果以這樣的修行,想出離生死的苦海,應該是極為困難的,因為那個方向、那個標準是引航者才會了解的。正如經典所說:善知識和經典才是我們出離苦海的眼目啊! [06′29″]</p>
<p>   在這一小段,師父也明確地告訴我們說:佛法的次第第一是要先拿這個標準來看自己的,所以戒律的精神是律己的,不是拿來繩人的。講到這裡就有很多人說,比如說:「我是老師,我也不想繩人啊!但是我不管的話也不行。我也不是煩惱都淨除了,但是我就得管學生啊!」他說:「因為我有煩惱,所以我不能管他們。」那怎麼辦呢?最重要的就是知道自己的煩惱還沒有淨化。 [07′17″]</p>
<p>   當我們有責任在身,必須為團隊負責任,負責調整別人的時候,注意到自己如果起煩惱了、心裡不寂靜、起瞋心了,甚至起傲慢心了,那要趕快同時怎樣?要調整自己。不可能是單方面地只去調整別人,一定要同時調整自己。因為當你調整自己的時候,你會注意到自己的內心是什麼狀態,警覺自己的心有沒有提起正念,清晰地注意到說什麼話、為什麼目標而說、對方聽的狀態如何、對方的感受是什麼、對方的願望又是什麼?當我們內心平靜,對他人充滿善意,就很容易理解別人,會非常有空間代人著想,不會陷在自我的情緒裡,被混亂沖昏了頭腦。同時,如果對方很不平靜,我們也可以注意到不要讓對方的情緒傳染到自己,而是要努力使對方平靜下來,好好地談話。如何使對方平靜下來呢?理解很重要。當我們看別人的問題、調整別人的時候,我們會看到自己的心也正在發生問題,必須同時處理。 [08′47″]</p>
<p>   我再說一遍。去調整別人的時候,同時會發現自己的問題,請問這是怎麼發現的?不是眼睛都在看著別人,為什麼還看到自己了呢?因為長期以來用功的習慣,注意!那個用功的習慣,就是一直在看著自己的心的一個正知,一個在覺察著自心起心動念在朝什麼方向轉、自己的嘴在說什麼那個注意力,還是有一個餘力在觀照著,是不是?沒有失去正念,沒有失去觀照。這個時候,你雖然在講別人是哪裡錯了、哪裡錯了,但同時你對自己也是在觀察著的。 [09′45″]</p>
<p>   所以當我們發現自己有問題的時候,我們也要馬上調整,不能蓄積煩惱。宗大師在《廣論》裡說:「<p> 煩惱稍出,即應用矛數數擊刺。此復自心隨何煩惱生已無間,視如怨敵與之鬥戰。<p> 」說:「<p> 煩惱稍出<p> 」,剛剛出現煩惱的苗頭,為什麼能夠用正念的矛去數數打擊煩惱?大家可以想一想,為什麼能做到這一點呢?因為有哨兵——有雪亮的眼睛。我們對自心的觀察力,透過訓練,敏銳而清澈,煩惱一出來,馬上認得,立刻開始對治。所以無論是生何種煩惱,他說有個「<p> 生已無間<p> 」,就是沒有間隔,注意到了馬上開始。那麼態度是什麼呢?把這個煩惱看成是怨家仇人一樣,與它戰鬥。就是我們的內心對於自心現起的煩惱,就像怨家和仇敵一樣,要與自心的煩惱戰鬥。 [11′10″]</p>
<p>   那麼如果不這樣做會有什麼壞處呢?大師教誡我們:「<p> 若不爾者,初起忍受非理作意,令其資養成無可敵,唯隨彼行。如是勵力縱未能遮,亦當速斷莫令相續。應如畫水莫如畫石。<p> 」如果不這樣的話,會出現什麼問題呢?剛開始出現非理作意的時候,我們認為沒什麼,好像不會造成很大的困擾和混亂,是可以忍受它對內心的侵襲和汙染。可是一旦資養成比自己的對治力要大好多倍,沒有什麼是那個煩惱的對手的時候,我們就只能乖乖地作它的奴隷,跟著煩惱走。所以我們必須深知煩惱的過患,應該像對待火一樣。一點點火星,在森林裡都是非常非常危險的,可能會引起森林大火;一點點煩惱,可能也會燒毀我們的善業之林啊!所以,要警惕!要知道非理作意即使是有一絲絲,也是非常危險,必須要確認到一點點的非理作意也是很危險的!一旦我們對自心有這樣一個警覺的態度,當我們去調整別人的時候,也同時知道自己的心也是很危險的,可能一會兒就會犯很多錯誤,對境辨別善惡的能力還不夠強,所以怎能掉以輕心,以調整別人為名而放鬆對內心的警惕呢? [13′00″]</p>
<p>   在調整別人的時候,先調整自己,對自己內心的關注就像繩索拉著狂馬一樣,絕不要失手,但是鬆緊適度。我們數數地注視內心,聽自己說的話,反觀自己的思路有沒有依據、是非理作意還是如理作意?我們養成法鏡內照的習慣,用法的這面鏡子同時照自己又照別人的時候,法的味道也會慢慢地在我們的自心出現,我們可以體會得到。那到底是有多少清醒、有幾多歡喜、又有幾多清涼?而在面對他人的時候,也容易體會到他人的難處,認識到他人的恩德、他人的偉大。所以師父擔心的照妖鏡的問題,是不是也就此可以解決了呢? [13′59″]
<p>   大家好!又到了我們研討《廣論》的時間了,最近大家的心情怎麼樣啊?有沒有很多焦慮、很多沮喪?當看到這些心情的時候,有沒有去調整它?最近我們討論的主題都是「照妖鏡」的問題。學了這麼多年的法,看了這個照妖鏡的問題,可能你我都還是會怵目驚心。當我們用師父講的法來反照自己的語言和自己的行為和思想的時候,就會看到很多做錯的地方,或者:「哇,原來我就是那個拿照妖鏡的!」看了之後,會不會心沉呀? [00′59″]</p>
<p>   比如說:啊!只要一想幫忙別人,發現就拿照妖鏡開始照了。用其他幫忙別人的方式好像又不是很熟練,比如說管小孩啊,或者帶學生啊,甚至帶自己的團隊,都會發現這個照妖鏡的問題一直困擾著自己。我希望大家觀察到這一點之後,不用給自己太多的指責、太多的埋怨,或者心力就掉下去了。因為當我們看到這個問題的時候,應該感到欣喜啊!為什麼呢?發現啊!喔,原來這就是照妖鏡的實際操練啊! [01′42″]</p>
<p>   當我們發現了這個問題之後,不要認為我就是照妖鏡本身。我可能有這個照妖鏡的現象,但是我還有其他現象呢!比如說我還學習觀功念恩,我在觀功念恩的時候體會到了這個世界的美麗、別人的善良、周圍人互助的這種氛圍,我有時也會感覺到很歡喜的。在聽法的時候,感念善知識的恩德呀,聽到法義的美妙也會生起清涼啊!所以,就像因果一樣,花的種子就會開花,蘋果的種子將來就會結出蘋果,它是分門別類的這樣;不能說用照妖鏡的這個問題觀察自己之後,自己的生命整個就變成照妖鏡,都覆蓋了。所以還是會有其他的觀察點。 [02′33″]</p>
<p>   我的想法是你也不用太過心沉,因為拿鏡子照,照到自己的臉有一些沒洗乾淨的地方,不是說:「哎喲,這個太糟了!我的臉怎麼這麼髒呢?」「啊,好可憐啊!」或者說:「我很可惡!」說這些話的同時,可能不如拿點清水把它洗洗就可以了。當我們發現自己有問題的時候去改正它就可以了,不需要給自己戴一堆帽子,說很多埋怨的、自我憎恨的話,可能那個習氣也未必能改變。最重要的,這些法義是讓我們來警覺自己的行為,注意到一些沒有注意到的現象,調整那個方向。這樣可以給我們的生命帶來更多的平靜、更多的喜悅,還有與他人的這些矛盾可能就變小了、甚至消失了,會感到更多的和平。 [03′26″]</p>
<p>   所以當我們拿「法鏡外照」的這個問題來照自己,會發現自己很多問題的時候,要避免一個現象,就是心沉!你不要心沉。發現了,高興呀!我終於沿著師父講的理路修心了,修心我就發現我有問題,有問題就改嘛!改的過程中可能會怎麼也改不過來,改不過來,只要在改,其實每天都是有一些小進步的。只不過有一些進步是被我們忽略不計的,我們想要從此頓斷——啊!一下子揮刀斷水,希望水不要流。其實這個無始劫來的習氣,需要我們耐心一點,慢慢地每天改、每天改。當自己做對一點之後,就給自己貼一朵小紅花:「欸,進步了!」要隨喜一下自己。所以我希望大家看到自己這個毛病之後,不要太過心急,尤其是注意到心沉的這個問題。看到問題的時候是要我們解決問題,不是要我們沉下去的;問題是給我們發現,然後收穫發現的喜悅,而且去改變這個痛苦的因,去得到快樂的。 [04′35″]</p>
<p>   所以在這一點,就希望大家也要警醒一下自己。如果發現自己看到麻煩就會有心沉的習慣,那要考慮一下:看到麻煩是發現,那麼解決這個問題的方案有嗎?有!那麼當下怎麼運作會嗎?對境的時候,就看自己的心。如果看到一點,又開始法鏡外照了,那就想一想:他有的毛病我有沒有呢?可能我比他還嚴重呢!那麼我們就不會在痛苦發生的時候,認為痛苦的來源和起因是他人的錯誤。可能他人的行為和語言是個緣,如果沒有那個勾是勾不出來的,但是真正麻煩的因素是在內心深處,這就是我們常常要法鏡內照發現的東西。 [05′21″]</p>
<p>   真正的苦因是在裡邊,是在內心上,而最大的問題就是無明啊!就是對境的時候,境那邊好像是獨立出現的,沒有我的心安立的那一分。我們常常會感覺不到,也觀察不到內心對境有安立的那一分;就是自己的心對現在這個狀況是負有絕對責任的,我們常常會忽略這一點。那麼因為發現了,忽略了也沒關係!為什麼沒關係?因為我們現在想改變它了! [05′51″]</p>
<p>   所以也不要看到自己的毛病之後,就引生很多焦灼、嘆息,甚至是沮喪的情緒,因為發現缺點好多啊!那一點點改吧!改缺點不能心急。然後不要沒改過來就拚命又開始打擊自己,就跑題了!你改缺點就改缺點,打擊自己是另一回事情。 [06′12″]</p>
<p>   所以在這點上,就希望大家能夠相互地鼓勵,發現看到法鏡外照這個習慣之後,就趕快照自己一下嘛!就每一次法鏡外照的習慣,都拿回來照自己一下。這樣的話,好像我們犯一次過去的習慣,欸!又產生一個、又長養了一下現在的美好的習慣,就是法鏡內照。堅持用功下去一定會學會的,怎麼可能學不會!師父說只要我們願意學,他會永遠帶著我們,直到成佛都帶著我們,所以也不用特別擔心在這條路上自己會很孤單。 [06′45″]</p>
<p>   這條法義希望能給大家帶來很多的自我的警醒、很多的振奮,就是:欸!我又看到了,然後我可以改!不要對著那個舊習慣只是嘆氣而已。要看到我們的內心是有行動力的,我們的語言也是會有修改的力量,為什麼?因為我們聽到了真理的召喚,我們看見了這樣做對自己、對他人都是好的。 [07′13″]</p>
<p>   那麼一時學得沒有那麼順利,慢慢學呀!很多東西都是慢慢學的。像我們上幼兒園,從一開始要學排排坐都不會,繫鞋帶也不會,可能吃個飯、拿個筷子都要練很久,但是父母和師長都是這樣教導我們的。所以我們對我們的心要有一點點的耐心,看著它一點一點地成長,然後也去體會內心成長的喜悅。當我們看到別人做得好的時候,我們就會有一分隨喜的喜悅;當觀功念恩的時候,我們真的就會從另一個角度看到這個世界的美好。 [07′48″]</p>
<p>   所以請大家看到這個照妖鏡的效應之後,要體會到:我發現了我生命有這種現象,我終於警覺到了,那開始改就可以了! [08′04″]
<p>   上面我們講到造論的宗旨。為什麼要造本論呢?他的目的,他希望什麼呢?那麼我們已經簡單地說明了一下,今天繼續下去。說現在啊,這個現在不是單單我們目前,就是宗喀巴大師時代,離開我們現在已經有五百多年、快六百年了,就是那個時候的狀態,究實說起來,這佛法實際上的傳承的情況,要比我們好現在太多、太多,可是那時候的局面如何呢?說已經是這樣——講修行的人不要多聽聞,不要多懂道理,而道理本身是告訴我們為什麼要修行,如何去修行。你必須了解了為什麼要修行,這個力量會推動你去修行;然後推動你去修行,更進一步告訴你如何修行;以及修行過程當中,對、錯、結果的驗證等等,這個都是要事先理論上了解了,你才能夠去做。現在你都沒有這個條件,你請問怎麼修得好?結果呢就產生了講修的人雖然想修,卻不一定得到正確的結果,通常我們說盲修瞎鍊,弄了半天哪浪費了一生時間,實際上這種惡習養成功,就多生多劫,真可惜! [02′21″]</p>
<p>   好!這一段師父說在宗喀巴大師的時代,離現在已經五百多年了,快六百年,那個時候已經有了想要修行卻不重視聞思這種狀態了。師父又強調了一下說:為什麼修行的人卻不要多聞呢?應該要多聞的,因為這個道理本身就是告訴我們為什麼要修行,這個道理應該就是教理。 [02′52″]</p>
<p>   「如何修行」、「為什麼要修行」,這個力量會推動我們去修行,而且進一步會告訴我們在修行的過程中「對、錯」還有「結果」。注意!「結果」這裡邊出現了什麼?「驗證」,都是要事先教理上了解的,然後才能夠去做。這個「<p> 對、錯、結果的驗證<p> 」等等,其實這件事還是滿重要的。 [03′19″]</p>
<p>   就像我們聽聞的時候,很多人聽了之後,會發現聽完的結果是不一樣的。最簡單的例子:你交代一件事情,交代完了之後,那個人馬上就出去做了,做完了回來之後,你發現「欸!好像我不是這樣跟你說的。」他說:「我就是按照你說的這樣去做的。」如果你把你的想法告訴給十個人,讓十個人分頭去做,可能十個人做出的樣子都是不一樣的。所以就提出了什麼?一定要去驗證,我聽到的和你講的是不是一樣的?而且結果出來也會說:「欸,這是不是你要的結果?」比如說要一個橘色,我正好眼睛看不清楚,我就拿了一個紅色給你,我認為這就是橘色,但是不知道自己眼睛是有毛病的,那就是我認為的橘色。所以這裡面有太多的個人的習氣,會發生聽聞的過失、思惟的過失,會發生對教典的扭曲,這部分是需要善知識來簡別的,結果也是需要的。 [04′17″]</p>
<p>   有的時候自己覺得很好,但是可能善知識就會說這個東西是要捨棄的;有的時候是感覺到很歡樂的一個覺受,善知識不讓你耽著;有的時候可能是一個很苦的差事,但是自己的善知識會讓自己去扛起來。所以不是以自己的感覺為主的,而是應作、不應作,對、錯,這些是有一個驗證的標準的。最大的標準就是惡事千萬別做,善事多多做,甚至很小、很小的惡都不要做,很小、很小的善也都不要看不起它,要去做。 [04′54″]</p>
<p>   還有一個最明顯的,師父又提出,師父說了這四個字,前面說是照妖鏡,在這裡面說是「盲修瞎鍊」。盲修瞎鍊的盲字,是對什麼盲?很顯然是對修行的路看不見。那麼修行的路徑是誰指示的呢?佛陀,佛陀明了修行的路,為我們宣說怎麼修行;祖師、菩薩解釋佛陀的教誡,讓我們更明了修行的次第、結果的驗證等等,所以一定要學習教理,學習了之後要懂得教理,依照教理指示的去修行,而最好的為我們詮釋教理的就是善知識的教誡。所以教理和善知識猶如眼目,在修行的時候不能不重視教理和善知識,更不用說捨棄教理和善知識了!所以不盲修瞎鍊最重要的點,就是親近善知識、如理聽聞。 [06′13″]</p>
<p>   盲修瞎鍊的過患到底有多大?弄了半天浪費了一生時間。師父在這裡又說了一句:「<p> 實際上這種惡習養成功,就多生多劫!<p> 」 [06′31″]</p>
<p>   看看!在此處師父又把我們的生命拉長遠了看。我們常常局限在此生,很多時候來生是不會想到的,但是師父常常在對我們講法的時候會提到「多生多劫」,他會在一個無限寬廣的生命的旅程中,去看我們此生的這個習氣對未來的影響力——就是業力的影響力。就好像我們騎腳踏車一樣,你用力地踩、用力地踩腳踏車,踩完了之後當你不踩的時候,這個勢頭還會向前去、向前去,它叫慣性,它會向前去的。 [07′23″]</p>
<p>   所以一旦養成盲修瞎鍊的習慣,他就是很多生都是這個樣子,很難改。所以這裡邊又把我們不去想後面、後世的事情的這個眼界,在此處又拉遠了一下,一定要考慮我現在的這個習慣對很多生、很多生以後的影響力。所以這樣看起來,這個習慣就不是一件小事了,它影響的不僅僅是此生,而是那麼長遠的生命都會被這樣的惡習影響。 [08′06″]
<p>   師父說:「<p> 真可惜!<p> 」我問大家一句:為什麼用了「可惜」?沒有說:「這麼不聽話」?像有些父母教育小孩就說:「你不聽話,以後怎樣怎樣活該,我不管你。」然後師父說:「真可惜!」可惜什麼呀?這個盲修瞎鍊的用不用功?用功啊!不是輕易地用功,是非常用功的,可能是沒白天沒黑日的,這樣非常努力地修行。結果呢?沒修出來他要的東西,修到岔路上去了。這麼用心的人難道不可惜嗎?他不是不想修行啊!他已經發起了想修行的心,可是因為不懂教理、沒有重視聞思,然後就開始用功了,反而浪費了大把的時光,確實是可惜呀! [00′58″]</p>
<p>   像我們都知道苦諦就是集諦所感得的果,如果我們不聞思的話,我們是連「集諦」這個名字也不知道,「苦諦」名字也不知道。那麼這個苦諦到底包含了什麼呢?包含了八苦、六苦、三苦,就是我們在生老病死中要面臨的這些痛苦。那麼這些痛苦的原因到底是什麼?就是集諦,是苦諦的因,集諦包括了業、惑。那麼這些苦果和苦因到底可不可以消滅呢?透過修道,可以滅除苦諦和集諦,所以要修道諦。徹底滅除了苦、集的這個果位,就是獲得了滅諦的聖道。連「苦、集、滅、道」這樣的道理,我們都是要依據教理來反覆地聽聞的。在這個四諦中,有染汙的因果和清淨的因果兩種。苦諦和集諦就是染汙的因果,是什麼?應捨的、應斷除的、應對治的,因為它是痛楚的、痛苦的;滅諦和道諦是屬於清淨的因果,道諦是獲得滅諦的一個什麼呀?方便,所以滅諦是道諦所獲得的果位,是應取的。 [02′16″]</p>
<p>   所以這個四諦基本就涵攝了應取、應捨兩方面。我們如果不去聽聞教典的話,有在聽嗎?注意喔,注意聽!不要走神!我們現在所受到的苦,在工作中、在家庭、在健康上,乃至環境造成的壓力,在各種苦的當下,我們會去想:我現在所感得的苦它是有苦因的,苦因是什麼?我找到那個苦因,把它滅掉了,苦果是可以滅除的,能現出這樣的想法嗎?還是苦的感受生起來之後,一下子就栽在那個苦惱裡邊,然後就很難出來?甚至有的人會認為他的苦是很難淨除的,幾乎是不可能淨除的,然後就開始沉淪下去了,因為他沒有能力解決他生命的痛苦。可是這樣的四諦的教理一旦多聽了之後,我們就會清晰地在心裡形成一個印象,當有苦生的時候,我馬上會想因是什麼?因為苦不是無因生的。苦因是什麼?滅除苦因的方法是什麼?因為你把苦因滅了,苦果就滅了。那麼滅除苦因的方法,那個方法到底是什麼?能不能滅掉它?如果能滅掉它的話,我就找到那個方法,就沿著那個方法去操作,苦因消失,苦果就消失了。 [03′37″]</p>
<p>   你常常地這樣想的時候,你就會對當下的苦生起一種沒有那麼投入的狀態,或者有點蔑視它的狀態。因為這個苦因和苦果就是我要滅除的,它是要被棄捨的、要被對治的,而不是我一頭栽進去被它欺負的,它永遠不會消失、它是常法,不是這樣的!它是可以被對治、可以被消滅的。所以師父才說:「為什麼要修行?」因為苦啊!因為苦因、苦果。那這個力量為什麼會推動我們修?因為可以滅掉它,對不對?所以說推動我們修行。然後進一步教導我們如何去修行,就修道。沿著這個,一直研究這個是怎麼滅掉的?次第是什麼?所以這樣聽聞多了之後,在我們的心上自然會種下一種聞思的習氣,然後我們會沿著教理去思考問題。 [04′31″]</p>
<p>   注意!沿著教理這個明鏡去看內心的問題,而不是成為感受的奴隸,永遠都被感受所奴役——感受是什麼樣,我們就認為世界是什麼樣。實際上,理性的抉擇會引導感受,正理會引導感受,沿著正理的思考出現的如理如法的感受才是對的。那個叫什麼?「覺受」,不是感受。我們修行出現的是感受還是覺受——正確的覺受,這個結果的驗證還是要靠教理的。所以初中後都是要靠教理,是不可能離開教理的!一旦離開教理,墮入自己感受的天花亂墜的那種修行,那可能就是不知所宗了,好像沉在海裡不知道去哪裡找自己一樣。所以我們修行是一步都離不開教理的指引的! [05′24″]</p>
<p>   看看在這麼多年前,師父苦口婆心地講《廣論》啊!到現在我們學起來,針對我們的習氣毛病,還是那麼直指人心地針對到了,對不對?你會覺得師父講的法沒有針對到自己嗎?想想自己,有沒有在苦受現起的時候想到教理怎麼調伏?是可以依靠教理的,那些教理拿來實踐是可以消除苦因和苦果的。所以,怎麼可能想要修行的時候不重視聞思呢?我們要特別小心自己不要不知不覺地成了「今勤瑜伽多寡聞」這種類型的修行者,師父會慨嘆啊!這太可惜了!他看著我們啊,心疼呀!所以才為我們宣講道次第。 [06′33″]
<p>   我們接著聽下一段。<p>   那麼另外一種呢,說,啊!原來修行哪它必須要從聽聞佛法開始,所以他,是的,就依照著次第做聽聞。本來聽聞了以後,應該進一步把所了解的,緊跟著去如何驗證,這個才是真正聽聞的目的。不幸又犯了錯誤,說聽聞的人哪,他又不好好地去修行,所以廣聞的人又不能認真善巧了解這個道理,這樣。結果這麼一來的話呢,廣聞的人就變成功空口說白話,修行的人就變成功盲修瞎鍊,這個非常可惜的事情! [01′04″]</p>
<p>   看這一段喔!師父說:原來修行它必須要從哪裡開始?聽聞佛法開始。注意!「<p> 從聽聞佛法開始<p> 」前面有「<p> 必須<p> 」兩個字。可以再想一下,修行必須從哪裡開始呢?要從聽聞佛法開始。聽聞佛法一定是必須的嗎?是必須的!這樣就夠了嗎?還有什麼?要依著次第做聽聞,還要知道「道次第」。所以這是在說聽聞,對吧?在說一個修行人他要修行的話,那一定要從聽聞佛法開始,而且「必須」要從聽聞佛法開始;不僅僅是必須要從聽聞佛法開始,還要依照次第聽聞。聽聞之後,就應該進一步把所了解的緊跟著去驗證,為什麼呢?因為這是聽聞佛法的目的。 [02′15″]</p>
<p>   那麼什麼叫「驗證」呢?何為驗證?注意!提起精神來,仔細考慮一下:什麼叫驗證?是不是把所聽來的教理在內心中去實踐,在內心中去生起如聽聞那樣所說的一個量,或者進行那樣的取捨修,叫驗證?然後師父說:「<p> 這個才是真正聽聞的目的。<p> 」所以我們聽聞佛法是為了能夠用自己的身心實踐佛法、驗證佛法在我們身心上的饒益。正常狀態是這樣的。 [03′03″]</p>
<p>   但是師父說:「<p> 不幸又犯了錯誤!<p> 」「不幸」這兩個字,還是可以感受到師父對我們深深的悲憫吧!又犯了錯誤了。犯了什麼錯誤呢?就是聽聞的人啊,不好好地去修行,廣聞的人又不能認真善巧地了解這個道理。所以雖然聽了很廣,師父說就變成空口說白話了。 [03′34″]</p>
<p>   這個在上節課已經有一個對自我的觀察。師父在上節課說這是一種毛病,聽了之後沒有拿它來實修,就只是停在那裡。還有一種毛病是什麼呢?就是自己不修,還專門管別人閒事。這個時候,所聽到的有沒有用呢?有沒有用?不是用了嗎?不是用來管閒事了嗎?對不對?用了,是怎麼用的呀?師父說這樣用容不容易?是很容易的。因為眾生無始劫來的常態到底是什麼呢?師父說平常我們任何一個人,因為無始來的習氣,無時無刻在內心中都沒有去掉它,所以我們非常非常地習慣看別人、管別人。 [04′24″]</p>
<p>   這裡邊的管別人,我們極力地想把它變成好像是為了利益他人而管的,但是大多數的是看別人不順眼吧!內心裡有煩惱,所以要制伏他一下,或者說使他不要在旁邊礙眼,心裡很不舒服。到底有幾許是出自於對他人的悲憫心,或者真摯的一種饒益他人的心而去管的呢?這個自己可以觀察。 [04′49″]</p>
<p>   所以師父說我們順了無始劫來的習氣,就是看別人、不看自己。那麼為什麼無始劫來我們的習氣不是反的呢?我們為什麼不是天天看自己、不看別人,而是看別人、不看自己呢?為什麼我們有這樣的習氣呢?大家會提這樣奇怪的問題嗎?你們的答案是什麼? [05′12″]</p>
<p>   當我心裡想這個答案的時候,師父說因為看別人很容易,看自己很困難。就好像非常非常熟悉看別人這樣一個習慣,聽了很多法之後,這個習慣還是沒有改。聽了很多,實際上是要看自己,而且要看自己越來越清楚、越來越容易、越來越快速,是要這樣的。應該把「看別人容易」變成什麼?看自己容易。可是我們聽來的道理沒有用來看自己越來越清晰,而是繼續加深「看別人容易」這樣的業,沒有扭轉觀察的方向。 [05′54″]</p>
<p>   還記得上節課師父說:那麼世間的人,他那個標準本來就是世間的標準,大家都馬馬虎虎的。可是一旦學了佛法之後,那個標準提高了,結果我們就會用一個非常高的標準去看待所有的人。這樣一看的時候,接著師父說了三個字,什麼?還記得嗎?「<p> 那害了!<p> 」害了!「害」人的害、「害」己的害。 [06′22″]</p>
<p>   剛開始大家聽到師父說這幾個字的時候,不知道你們會不會被嚇一跳?說像照妖鏡一樣。大家可以想一想:我們聽得好好的,去照別人的時候,為什麼居然像個照妖鏡一樣呢?這照妖鏡照到什麼程度?說:「<p> 這一看哪!世間所有的人都是妖魔鬼怪,沒有一個像樣的。<p> 」如果是這樣的話,這樣看出去的世界還能看嗎?就是幾乎全否了,幾乎沒有一個像樣的人哪!然後只有誰沒看到?師父就非常非常一針見血地告訴我們說:我們自己沒有看到!然後師父接著說:這是一個非常嚴重的事情!「<p> 就是這樣,這個是非常嚴重的事情!<p> 」為什麼這是一個非常嚴重的事情?前面說:「害了」,是個非常嚴重的自害行為嗎?自己沒有利益到自己,也沒有利益到他人,所以這是個大事情。聽完了佛法之後沒有拿來修行自己,然後拿了這個標準到處去衡量別人,發現別人不夠這個標準之後就生猛烈的煩惱,甚至有時候會看不起別人,生起了很強的慢心吧! [07′41″]</p>
<p>   其實這一段我們可以終身受用,乃至生生世世受用無窮的。這確實是我們無始劫來的一個惡習呀!就是我們聽了之後,一旦沒有拿來修行的時候,它就會被反過來用。用去幹什麼了呢?就是去評價別人、去評判別人,然後會站在一個很高的標準。當自己站在一個很高的標準上去評判別人的時候,那種感覺彷彿自己對法已經了解了嗎?當站在那個標準上看的時候,好像自己已經跟那個標準合一了嗎?真的合一了嗎?如果自己也不是那個標準,只是拿那個標準去評判別人的話,實際上連最初的佛法的修鍊都沒有學會呀! [08′29″]</p>
<p>   最初的就是什麼呀?就是要拿這面鏡子看自己,拿佛陀為我們建立的標準來衡量自己、來看自己——看我自己有多少過失,看了之後要去改。看自己是越看越多、越看越多,是這樣的一個方式,正好是跟無始劫來很容易的那個習慣是反的。 [09′00″]
<p>   師父說這個照妖鏡啊,這樣照下去,大家可以考慮一下結論會怎樣呢?因為用這樣一個標準去看所有的人,就會發現世界上所有的人都是不如法的,會怎樣呢?如果沒有調伏心續的能力就會生氣嘛!可能產生很多負面的情緒、負面的心態,可能還覺得自己身處在一個非常可怕的地方,因為沒有看到別人的善,沒有看到別人的功德。而這個時候會不會覺得自己非常了不起,好像是洞悉了很多事情根本的那個人,好像自己已經了達了,甚至已經悟到了很多東西、已經生起了證悟力的樣子,然後隨便地批評別人、評判別人? [00′50″]</p>
<p>   可是因為看別人越來越容易、評判別人越來越過分,這樣的話,對自己的行為也越發地沒有拘束、沒有限制。因為這個照妖鏡照完了之後,想一想,如果看到妖怪我們會不評判嗎?當你發現了一個妖怪,你一定會說他是妖怪。一開始會放在心裡想嗎?想多久會講出來呢? [01′18″]</p>
<p>   這麼美的、這麼精彩的佛法沒有拿來修行,而變成是到處觀察過失、到處去說人家不好,彷彿自己已經成了一個洞悉萬物的智者,好像了達了所有的事情。可是師父說:唯有自己呀,卻不知道。而恰恰佛法就是要了解自己的,所以可以想見已經與佛法的修行大相逕庭了,已經完全完全地走在岔路上了。 [01′52″]</p>
<p>   所以我們在廣論班裡常常有個程序,叫什麼?法鏡內照。聽完這一段《廣論》、學完這段經典了,請大家不要說:「對、對、對!啊,對了,張三就是這樣!喔,李四就是這樣!」不是的,要拿聽聞到的法義來衡量自心,看看我們是怎樣做的。 [02′14″]</p>
<p>   比如說持戒這個問題,我們已經懂得了戒律的標準之後,戒律最重要的原則就是一定要拿來律己,不要拿來繩人,說他不好好持戒,眼睛這樣看。不是這樣的!我們要看自己,我們有沒有在持戒?《廣論》學了這麼多年之後,我有沒有在因果上越來越細心呢?越來越小心呢?就是膽子沒有那麼大了。在因果上細心,心細如髮,那是求之不得的。這可以觀察一下自己,比如說對殊勝境——對善知識、佛菩薩,還有父母啊,恩德田、有德的人,我有沒有注意到不要去造口業?還有我的內心,要現起恭敬的現行。更要去觀察的就是有沒有去誹謗別人啊?或者心裡非理作意這些。因為這都是自己吃虧呀!而且虧得很大! [03′17″]</p>
<p>   要怎麼樣把這個照妖鏡廢掉,拿這個鏡子來攬鏡自顧呢?這是一個非常重要的、自己要修鍊的獨門武功。這個是不能說我修的給你、你修的給他,必須自己練。每一拳、每一拳要自己練,每一腳、每一腳都要自己練,像練武功一樣。「冬練三九,夏練三伏」,要練功夫的!練什麼呀?拿這個法的標準來衡量自己,來看自己。因為無始劫來就喜歡照別人,我們一直看別人,別人也沒有因為我們這樣看別人過失而得到解脫呀!而往往卻產生種種的是是非非,然後造惡業、糾纏在一起。所以拿這個法來照自己的話,就不會發生這樣的事情。拿戒律來律己,每個人都律己,大家就相安無事了,也不會湊在一起說東家長、李家短,一直在說別人。自己有多少事情都沒有看、多少毛病沒有修改,哪有時間天天去講是是非非、講別人的過失啊?對不對? [04′27″]</p>
<p>   師父這一小段,痛切地指正了我們的毛病、無始劫來的毛病。如果能把這句話掛在家裡的橫樑上、貼在腦門上,最重要的是放在心上,每天一步一個腳印地這樣行持下去,把一直拿照妖鏡的這個毛病徹底地改了,那真是多生多劫修來的福報和慧力呀!終於我們要開始看自心了,終於開始律己了!這樣,師父辛辛苦苦地為我們講了這麼多的法,尤其是講了這一段,也會放心多了! [05′05″]
<p>   在談到「廣聞不善於修要」的問題的時候,我還想請大家聽一聽師父在新版的廣論帶講的兩段話,是關於宗派的。因為聽了很多之後,如果我們不善於拿所聽來的法修心的話,其實也會出現像師父所講的這一類的過失,所以請大家聽一下。 [00′28″]</p>
<p>   這個宗派的形成是這個樣的,應不同根性的眾生,所以從這個地方一步一步契入;契入了以後漸次慢慢地加深、加廣,到最後達到究竟圓滿。所以這一個本來就是引導不同眾生一個非常善巧的法門,這樣。自然而然它是會分出各式各樣的這個教法,適應不同、各式各樣的根性。那麼,那個不同的弟子們,他雖然沒有像世尊一樣,能夠達到這個究竟圓滿,可是他的確有很深厚的善根,另外一點來說,他的罪障也減低到最低限度,所以他聽見了這個法以後,他會全心全意依照這個法去修學。也就是說,自己來淨化自己的罪障,然後集聚自己的資糧,這樣,從淨罪集資這個兩點來說,不斷地提升。 [01′57″]</p>
<p>   這一小段,師父是在新版的廣論帶裡邊講了一個宗派形成。前一段是說:其實所有的法都是佛陀講的,後來為了應眾生的根機,出現了各種各樣的法門,由於根性的不同所以會分門別類,有人喜歡這種、有人喜歡那種,趣入的點也是不一樣的。然後師父就講了剛才講的那一段。師父有講一段說:那個時候也是一個圓滿的狀態,都有一個深厚的善根,所以聽了佛陀講的法之後,雖然沒有像世尊一樣能夠達到究竟圓滿,可是他的確有很深厚的善根,他的罪障也減低到最低的限度、最低的限度。所以他聽見了法之後,注意!他會全心全意依照這個法去修學,全心全意依照法去修學。 [02′59″]</p>
<p>   接著師父就解釋了什麼叫「<p> 全心全意依照這個法去修學<p> 」,說:「<p> 自己來淨化自己的罪障<p> 」,注意!再聽一下!「自己來淨化自己的罪障」!然後,師父接著說:「<p> 然後集聚自己的資糧,這樣,從淨罪集資這個兩點來說,不斷地提升。<p> 」這一段攝要就是,廣聞了之後應該用淨罪、集資兩方面讓自己進步,要全心全意地照著這個法去修學。尤其是那句話:「要自己淨化自己的罪障,自己集聚自己的資糧。」這一定要是在自心上老老實實地入手,開始修學。所以這一小段也解釋了正常的一個弟子的狀態應該是這樣的,各宗各派都是要這樣子才比較合理的。 [03′57″]</p>
<p>   然後再聽下一段。<p>   那麼漸漸、漸漸呢,以後有了轉變了。這兩個不同的這個,所以這個,不是這兩個,很多不同的宗派,適應不同的根性,世尊講的教法當然有差別,所以這個宗派是這樣的一個狀態。所以那個地方來看,那是宗派有它的非常殊勝的好處。可是漸漸呢,那些眾生的條件越來越差,他學了這個法以後,不是拿來自己身心上面淨化自己、提升自己。然後呢,最主要的原因,還始終離不開憍、慢兩個字。所以拿這個對比說:「哎,我這個是最好的!然後你這個不一樣,那我這個最好的,當然你這個就沒我的好囉!」所以彼此間,就是不是拿來自己修行淨化,跟人家互相諍論。那越到後來,產生的這種諍論的情況越糟糕,所以到後來這個宗派就變成功彼此間的,我們就說現在什麼「黨同伐異」的這種。其實這個世間我們現在處處地方都是看得見這種狀態,這樣。那麼所以流到末法的時候,這種現象是特別地強烈。我大概先簡單地說一下。 [05′37″]</p>
<p>   大家有沒有聽這一小段?可能是有一點陌生,你們回去可以自己去看一看。有書吧?是不是都有書?這是在新版《廣論》的第一卷。在這一小段師父又再次強調了:「<p> 宗派有它的非常殊勝的好處<p> 」,因為它適應不同的根性,但是注意!「<p> 漸漸呢,那些眾生的條件越來越差,他學了這個法以後,不是拿來自己身心上面淨化自己、提升自己。<p> 」注意喔!這個學法的目標和學習之後的行為都產生了變化,就是不是在自己身心上面淨化自己、提升自己;反過來,就是學了法之後,應該在身心上面自己淨化自己、自己提升自己。然後師父分析說:「<p> 最主要的原因,還始終離不開憍、慢兩個字。<p> 」這個是從宗派的角度去討論的。 [06′48″]</p>
<p>   他學了自己的宗派之後,就拿這個出去說,拿這個跟別人對比:「<p> 哎,我這個是最好的!然後你這個不一樣,那我這個最好的,當然你這個就沒我的好。<p> 」就是拿了自己所學的法之後出去比高低,甚至有的還有論自己的善知識誰更有名氣,又怎樣、怎樣,就是來比這個了,跟修行差得十萬八千里了。所以彼此間不是拿來修行淨化,而是跟人家互相諍論,到最後就會「<p> 貪著自宗、瞋他法派<p> 」,這個弟子就成了這個樣子。 [07′26″]
<p>   大家可以由這一段想想我們自己,我們自己學了《廣論》之後,會不會覺得自己很殊勝,那些沒學的好像都不殊勝,甚至學習其他法門的也都不殊勝,是不是心裡有這樣的想法?如果是這樣的話,就是此處師父所說的這種過失,也是廣聞不善於修要的這種過失。你總覺得沒學《廣論》的人是不如你的,但是你忽略了一個問題,這個問題就是:過去生別人的努力是如何的,我們應該從很多生上去觀察,但是我們沒有能力去觀察過去生別人多有善根,所以不能這樣簡單地就從這個角度去看。另外現在都有團體嘛,其實也會產生這樣的問題——我們的團體比你的團體殊勝;總之看別人就看過失,看自己就看功德。如果抱持這樣的觀點出去交朋友的話,根本是交不到朋友的,因為師父說:始終離不開憍、慢二字。 [01′04″]</p>
<p>   那麼對於在佛教各宗各派學習的人,我們學《廣論》的同學應該普同地恭敬,抱持著向別人學習的心,因為這才是聽了法之後應該出現的自己身心上的行為。就像秋天的穀穗,因為它很飽滿,結滿了穀粒,所以它是深深地彎著腰的。大家不知道有沒有到鄉下去看那個田裡面?很飽滿的穀穗都是深深地彎著腰垂著,都快挨到地面了。可是沒長多少穀粒的,它的頭是高高地仰向虛空的,最直的就是沒有結果實的那些,或者結幾粒的那些。所以學得很多,正應該深深地彎下自己的腰去向很多很多人學習,用最謙卑的心態學習更多、集聚更多的資糧,這才是學了很多的樣子。 [01′55″]</p>
<p>   說:「沒錯呀!我們學《廣論》,《廣論》很殊勝啊!」《廣論》很殊勝,自己就殊勝了嗎?然後說:「現在有學制,學制很殊勝啊!」學制很殊勝,自己就殊勝了嗎?自己就比別人強了嗎?這些都是要拿來看自己,不然我們就會陷入師父說的:「<p> 哎,我這個是最好的!然後你這個不一樣。<p> 」反正不管怎樣就是我比你好,師父說這都是驕慢的惡習呀!不應該拿所學的法變成彼此間這種比較,甚至貪自、瞋他造這樣的惡業,對別人來說也是很不舒服。而且一旦看到我們這樣出去講話的時候,別人就會想:「哎呀!這個學《廣論》的人是這樣子的喔?眼睛都長到天上去了,眼裡沒人的啊!」實際上師父教我們的不是這樣的,你看看師父的行誼呀!師父對比他年輕很多很多的法師都是跪下去就拜的,到什麼地方都非常注意不要打擾別人,都非常小心地與人方便啊! [03′04″]</p>
<p>   這樣的事例其實是滿多的。有一次仁波切帶我們去一個寺院,那寺院的沙彌們正在背經,那個時候月亮剛剛升起來,沙彌、法師們圍了一大圈,坐著在背經。仁波切本來是走在最前面,我們是跟在後面,忽然發現仁波切加快了腳步向前走去,然後又突然停下來,莊嚴地整理袈裟,居然仁波切遠遠地就對那些正在背經的小沙彌開始大禮拜!在銀色的月光下,仁波切雙手舉過頭頂、非常恭敬地禮拜的身影,深深地刻在我的心裡。 [03′49″]</p>
<p>   我也跟大家說過小阿喀。小阿喀非常非常尊敬他自己的上師——大阿喀。有一次在給我們講現觀的時候,那時候大阿喀身體有點不好,大阿喀的侍者就來請小阿喀說:「上師叫你呢!」小阿喀馬上就從座位上起來,走到門口的時候,發現門外有很多僧眾的鞋子,阿喀在這個時候他都沒有從那個鞋子上邁過去,而是彎腰喔,七十多歲的上師,彎腰用雙手把那些鞋子輕輕地撥開、恭敬地撥開,撥出一條路走過去了。在那麼緊急的狀態下,他連僧眾的鞋子都不會邁過去。 [04′40″]</p>
<p>   所以看看大德的修行啊!「廣聞善於修要」的人應該是一個什麼樣的行誼呢?看看我們這些善知識的示現,自己就應該知道自己該怎麼做。所以我們自己遇到的法殊勝,那不能馬上自己就變殊勝;學制殊勝,也不是自己驕慢的因,而恰恰是自己要虛心學習的一個很好的緣起。大家覺得呢? [05′15″]
<p>   在「廣聞不善於修要」這一點上,也有一位善知識他說:「<p> 了知了正法不修持的話,當生恐怖餓鬼王。<p> 」是會墮落的!如果廣聞卻不修行正法的話會墮落!另外宗大師在《無上三寶譚》裡也有這樣的一個偈頌,說:「<p> 嗚呼成辦眾二利,非不依諸清淨典,依已但若樂文詞,空度時日惑於斯,彼如溺水而渴死,多聞還卻匱正法,過在未現教為訣,悉將所學現為訣。<p> 」說成辦有情的自他二利,不是不依靠清淨教典所能做到的。第一句話就是解釋了想要成辦有情的自他二利,如果不依靠清淨的教典,不聽聞、不思惟,是完全做不到的!那麼依止清淨的教典,如果只愛著於文詞,以此空度時日,而且迷惑於此的話,那就像有人溺水被水沖走,最終他口渴而死。大家想想這多顛倒!溺水了,卻口渴而死了!廣學多聞卻匱乏正法,到底是什麼原因啊?就是沒有將教典現為教授的過失啊!要珍愛地將所學的內容現為教授啊!這是宗大師的教言。 [01′42″]</p>
<p>   克主傑尊者在《起信津梁》裡面有一段,說:「<p> 如是對於經論努力聞思的人,就頑固地一心耽著於聞思<p> 」,這裡面用了一個「<p> 頑固地<p> 」,「<p> 縱使擁有名望的飛幡,但當他要修行的時候,對於調伏自心的方法諸大經論是如何說的?行持次第又是如何?這些都說不出來,甚至不曾懷疑諸大經論當中有如是修持的扼要。<p> 」看看這個頑固到什麼程度!已經擁有名望的飛幡,但是想要修行的時候,對調伏自心的方法在經論上是怎麼講的、行持次第是怎麼樣,連說都說不出來。甚至都沒有懷疑經典當中有這樣的修持扼要,認為經典中沒有修持的扼要,就是頑固成這樣子。我們可以看一看自己! [02′38″]</p>
<p>   然後接著克主傑尊者又寫了這樣一段話,注意喔!「<p> 何時自己被老苦使者所追捕<p> 」,用了一個「<p> 追捕<p> 」,老苦的使者——老啊,所追捕,開始怖畏死主的懲罰的時候,這個努力聽聞了很多教典這個人會幹什麼呢?這句話是我加的。注意喔!「<p> 何時自己被老苦使者所追捕,開始怖畏死主的懲罰時,就會去到一個什麼都不學的愚夫——盡其一生隱於山林的人面前求救,對他所說的教授一點兒都不能違犯,對於過去所努力的一切聞思,當成是生大憂悔之處,安住於支那和尚的宗規——任何亦不作意的畜生修法。認為諸大經論在死時毫無用處,背負著極大的謗法的業障下度過了生命!<p> 」 [03′35″]</p>
<p>   這克主傑尊者講的,很像他的風格嘛!很犀利、很到位!說:你知道廣聞不善於修要的結論會怎樣啊?到老的時候被老苦追捕,到最後開始怖畏死主的懲罰的時候,那時候想:欸!我都沒有修行,那我趕快找個有修行的。那聞思教典的人他認為自己沒有修行、很多人都沒有修行,去找一個什麼都沒學過的、都在山林裡待一輩子的人去求救,然後他說什麼就是什麼。所以,對自己這一生所聽聞的這一切聞法生大憂悔!他後悔他聽了這麼多教典,他覺得沒有幫到他,成了一個什麼?「<p> 生大憂悔之處<p> 」。「<p> 安住於支那和尚的宗規<p> 」,就是什麼都不想,不作意、沒有善所緣的這樣一個奇怪修法。然後說得很犀利:任何也不作意的畜生修法。認為諸大經論在死的時候毫無用處,背負著極大的謗法的業障,這一生這樣度過,然後就這樣去來生了。大家可以想像會去哪裡! [04′40″]</p>
<p>   所以在這裡邊「廣聞不善於修要」,宗大師會認為沒有把所學的教典現為教授;然後接著說要珍愛所學的內容,要把這些內容現為教授來自己的身心上實踐啊!宗大師這樣告誡我們。然後克主傑尊者就會說:如果不珍愛所學的教典,最後你會發現你所學的教典沒有幫到你;那還是要找一個能夠抓到的修行方式,因為已經了知了死和來生這樣的很多問題呀,居然到最後去找了一個不怎麼聽聞的人修行。而且會執著地認為自己聽的全都是錯的,還謗法了!所以「廣聞不善於修要」的這個過失就極大了!正如開始說的:「了知正法不修持,當生恐怖餓鬼王。」就墮落了! [05′33″]</p>
<p>   面對佛菩薩、祖師們苦口婆心這樣地勸誡,我們學人多麼幸運能夠聽到這些忠告。每當自己不太對的時候就會聽到忠告,甚至天天聽聞,時時刻刻有警醒自己的這樣一個警鐘一直在響,一個燈一直在照亮。這樣的話,我們的每一步偏差都有佛菩薩的教言來調整。最重要的就是:能不能夠珍愛執持,作為自己修行的一個指導,真心地去實踐佛菩薩的這些教言?而不要把《廣論》上聽來的東西,認為只是口耳之學,或者只是出去給別人講的,沒有真實地拿這個正法來改變自己的生命。師父說這非常地嚴重——這就害了!師父說害了! [06′27″]
<p>   前一節課我們講了「今勤瑜伽多寡聞,廣聞不善於修要」,在這裡邊師父很強調修行一定要從聽聞開始。那麼修行一定要從聽聞開始嗎?在傳承祖師裡都是這樣的嗎?有沒有不一樣的示現呢?可能有些同學心裡也會現起這樣的一個想法,所以師父就給我們講了六祖大師的故事,是在新版的《廣論》第一卷的部分。 [00′43″]</p>
<p>   我這裡舉一個簡單的實際上的事例、比喻來說明。在這個整個的漢人的中國人的歷史上面,有很多了不起的大祖師,這個大祖師當中有一個最了不起的大祖師之一,是禪門的六祖惠能大師。他是南方人——嶺南,拿現在來說的話廣東一帶。他是初唐人,那個時候那個地方叫南蠻,就是沒開化的地方。他有一天在鄉下,聽見有人念《金剛經》,念《金剛經》就念到「應無所住而生其心」,他就恍然大悟,開悟了。我們說:「哦!這個六祖大師這個人真好了不起!」我們現在很多人念了《金剛經》,念了一輩子,一動都不動,像木頭一樣。我想在座大家很多人都念過《金剛經》嘛,我也念過很多遍,什麼都不懂;聽人家講過,還是不懂。他既沒有聽人家講,就這麼念一遍,開悟了,應該說,他自己就懂了吧!實際上是不是呢?不一定。這個故事的下面,我是只敘述這個很簡單的一部分。那因為他聽見了說:「啊,這麼好啊!」他就問這個人,這個人說:「啊!我是不懂,我隨便念。現在有一個祖師,他在黃梅,黃梅五祖,哦,這是一個了不起的大德!你去找他。」所以他就專門向北方,最後到這個黃梅禮五祖。 [02′47″]</p>
<p>   那麼這裡有一個公案,五祖要傳法啦!然後這個《壇經》上面你們自己看一下,我只是簡單說一下。說:「現在我要傳那個法了,看看你們這麼多弟子,哪一個最精采就傳給誰!」結果叫他們寫一個偈。他那個時候有一個上座,換句話說那個弟子當中最了不起的一個,大家認以為這個最了不起的上座,他寫了一個偈。他自己雖然是了解,可是他不敢拿上來,說萬一老師說不對,那不是不好意思嗎?這樣。所以他想了半天,又不敢拿上去,但是呢,大家都等著他,不拿出來又不行,所以他就叫人家寫在這個牆上面。所以他就寫在牆上:「身如菩提樹,心如明鏡台,時時勤拂拭,勿令染塵埃。」就這樣。大家一看,「啊,好了不起!」就這樣。那結果呢?這個實際上這個偈表示條件還不夠,不過他的那個老師就說:「那這樣去用功已經不錯啦!」那最後大家就拿這個東西去念。這個六祖大師聽見人家一念,那時問他:「你念的什麼啊?」說有這麼一回事情。六祖說:「這個、這個不行!這個不行!」六祖居然說這個不行,「那難道你也懂嗎?」「對,我也懂啊!」所以他也跑了去也寫一個。他就跑到那同樣的地方叫人家寫一個:「菩提本無樹,明鏡亦非台,本來無一物,何處染塵埃。」非常有名的公案哪!啊!大家覺得,一看那個偈曉得那個六祖何等地了不起! [04′44″]</p>
<p>   從這個故事裡面我們會聽見,以為六祖大師聽了《金剛經》就懂了。實際上你說他不懂嗎?不對。是,說他懂嗎?下面還有個故事,我講下去你們就知道。結果大家鬨起來了,這個,五祖在裡邊聽見有人外面那兒鬨,一看!這樣,一個偈。五祖是一個腦筋,那這種人,祖師當然曉得,曉得這個是六祖寫的。這個偈是通常說明心見性了,可是他現在如果傳給他的話,這個下面就要起鬨啊!那譬如說我們現在這地方,那個上座都沒有份,我隨便挑一個張某某給了他了,那你們大家會不會氣他啊?這個很可能會這樣的現象啊!這個故事就有很類似的這種狀態。他平常嘛處處地方就不行,來了是最晚來的一個,而且是南蠻一個蠻子,話都不通的,這麼一個人,這樣。所以他也是說:「抹掉了!」說:「也一樣不行、一樣不行!」那既然是老師說不行,也就算了!實際上他是有名堂的,可是他那個師徒之間都不動聲色,老師也沒有說什麼,那個徒弟乖乖的。那六祖去了以後幹什麼?去舂碓米,換句話說,拿現在來說,做苦工。我們現在這裡不會做這件事情啊,那給你打掃廁所、跑去到院子裡面一天到晚忙這個,這樣。 [06′20″]</p>
<p>   那後來有一天,經過了好幾個月。他在那地方做了幾個月?做了八個月苦工,也從來沒有老師給他講什麼話,他也不會覺得:「什麼?把我跑得來,一丟,丟了八個月,理都不理我啊!」他也沒這樣。有一天,那黃梅五祖好像跑出去散步,隨便七轉八轉就跑到那個舂米的地方去,看見他正在舂米。他就問,說:「你那個米舂熟了沒有啊?」「舂熟了。」這個大家現在不太懂,我簡單說一下。那個米啊,不像現在用機器打的。以前有一種粗的磨子,它磨了以後,那個米——不是本來是稻,稻你們知道吧?稻不是外面有保護的那個嗎?那個裡邊有粗糠跟細糠。第一次磨了以後,那個粗糠磨掉。那種磨子我小的時候還曾經看見過,可是已經用不著了,那時已經有機器來了以後。他先把那個東西磨一下,那個粗糠磨掉了。粗糠磨掉了以後呢,然後一般的人家就有一個石臼,他就去在裡邊用一個東西來舂。那舂了以後,然後這個細糠慢慢地就米與米之間大家摩擦,那個細糠就脫掉。 [07′47″]</p>
<p>   那麼像這種人多的地方,那個舂的那個石臼有大有小的,像那種大的道場都是很大的,所以他六祖大師專門做這件事情。然後因為他身體比較瘦,要舂那個米的,要把那個,那是一個槓桿的原理,他要把它踩下去,一鬆,那個石頭就「蹬!」一下,使那個舂子就舂到那米裡邊,這樣。所以因為這個六祖大德身體很瘦小,那力量不夠,所以他身上面綁了一塊石頭,然後踩在那個舂子上面的話,石頭加重了,把那個抬起來,一放,掉下去。這樣一件事情。所以慢慢、慢慢地碾掉那米的糠,那細糠舂掉了,這樣子那個米就舂熟了。舂熟了以後篩一下,篩一下那個糠就篩掉了,那個米就留下來了,就這樣的一件事情。 [08′53″]</p>
<p>   所以那個黃梅五祖啊,就跑過去,到那個石臼旁邊拿了一個杖,敲敲那個石臼:「這個米熟了沒有啊?」他就問了這個六祖這樣的一句話。六祖怎麼回答啊?「已經熟了很久了,但是還欠一樣東西。」「欠什麼?」「要篩一下。」這個舂米本來就是這樣。那麼他們師徒兩個的對答,你們懂不懂啊?我們平常粗枝大葉去看,不懂的。那事實也就是如此嘛!譬如說,你們在那兒掃地,我就跑過去問:「掃好了沒有啊?」你們說:「掃好了,只要把它畚斗畚起來,丟出去就完了!」就是這樣。這個是一個現成的一個狀態,所以五祖就問。「那麼好。」問完了以後,也就像家常便飯不動聲色,那五祖就回過頭來,就走了。他拿了一個手杖,回過頭來的時候拿那個手杖,譬如說,本來我是面對著這個石臼來問話,那個五祖,等他回過頭來,他背對著;等到他背對的時候,拿那個手杖就在那個舂米的石臼上面敲了三下,「篤、篤、篤!」敲了三下,那個好像一個無意識的動作這樣,走掉了。 [10′19″]</p>
<p>   實際上這個裡邊都是玄機啊!他那個對答、背過來、敲三下,都是玄機。所以那天晚上半夜裡三更,那六祖就偷偷地跑到五祖的房裡去。五祖在那兒等著他,他就拿了《金剛經》來給他講道理,就這樣。然後講的時候,他用他的袈裟,那個袈裟把它遮起來,所以不讓人家知道。他到底說什麼?不知道。可是有幾句話,那個六祖說:「啊!何其自性本具萬法,何其自性......」如何如何,那個《壇經》上面都有說這個話。 [11′08″]</p>
<p>   我為什麼要特別講這句話呢?就是說,六祖大師在八、九個月以前,實際上應該算起來,從嶺南到這個五祖的道場要走好幾個月,假定說一年以前,已經聽見了,一聽《金剛經》「應無所住而生其心」,已經了解了。結果又跑到五祖這個道場住了一年,一直等到半夜裡邊,那五祖拿了《金剛經》給他講,他說:「啊,原來是這個樣!啊,原來是這個樣的!原來是這個樣的!」說了很多「原來這個樣」,那表示他本來懂不懂?原來並不懂。我們呢?個人由於個人的腦筋,這個靈敏程度的不一樣,多少會講一點。比如說我們現在來講,看了以後,或者講了以後,你說:「啊,懂了,懂了!」多少會懂一點,懂一點什麼?文字相。文字相上面也有深淺的不同,或者文字的內涵多少有一點體驗,可是它究竟的內容,這個地方就告訴我們,就像六祖大師這麼了不起的人,究竟的狀態當中,究竟的這個狀態,一直等到他老師講才體會得到。 [12′32″]</p>
<p>   六祖大師的故事聽完了。可能很多同學對於六祖大師的故事很小就知道了,我也是。那個時候應該所有的佛教青年都覺得六祖大師好像是偶像一樣,很崇拜六祖大師。像這個公案其實都已經看過很多次了,但是還是過一段時間就看一遍、過一段時間就看一遍。尤其是對於六祖大師寫的「菩提本無樹,明鏡亦非台,本來無一物,何處惹塵埃。」這個也會放在心上去想一想是什麼意思,但多半也想不清楚。實際上不學毘缽舍那,也很難想清楚。 [13′15″]</p>
<p>   這個故事為什麼我要在這個地方請大家再聽一下呢?因為師父在第二卷講的時候,師父的詮釋的要點主要是說:多精彩的人都得要有善知識引領,沒有善知識引領的話,實際上還是很難到達究竟的證悟的高度。這裡面師父就很強調啊!我這一次再讀六祖大師的故事的時候,我們可以看到這個弟子相。你看!他自己寫的那幾句,他一定知道是比當時的神秀大師寫得深的,但是他的老師就是五祖大師還是命令人把它擦掉了,對他的證悟經驗表示一樣的。這個時候,因為千里迢迢來尋五祖,想要了解「應無所住而生其心」,乃至《金剛經》所有的意義到底是什麼,所以六祖大師對善知識的作法沒有什麼想法,就乖乖的——師父用了一個「徒弟乖乖的」。沒有任何覺得我寫得這麼好,怎麼老師覺得跟他平等,一樣都擦掉了呢?應該至少評論幾句或者心裡有什麼想法,全都沒有!這個地方大家可以想一想。 [14′45″]</p>
<p>   接著呢,他還在那兒做苦工,從早到晚忙。這裡面最感動的是,說六祖大師比較瘦小,他居然在腰上綁了一個石頭。你看!像他做這個苦工是多麼地用心啊!一點點投機取巧的心思都沒有。大家都知道如果在腰上綁一個石頭的話,天天磨、天天磨,那不是磨一天、兩天哪,快到一年吧!八、九個月這樣的時間,所以一定是很辛苦的。看六祖大師的人品啊!就做舂米這樣一個事情,是非常非常認真地做。而且過了這麼長時間,五祖大師去看他,他倆的對話,師父特別還把這個對話用現代版的方式再給我們講一下。師父說:「掃好了沒啊?」說:「掃好了,只是用畚斗畚起來丟出去就完了。」就這樣一個簡單的對話。 [15′38″]</p>
<p>   在這裡邊要講一個什麼樣的道理?就是對於一個希求於法的弟子來說,善知識的每一句話、每一句話,他都會覺得是在點化自己,或者在警醒自己什麼內涵。所以對於一個準備好了的心來說,善知識的一舉一動他都非常地明白。像我們要學六祖大師,觀察一下自己,就算老師明明白白地講都聽不明白,對吧?還要講很多遍,然後要討論,還是聽不明白。如果說拿著一個手杖在那個石臼上敲三下,「咚、咚、咚!」不知道會想出什麼樣子來?不知道是會想成什麼花樣來?六祖大師他們師徒都沒有講話的,就知道:「喔!原來要給我傳法了,要給我講經了。」非常地低調。師父非常非常生動地給我們講了六祖大師的故事,我們要好好地努力,成就弟子相! [16′42″]</p>
<p>   我講了這個六祖大師的例子,再想一下:欸!不是所有的人都要從聽聞開始嗎?六祖大師也沒廣聞啊!他就是聽別人念的《金剛經》「應無所住而生其心」,就突然開悟了!然後就生起了去尋覓《金剛經》的要義強烈的道心。那也不是所有的人都一定要廣聞啊!我們會不會有這樣的疑問呢?如果有這樣的疑問的話,接下來師父在舊版《廣論》就解釋了。 [17′15″]
<p>   我們聽完六祖大師的故事,再看一看舊版的《廣論》,師父從「今勤瑜伽多寡聞,廣聞不善於修要」這個偈子,就講到了六祖大師。說確實是有這樣的一個祖師做了這樣的示現,那麼我們到底應該怎樣看待這件事呢?請大家就繼續聽。 [00′29″]</p>
<p>   那麼是的,有的時候我們看見有這種狀態,譬如像六祖大師,他自己本身可並沒有廣博的認識,他為什麼這樣好呢?這個我們要了解。他是宿生多生多劫已經積累了前面這個基本、基礎已經有了。對於世間來說,我們所看得見的,只是短短的幾十年乃至一百年,而整個佛法來說,那是從前面無限到後面無限。那麼修行這個階段來說,就是從最開始一點不認識,接觸佛法以後步步上升,到徹底究竟圓滿。這個裡邊一定是經過:怎麼樣觸發那個動機,然後親近善知識,如理地聽聞圓滿的教法,聽聞了以後呢,如理思惟,然後認真去修行,這是必然過程,而這個要經過多生多劫。 [01′49″]</p>
<p>   我們看這一小段,我提問題,大家想一想。師父說:我們看見這種狀態,像六祖大師,他自己本身沒有廣博的認識,那為什麼這樣好呢?大家還記得剛才師父是怎麼講的吧?師父說:「<p> 宿生多生多劫已經積累了前面這個基本、基礎已經有了。<p> 」接著師父講:「<p> 對於世間來說,我們所看得見的,只是短短的幾十年乃至一百年。<p> 」注意喔!師父從時間軸上讓我們拉開了一個非常廣闊的視野,一個是說:「宿生多生多劫累積了這個基本、基礎」,這是說六祖大師的;那麼反過來看到我們,用我們的肉眼看得見的,只是人世間短短的幾十年,乃至是一百年。 [02′49″]</p>
<p>   但是從佛法的角度來說,師父說:「<p> 是從前面無限到後面無限<p> 」。什麼叫從前面的無限到後面的無限?是不是揭示了一個「無始無終」這樣的時間概念?大家想一想,對於剛剛開始學佛的同學,這個概念應該是滿挑戰的吧!如果剛剛開始接受佛法,提到「無始無終」這樣的時間概念的話,好像就進入了一個渺茫的狀態,不知道該去追尋什麼。但是師父是把我們的生命放在無始無終這樣的時間軸上去觀察的。 [03′34″]</p>
<p>   接著就會出現一個問題:「不是有生有死嗎?現在為什麼又提到了好像無始也無終、連綿不斷的這樣一個生命狀態呢?」這是一個問題。短短的幾十年到一百年的生死,乃至到無限的過去和到無限的未來,時間似乎是沒有盡頭的、不能丈量的。你說無始無終怎麼丈量呢?就只能說無始無終——從無限的過去到無限的未來。其實這個概念是非常衝擊我們的思考角度的。當我們想到我們自己的生命的時候,當然說一期生死是比較眼前的、比較看得見的,但是從無限的過去到無限的未來,這個只能用心去思考:我的生命真的是從無限的過去到無限的未來,現在只是向無限未來的一個進程嗎? [04′40″]</p>
<p>   在這個進程中,師父又把鏡頭拉到修行,說:修行階段就是從開始一點也不認識,接觸佛法之後步步上升,一直到究竟圓滿。在無限的過去到無限的未來這裡邊,談到修行的話,一定從開始到認識、到最後,它在這裡邊是有一個過程的。那麼這裡邊會經過怎樣的過程呢?說:「<p> 怎麼樣觸發那個動機<p> 」,就是你突然想要了解佛法,像六祖大師就是聽了「應無所住而生其心」,然後就突然去尋覓善知識了。 [05′17″]</p>
<p>   大家可以想想這輩子學習佛法的因緣到底是什麼?是什麼觸動了我們的心?像有很多人是到鳳山寺看了師父,就想要跟師父出家了;還有的是在營隊中遠遠地看到師父的身影;還有的是在師父示寂之後,聽到有這樣一個僧團,他忽然感覺到:「啊!人生還有這種活法,那我決定要這麼活——像師父那樣活過我自己的人生。」就來出家了!所以每個人都有不一樣的契入點。 [05′54″]</p>
<p>   注意!「<p> 然後親近善知識<p> 」,就開始尋覓善知識;然後「<p> 如理地聽聞圓滿的教法,聽聞了以後呢,如理思惟,然後認真去修行。<p> 」師父說:「<p> 這是必然過程。<p> 」又出現了,注意!「<p> 而這個要經過多生多劫。<p> 」哪個經過多生多劫?首先,我們的生命狀態是從什麼?無限的過去到無限的未來,這個拉長不是一般的拉長啊!它已經拉到無盡了,這是無盡的一個生命的長度。在這個無盡裡邊,從聽聞佛法以後如理思惟、認真修行,這是必然過程,而這個過程也要經歷多生多劫,但是這個過程是不是還是可以丈量的?比如三大阿僧祇劫、幾大阿僧祇劫,發心之後怎樣、怎樣、怎樣,都是可以丈量的。 [06′55″]</p>
<p>   我自己聽到這個部分的時候,還是很佩服師父的勇氣呀!因為通常我們在給別人介紹佛法的時候,前後世有的時候是一個很大的檻兒,對不對?你怎麼證明有前後世呢?有些人不相信前後世。再一個,把時間拉到無限的過去到無限的未來,到底要怎麼講這個事情?師父居然在「今勤瑜伽多寡聞」這個偈子裡就講到了這個問題,讓我們注視到幾十年乃至一百年實際上是無限生命過程中短短的一個瞬間,如果放到這麼長的話,這就是個瞬間。 [07′42″]</p>
<p>   如果說一天放到一生中可能也很短,一小時放在一生中,甚至五分鐘放到一生中就像瞬間一樣。所以時間是一個對比的概念,但是師父在第三卷,就把一個弟子一下子放到從無限的過去到無限的未來這樣的視野,去看待自己的生命。我不知道諸位會不會覺得遼闊?還有些人可能會覺得迷茫:「真的是從過去到未來,我都沒有消失過嗎?」這裡邊就會像很重磅的理路一樣,打擊我們那個不思考的狀態,會去思考:「為什麼在此處師父提出了這樣的一個時間概念?」我覺得這一小段的時間概念是非常醒目的,不知道諸位讀這一小段是什麼感覺?我自己是被這個時間徹底地撞到我的心。 [08′36″]
<p>   師父常常在在大大小小的開示場合裡,都會為我們講無限生命的概念。但是臨到病、臨到什麼挑戰的時候,我們很難想到無限生命。大多數的概念就是這一期的生死看得比什麼都重要,不會在無限生命的航程中看待這一期的生死,所以我們很難把我們這一天放到無限的生命中去度量。正因為不能放到無限的生命中,我們就會忽略因果這樣一個概念。 [00′37″]</p>
<p>   在《廣論》的〈毘缽舍那〉有提到:斷見者之所以不承許因果,是因為他沒有看見。沒有看見什麼呢?就是現在的有情是從前世來到此世,以及從此世再前往後世。因為他沒有看見這些,所以就說那些是不存在的。在《廣論》裡宗大師這樣講了之後,就引了月稱論師所著的《明顯句論》作為依據,裡邊怎麼講的呢?說:斷見者到底是怎樣的?他們就是緣著現世諸法行相的這個自性,沒有看見從前世來到此世以及從此世前往他世,沒有看見這些。 [01′25″]</p>
<p>   當然在〈毘缽舍那〉這個部分,是在討論無自性是不是就一切全無?是在討論這個。然後就因果也沒有了、前後世也沒有了,他是為了講這件事。那麼這個「斷見者」——我不知道大家聽了之後會怎樣想——不承許因果、不承許前後世的原因,是因為他沒有看見。那麼大多數的人是看不見的,對不對?很多很多都是看不見的。就看不見的部分來說,很多人就會認為看不見的是不存在的。如果科學家沒有證明出空氣裡邊有氧氣、氫氣、各種成分的話,其實我們會覺得這什麼也沒有。氧氣會存在嗎?還有各種成分會存在嗎?還有像彩虹如果沒被我的眼睛看到的話,我們怎麼知道有彩虹呢?假如說在一座山的後面有一道彩虹,而人都沒有看到那道彩虹,可能人們就不會認為世上是有彩虹的。假如有什麼飛翔的鳥牠會講話,告訴我們說山那邊有一道彩虹,我們沒有乘飛機飛過的時候還是看不到,沒有看見的時候就會覺得這個是不存在的。 [02′41″]</p>
<p>   師父從六祖大師這個公案,讓我們去認識到:我們對自我的認知、對生命本質的認知、對修行狀態的認知,常常是局限在很短的時間內下判斷,根本不會放在前世後世,更不要說多生多劫。那麼從這個問題的透視,我們可以看到:我們看六祖大師的公案是這樣看的,那我們看世上所有的事情,是不是都局限在非常短的時間內,像照照片一樣,「咔!」照了一下之後,我們就定格在那個地方,就會認為事情是這樣?但實際上它從過去到現在、到未來,它是一個每時每刻都在變化著的無限生命的續流。 [03′31″]</p>
<p>   師父在這一小段講的這幾行字立義相當地高遠,徹底地挑戰我們心中的斷見習氣!就是那種動不動就覺得什麼事就是眼前這個因引起的,只是就昨天、前天這個因討論這個事情,我們很難從過去生的多生多劫去考慮。欸!這個人對我這種態度,現世是沒有什麼道理的,他這樣對我是非常無理的;但是我們不會向過去生推,因為都忘記了、因為我們沒有看見。所以,很多事情一旦不放在「如是因結如是果」的道理上看的時候,我們就會抱不平,就會覺得他那樣,我為什麼不可以那樣?一旦忽略了過去生的努力之後,只局限於這麼短的時間內,當然無法擺平;一旦把過去的事情全部想起來,都擺上了檯面之後,可能大家就覺得公平了,因為凡事都有因果。所以一旦把我們的視野放到多生多劫的角度去看的時候,我們就會對眼前的事情看開了。為什麼看開了呢?因為凡事必有因,不可能有完全無緣無故這樣的利益或者傷害。 [04′47″]</p>
<p>   師父對我們的說法恩非常地深,因為這本來是講「今勤瑜伽多寡聞」這樣的一個偈子,但是師父在這個偈子後面,大刀闊斧地掃蕩了我們心中那種斷見的影子,或者還有強烈習氣的,毫不留情地掃蕩了這個觀點或者我們心中的這個邪見。而且是在勸我們學習佛法一定要從聽聞開始,怎麼樣去看待六祖大師這件事,透過這樣的一個角度,讓我們去了解「生命是無限的」這樣的一個真諦。所以會覺得師父是非常善巧的,而且他處處為我們考慮,會考慮到我們理解六祖大師的難點到底是什麼?如果不了解的話,就像師父說的,都念《金剛經》,拚命念,沒有去看一些解釋《金剛經》的論的話,念了很多也還是不了解是什麼意思,因為沒有循著一個聞思修的次第去修學。 [05′53″]
<p>   師父在「今勤瑜伽多寡聞」那裡邊講到:「<p> 閉門造車,多多少少造了一點哪!但是他在門外空轉,轉了半天是原地踏步,不僅僅是忙一生,多生多劫這麼空忙,這個很可惜,這個很可惜!<p> 」師父在前一節課就講了「多生多劫」,說:「不僅僅是忙了一生。」前幾天聽到這個概念的時候,不知道心裡會不會有疑問,說:「真的會多生多劫空忙嗎?」然後看看,講了六祖大師之後,發現他可能多生多劫就是這麼努力的。這一生的樣子,就是過去生做什麼,這一生就顯現什麼。所以這一生很多同學能夠對大師的教法有這樣的一個信心,對聽聞能夠長久地堅持不懈、持之以恆這種勇氣和毅力,這過去生也不能說是沒有影子的。所以從現在就可以知道過去生可能也很重視聞思的、很努力聽聞。 [01′09″]</p>
<p>   好!我們再聽下一段。<p>   所以有一類人,是的,他前面已經有了相當程度了,所以這一生出來,他不要做這個基礎。就正規一般狀態對大部分人來說的話,這個我們應該有的認識。如果你不認識這個,然後呢斷章取義地來說、來看的話,這個不合適,是教法的錯誤。假定這樣的話,那我覺得我們不必仿效六祖大師,仿效六祖大師已經太差了,你何不仿效佛呢?六祖大師是聽了一偈開悟,也只是開悟而已呀!佛啊,乃至於一偈也沒聽見,嗯,他就自己跑出去就出家了,然後呢最後坐在這個尼連禪河邊上面,到了晚上抬頭一看,看見月亮,就大徹大悟成了佛了。如果說我們真正能夠這樣的話,那仿效六祖大師也太沒有出息了!為什麼要仿效六祖大師?要我的話,我仿效佛,我也跑到印度坐在那個上面,抬起頭來一看,成了佛了!這個我們一定要了解啊! [02′34″]</p>
<p>   這一小段,師父說:正規狀態對大部分人來說前面是有了相當的程度,所以這一生他就不用做這個基礎了。但是如果我們不認識這個道理呢,就斷章取義的話,就會覺得這個教法講的是錯誤的、是不合理的,他說的是前後矛盾的。然後師父說:如果你認為是可以這樣仿效的話,他還是選擇仿效佛陀,坐在那個尼連禪河前面,對吧?然後晚上抬頭看月亮,就大徹大悟了。 [03′20″]</p>
<p>   以前我在學的時候,也問過說:「佛陀悟到的到底是什麼?」現在學了《廣論》之後,就覺得最重要的是先學會聽聞軌理,好好地聽,學會如法地承事善知識,然後把自己的信心修起來;對三寶的信心、對業果的信心,這些都是很重要的!累積了相當的資糧之後,最好能夠抉擇什麼?趣向大乘,以一個趣向大乘的發心去聞思修空性。 [03′53″]</p>
<p>   我們知道我們想要了悟的無自性的道理,是必須經過親近善知識、聽聞教典,而且要廣泛地、多門地集資淨障,才能夠達到那樣的一個結果,並不是想要坐下來開悟,就一定能夠開悟,所以必須要知道循序漸進的道理。 [04′14″]</p>
<p>   最重要的是,我收攝一下,先說聽聞軌理的訓練。比如聽法的時候,現在能不能做到不昏沉?說:「精神的時候是可以的,疲憊的時候就要昏沉。」對不對?我們還是無法打敗這個色身給我們帶來的困擾。能做到專注嗎?什麼時候法音響起來,你都能夠專注,不想你自己剛才緣的那件事,能做到這樣嗎?訓練這麼久了,很多還是不行,多半就是發現原來緣什麼續流,一上課的時候會分神在那個續流裡。所以我會常常在上課的時候跟你們說:「注意喔!別走神、別走神!」就是數數地訓練你回到當下的善所緣上,不要一直流散到其他的事情上。 [05′01″]</p>
<p>   光是一個聽聞軌理的專注,還有一個聽聞前的發心,我們發現都很難練成習慣,念一遍就覺得是發心了,沒有轉動心意。比如思惟聽聞軌理、聽聞勝利呀,這些看起來好像就那麼一小段,但是到底這一小段的內涵,我們有沒有在我們的身心相續中讓它出現呢?有沒有變成是我們心續裡的——想要有就有?而不是說忽有忽無的,飄忽不定這樣的,根據自己的心情和健康狀況,非常不確定的一種聞法的狀態。如果大家觀察到自己這樣的話,就要好好用功了。因為如果聽聞的時候,在發心的時候不對,後面就都不對了。如果在聽聞的時候常常地走神、常常地昏沉散亂,養成習慣之後,只要一聽法就開始散亂;只要法音響起了,你就想睡覺。這都是需要斷除的惡習。所以大家在自己的相續中觀察到這一點之後,不要留情,要狠狠地破斥當下那個狀態,就是要努力地轉它。 [06′19″]</p>
<p>   光是要對治昏沉這一點,大家也要痛下功夫!像我以前看到有一個老居士,他在聽法的時候就常常昏沉。昏沉到什麼程度呢?就是坐著聽會昏沉,然後跪著聽會昏沉,站著聽也會昏沉。如果他跪著聽的話,有可能突然睡著了,倒到前面那個人的後背上,就昏沉成這樣!後來他就拿一個濕毛巾頂在頭上,冰冰的濕毛巾頂在頭上,頂在頭上的時候呢,還是會昏沉!好像直接會倒下去。等到一下課呢,他整個人就精神了,哎呀!就好像是生龍活虎的一個人,只要一上課就開始睡。所以他自己一下課就很苦惱,然後說:「怎麼辦呢?」只要說:「迴向!」欸!他馬上就開始全部都清澈了。那你說這就是一個業障,大家都知道這叫業障。他為此苦惱,但是就是每天都這樣。後來他拚命地祈求啊、懺悔呀,好好地供佛。大概是過了多久之後?應該不到一年,他這個毛病就改了。後來聽法最精神的,就是這個老居士,眼睛都會雪亮地盯著帶班的班長。然後他回答問題都很積極,舉手舉得很高。他就對治了自己昏沉,這是我眼見的這樣的一個居士。 [07′43″]</p>
<p>   現在我都不知道大家是在什麼地方聽呢?你千萬別覺得:「啊!我在這兒聽,反正老師看不見,我小睡片刻。」這不可以的!或者說打個盹,這都不可以的!現在如果你的眼睛快粘起來了,趕快把它睜開,然後不許昏沉。聽課的時候要注意!因為我們一定要注意:你養成一個習慣,你不去對治的話,一旦它是個惡習,就會越串越大、越串越大,甚至很多生都這副樣子,這是太可怕了!一旦把我們的一個小小的習慣,放在多生多劫的這樣的一個歷程中去看的話,我們就不能忽視它。因為小的過失如果不努力斷除的話,累積成習慣就叫惡習了,所以不能輕視! [08′32″]
<p>   那我們接著聽一下新版《廣論》,師父對於「今勤瑜伽多寡聞,廣聞不善於修要」還有一段解釋。在聽聞的時候注意不要走神,認真地聽! [00′19″]</p>
<p>   換句話說,你先對這件事情不了解,現在你了解了。那我們現在「相應」也是一樣,先文字了解,後來文字的義理了解,後來義理當中的內容了解,要層層深入。我們通常容易犯的這個毛病,才學得一點皮毛,那自己以為:啊!行了。所以真正要想學這個的話,藏地的祖師們也好、印度的祖師們也好、漢地的祖師們也好,沒有一個例外,告訴我們:最重要的濃縮起來兩句話——淨罪、集資。就是我們的障礙,這個如果沒有除,不可能學得進去﹔資糧不夠,不可能學得進去!因此現在在這個地方大家有一點要注意:平常我們總覺得好像我是來學的,應該坐在這裡你來教我的。我有這個資糧嗎?所以你們仔細去看看自然是了解,不要以為在這地方好像來做點常住的事情,或者我不願意做不相應的事情。實際上我們有幾個分別:不應該做的是不要做;應該做、自己不了解的這種事情,常常自己不清楚,我們要了解這就是我們最好的集聚資糧,資糧不夠你要想修學佛法是絕無可能,絕無可能!這個不是一個語言上面,我只能簡單地說,當你們慢慢地去深入的時候,你們自然會感覺得很不一樣的內涵。 [02′10″]</p>
<p>   好!這一段師父在前面說了一小段話,說:要先文字了解,文字的義理了解了之後,當中的內容要了解,然後層層深入,它是有一個循序漸進的過程的。但師父又說我們的現行是什麼呢?我們通常會容易犯個毛病,這什麼毛病呢?才學了一點皮毛,就以為:啊!行了。就是把佛法想得太淺了。 [02′48″]</p>
<p>   接著師父講了藏地的祖師、印度的祖師、漢地的祖師,提問大家一下,說:「<p> 沒有一個例外,告訴我們:最重要的濃縮起來兩句話<p> 」是什麼?應該是四個字:淨罪、集資! [03′08″]</p>
<p>   師父在講到「今勤瑜伽多寡聞,廣聞不善於修要」的時候,在新版《廣論》裡邊一下子就跳到了「淨罪、集資」。我們會覺得:喔!講到這裡了。大家可以想一想,師父接著要告訴我們什麼問題?說我們的障礙如果沒有除的話,不可能學得進去;資糧不夠,不可能學得進去!注意!為什麼學不進去?「今勤瑜伽多寡聞」是不是也沒有去聞?可能是聽不進去。然後「廣聞不善於修要」,他聽了很多之後沒有往深了學,是不是也是學不進去?學不進去就是深不下去的意思,對不對?也廣不下去、也深不下去。 [03′55″]</p>
<p>   那麼廣不下去、深不下去,究其根本的原因到底是什麼呢?我們可能說:「啊!沒有善知識,應該親近善知識。」但是大家都知道值遇善知識要不要福報資糧呀?要的!聽善知識的話,也要資糧!所以深不進去的原因、廣不下去的原因是什麼呢?沒法聽聞,所以要淨罪集資,說障礙不除是沒辦法的,資糧不具是沒辦法的! [04′27″]</p>
<p>   我們可以觀察一下我們自己:當我該修的法修不出來,像出家人背書啊、小孩背書背不出來,還有廣論班的同學一段時間就沒心力了;當沒心力的時候,或者說我對所學的內容感到有點堅持不下去,這個時候我們會不會現起:實際上我障礙未除、資糧未具,是這個原因?還是我們會說:「家裡事情太忙、太笨、身體不好」?或者說:「我對這個沒興趣,我的興趣在其他方面」等等、等等?我們會給自己找很多的理由,但是是不是很少想到障礙未除、資糧未具? [05′15″]</p>
<p>   就是有的時候我們表達說:「哎呀,我業障啊!」但是「我業障啊!」就完了嗎?「業障」之後得消除業障、得淨化業障。而且師父說藏地的祖師、印度的祖師、漢地的祖師沒一個例外的,就是所有智者如是說,只要學不進去就這兩件事,四個字——淨罪、集資! [05′40″]</p>
<p>   像以前也有這樣的事情,廣論班的居士開始學得是很歡喜的,每天背著書包像上學一樣來到廣論班的教室,大家一起快快樂樂地學習。可是過了一段時間,有位女居士她的公公婆婆一起生病了,八十多歲的雙親一起住院了,她非常非常地擔憂,每天在醫院裡陪護著,來回送飯。廣論班的同學聽到了之後,就去支援她,也安慰她焦灼的心。 [06′19″]</p>
<p>   過了大概一個月,她的雙親出院了,她又回到了廣論班上課,以為這下可以順利地上下去了。又上了一段時間,她的小兒子出了車禍,還好聽說只是腿骨折,但是作為母親的她非常擔心,沒有心思來上課,整天擔心她的寶貝兒子。廣論班的同學又去關心她,也有相互認識的骨科醫生打電話給她,大家齊心協力。總算她兒子的腿是保住了,後來健康地出了院。出院之後,她在家裡照顧了幾天兒子,又回到班裡上課了。 [07′11″]</p>
<p>   學了一段時間,哇!她的孫子出生了。這是一個對家庭充滿奉獻的女居士,她又決定在家裡看孫子、不來上課了。孫子慢慢地看了一段時間,然後廣論班的同學就建議她:「你可不可以一週休息一天來上課?其他時間看孫子。」因為每次上課的時候,大家看著她空著的座位,想到她那麼歡喜學《廣論》,卻有這麼多困難,大家一方面非常佩服她對家人的奉獻之心吧!一方面也很想幫忙她把廣論課堅持下來,因為那是她很想學習的。 [07′56″]</p>
<p>   那時候,我們在廣論班裡就推行比如說在佛前供水、供七碗水,在佛前供燈,還有集體拜三十五佛,那時候還念《度母經》、阿彌陀佛佛號,然後還有人誦《華嚴經》、《廣論》。總之,在學《廣論》之外,大家還會做很多的集資淨障的法。尤其是要特別地對家人很感恩,要改掉自己的壞脾氣,要對家人多關心、多感恩。因為看到學《廣論》的同學個性上的改變,多半家人就會支持他來廣論班。 [08′41″]</p>
<p>   我記得有一次,好像廣論班有幾天沒上課,有一個先生就來找到我說:「唉呀!廣論班怎麼會停課了?」一停課,他太太在他們家客廳來回轉、來回轉,轉得一上午他自己都不能安心。他說:「她一上廣論班之後,她脾氣就變好了,這樣的話,我也就是可以享享福。」他就說他非常支持太太上廣論班。 [09′05″]</p>
<p>   當然也有的先生會認為上廣論班耽誤家務了,那既上廣論班又要管家庭的一個女居士她就很早起來,為家人煮飯、洗衣服,然後她還要供水、供燈、聽課,就會忙碌一些。儘管如此,很多廣論班的同學還是克服了各種各樣的困難,互相幫忙,把《廣論》堅持聽下來。其實堅持聽久了,有的時候家人也會加入,家人加入之後,也是對家人的一個很好的奉獻吧!因為由於自己努力學《廣論》,家人跟著找到了皈依,找到宗大師教法,所以這也是對家人的一個巨大的貢獻。 [09′46″]</p>
<p>   就像剛才我講的那個女居士,她終於在大家的勸慰和幫忙之下,也是做這些加行,她家裡的事情也沒耽擱,廣論班也堅持下來了。所以後來她就一直跟班,她很感恩這一段大家對她的幫助,她說:「那個時候,任何一件事都會使我有一個理由,就是我沒有時間去學《廣論》,或者我完全完全地沒有精力。在這種狀態下,大家相互幫一下,就過了這個關了。」為什麼在這個時候會有這麼多人幫忙她呢?這也是一種福報啊!對不對?所以在廣論班裡大家相互幫忙,一起淨罪集資,把學《廣論》這件事堅持下來,對我們的生命畢竟意義太深遠了! [10′46″]
<p>   還有一種,師父在下面解釋說:在常住,平常我們覺得我就是來修行的、我就是來學的,反正我坐在這就是來教我的。然後師父就反問說:「有這個資糧嗎?」就是學法有這個資糧嗎?我們現在也可以觀察自己為常住承擔一些事情的時候,我們就會說:「哎呀,我想要天天聽法呀!不要承擔這些事情啊!」可是常住這麼多人在一起,就是要有人煮大寮、有人掃院子、有人要關顧研討班......。很多很多事情法師如果不去忙碌的話,實際上很多人是沒有辦法的,所以必須得大家一起忙碌! [00′39″]</p>
<p>   如果說一忙碌的時候就覺得是耽擱修行、沒有時間聞法,心裡憋一股怨氣,而沒有把它當作是集資糧的機會,這樣的話,很多時候忙了很多事情,是不是就白辛苦了?所以師父在揭示我們說:「<p> 不要以為在這個地方好像做點常住的事情,或者我不願意做我不相應的事情......。<p> 」師父在說我們心中的那種不解或者怨氣——覺得我不該是做這個、我應該是這樣的,我為什麼要這樣呢?實際上修行不是這樣的,就在當下的緣起點上,認真地在為大眾付出的時候,努力集資淨障。 [01′23″]</p>
<p>   所以師父說了幾種事情,說不應該做的是絕對不要做的,但是應該做、自己不了解的事情,常常自己是不清楚的。我覺得這個點大家可以考慮一下:應該做、自己不了解的這種事情,常常自己不清楚,我們會有這種感覺嗎?我們會不會覺得應該做、不應該做我是知道的,應該做還有我不了解的嗎?我應該做這件事,我不了解嗎?而且關於不了解這件事,自己是不清楚的。那到底師父指的是什麼事情我們不了解、我們不清楚?這件事應該做,然後自己不了解這個應該做的事情;然後對自己不了解這個應該做的事情這個狀況,自己不清楚。這好幾重喔! [02′09″]</p>
<p>   這是說哪件事情啊?還記得前面聽過的嗎?就是:「<p> 我們要了解這就是我們最好的集聚資糧!<p> 」應該做的這個事情恰恰可能是我不太喜歡做的、我認為是不應該做的,但是這恰恰是我們最好的集聚資糧。為什麼要集聚資糧?資糧不夠修學佛法,師父講了四個字:絕無可能!絕無可能!我們想要善所緣在心中生起來,我們想要正念一直都在,或者我觀想什麼、提持什麼馬上就來。如果乾觀想也觀想不出來,怎樣也是沒法清晰地現起,比如說佛陀的尊身,或者我想要聽聞軌理具足也現不起來,這些所有的狀況,師父讓我們樹立一個見解——資糧未具、障礙未除!師父這「絕無可能」說兩次喔!資糧不夠,想修學佛法,絕無可能!絕無可能! [03′15″]</p>
<p>   然後師父接著說:「<p> 這不是語言上面講的。<p> 」我們說:啊!我缺乏資糧啊、我有業障,這不是這樣學著師父說一說就會了解的。師父說這是簡單地說,當我們深入下去的時候,我們自然會感覺到很不一樣的內涵。那麼對於集聚資糧和淨化業障,我們到底能夠體會到一個怎樣不一樣的內涵?學了《廣論》這麼多年的同學,不知道當下大家在想什麼?還有法師們在想什麼? [03′48″]</p>
<p>   這裡邊我再講一下。通常我們學不下去的時候有兩種反應,一種是什麼?怪外境,對吧?「如果環境不是這樣的話,我就能學下去。」、「如果他不是那樣老是看我不對,或者對我說了一些傷害我自尊的,或者讓我非常不舒服的話的話,我覺得我在這環境裡還是不錯的。」或者「我跟某人關係好,我還是不錯的。」這是一種什麼?原因出在外境上。還有一種人就是覺得我自己笨啊,我自己怎麼樣、怎麼樣啊!就是從自心的角度,他會覺得是自己不夠。但無論是覺得外境不夠,還是覺得內心出問題,他的癥結點都在於什麼?資糧未具。 [04′36″]</p>
<p>   那這是不是給我們一個嶄新的思路?當我們遇到困境的時候,我們會常常糾結於這個環境怎麼是這樣的,和我想像的完全都不一樣,為什麼不像我理想的那樣呢?心裡就產生了劇烈的求不得苦,心裡就是七上八下、放不下。會不安、擔憂,怨自己的時候會覺得沮喪,有的時候會覺得很孤單,或者很害怕接下去會發生什麼。當這些種種的心情現起來的時候,我們能不能對諸如此類的心情和感受給它一個見解——實際上,你不用想那麼多、怪那麼多事情,好好積資糧、淨化障礙就可以了,除掉障礙就可以了? [05′23″]</p>
<p>   以前有些同學就說:「哎呀!我現在《廣論》學不下去了。」有的人說到中士道就學不下去了,還有的人到上士道學不下去了。說就是業障啊,什麼家裡事情......講一堆。我說:「應該沒那麼複雜,好好地供養三寶,看你會不會提起心力?」集資糧嘛!好好地供養三寶。甚至班級裡舉辦一個小型的供養法會,大家都從家裡拿點蘋果呀、拿點橘子啊,甚至有的人拿碗供水呀,拿一個燈在佛前供一盞燈,我們去對殊勝境做供養。還有的人念密集嘛、旋繞,還有的就是大家在一起拜三十五佛懺。供養過幾回之後,有一些人真的就好起來。他說:「莫名其妙!我心情好起來了。」 [06′05″]</p>
<p>   還有一直放在心上想的一件事情:哎!才下眉頭又上心頭,就是擺脫不了那個人,就是擺脫不了那件事,你就會發現就像一個網一樣,他把心完全塞到跟那個人有關的事情裡,他就是抽不出心力來。但是一旦認真地去緣念三寶、祈求三寶的加持,比如說念密集嘛、念三十五佛,還有人念《二十一度母經》,這樣念,念一段時間之後,他就發現:「欸!好像我好點了。」 [06′33″]</p>
<p>   所以當自己感到心力不濟的時候,切記!不要瘋狂地向自己的頭上貼超多的標籤:「我這個不行!那個不行!怎樣、怎樣、怎樣......」,發了太多對自己的負能量的這些心念,全部都是打擊自己的。這樣打擊完就更沒力氣學了!本來是遇到困難了之後,應該自己給自己加油;可是我們遇到困難之後多半都是否定自己,釋放更多的負能量讓自己沒法消化,然後自己把自己搞得非常地煩惱。是為什麼呢?就是因為我們對於「學不進去」這件事,沒有一個正確的看法,沒有一個正確的知見。或者說:「那感覺是很真實的,我沒能力呀!」可是感覺上真實的東西,經過正理觀察之後,你會發現事實不是那樣的。我們的感覺,尤其是凡夫的感覺,有太多的欺誑! [07′28″]</p>
<p>   所以,對於學不進去這一件事,沒有建立正知見,就沒有辦法去解決它。當我們感到學不進去的時候,就只能跟著感覺走。那感覺是什麼?就是真的不能學了。可是好不容易「人身難得今已得、佛法難聞今已聞」,碰到學不下去這個障礙,沒有辦法解決嗎?師父教我們就四個字——集資淨障,這便是解決之道啊! [08′01″]</p>
<p>   所以,師父這麼說,藏地祖師這麼說,漢地祖師這麼說,印度祖師這麼說,所有的智者都是這麼說的。那我們是後學者,是不是要聽一下祖師們的看法?然後跟自己的那種感覺上比較真實的東西對比一下。是不是願意把自己這種見解堅固地認為自己不行,或者以為外境有問題,從這兩個方向一直在這折騰不出去的這種狀況,用集資和淨障這兩大問題攝起來之後,集資、淨障,就馬上行動就好了!淨障就拜三十五佛!其實你懷著淨化業障的動機去做很多很多事的時候,都是在淨化業障啊!比如說孝順父母、承事師長,或者做善事,甚至掃地,你懷著掃掉業障的想法,就是在淨化業障。 [08′51″]
<p>   我們用了很長的篇幅去評論環境的過失,用了大量心靈裡的自我抨擊的聲音去打擊自己,但是這些東西對我們「學不下去」這件事到底有沒有幫助呢?是不是有價值的一個探索?當然我們會說這是探索為什麼我學不下去?但這個方向探索下去,要多大力氣可以把整個環境都改變?或者我用什麼樣的觀點,會一下子認為我是很強的?看起來就是不強。所以從這兩方面都是碰壁的。 [00′37″]</p>
<p>   那我們不如就老老實實地聽所有佛菩薩他們異口同聲的這個觀點,說:「不要想那麼多,就是集資、淨障!就這兩件事做得不足,你不要給自己貼那麼多標籤!」如果你把這兩件事做足了,你就行了!任何人都是,不是說你不行,所有人都是這樣的!如果資糧不夠、業障沒有淨化的話,就是學不上去!所以這是能夠學進去的條件,你只要圓具這些條件就好了,不用對自己發出那麼多慨嘆、悲傷,又是很多很多自我否定的那些言論,都會蹉跎時日,而且給自己添了太多的傷心吧! [01′26″]</p>
<p>   所以從這樣的觀點,我會覺得師父這個理路給我一種很亮麗的感覺,讓我們在重重困境的圍困之下,突然看到:欸,我輕裝就可以上來!我不用去一直背負著環境這樣、那樣的,背負著我對我自己那種諸多的看法,我只要去集資、淨障就可以了!有的時候佛法我們覺得艱深、覺得深邃,但佛法教給我們的解決困境的方式,是如此地簡潔明了,非常地清晰,一點都不含糊。你做就是了,做就會有結果! [02′03″]</p>
<p>   很多年前吧!有一次我也覺得:哎呀!對我的修行非常不滿意,陷入了一個很深的苦惱。苦惱了一段時間,我在想:苦惱下去也沒什麼進展啊!那還是老老實實地祈求吧!所以我就去供養觀世音菩薩,用僅有的錢——一個學生嘛,一個小學生有多少錢——買了一串項鍊,然後就供養觀世音菩薩。 [02′28″]</p>
<p>   其實你也不用買項鍊,不用學我一樣。我買了之後供養他,然後我就開始認真地念觀世音菩薩,祈求加持。過了一天,第二天我就覺得:欸,我好像不一樣了!面對還是那樣的困境、還是那樣的狀態,我突然覺得我變了,我覺得那個困境很小呀!我很有心力。然後自己去照鏡子的時候,發現自己眼睛變亮了。為什麼?心力變強了嘛!當你心力變強了之後,你就會發現這個障礙一步就可以踏過去了!甚至已經過了!其實就是心力。心力是什麼?集資、淨障就可以長心力。 [03′07″]</p>
<p>   所以這個非常簡潔、實用的、讓我們「學不進去」這件事情可以解決的辦法,不知道大家聽了之後什麼感覺?你們會不會覺得聽了是要實踐的?要實踐的話,其實定期一段時間,廣論班就可以一起拜三十五佛懺。像那個時候,我們也是沒有固定的教室啊,就在居士的家裡邊,人也不是很多,在沙發上拜的、在地板上拜的,反正到處都是,有個地方大家就拜佛。人擠人拜不開的時候,就是彎腰一下,因為前面已經都站滿了磕不下去,但是他的心也是誠心誠意地拜三十五佛。看有一些居士真的是很有善根! [03′48″]</p>
<p>   像在僧團拜三十五佛的時候,出家人,哎呀!衣服都濕透了,一天就濕透好幾輪啊!有一些修行人的心力真的是很猛的。看到這樣的修行人如果學不下去,真的我是心裡很擔心,也有一些難過。但是如果能夠聽進去師父的這一番話,那你說我們哪有什麼難點?難點集資、淨障就好了,然後就會穿越! [04′15″]</p>
<p>   所以我會覺得這是一個非常大的希望,我們知道了集資、淨障可以穿越困難,而且我們有能力集資、淨障。如果我們能對師父講的這句話,說:「最重要的濃縮起來......」就像一個口訣一樣,集資、淨障,然後就一切都能解決。這精髓喔!精髓喔!師父在「今勤瑜伽多寡聞,廣聞不善於修要」裡邊,就切入了這個要點。為什麼你不能廣聞?為什麼你聞了之後不能修要?其實就是資糧未具、障礙未除,只要沿著這兩點就可以了! [04′56″]</p>
<p>   所以師父給我們的方法是非常有力的、可以直接操作的!非常希望大家聽了之後,能對現在遇到的困難有幫助。比如說我們誦《般若經》,看起來天天誦、到時間就誦,好像參加法會挺歡喜,可是不知道淨化多少看不見的業障。還有去服務啊、當義工啊、聽法呀、承事三寶呀,還有供養法會呀,甚至去幫助需要幫忙的人,甚至我們去救一隻流浪狗......,這所有的一切如果都迴向聞思修的話,那我們沒有一天是在浪費時間的,我們所做的一切都是為了淨罪、集資。 [05′45″]
<p>   談到供養三寶,也不一定要花很多錢,比如說七碗淨水,在佛前供水,然後一炷清香。像有的居士定期喜歡供水,要供一百零八碗,供很多;還有的就是每天七碗。像以前有一次阿喀來到我們那地方,他先去佛堂。先去佛堂看什麼呢?我認為阿喀要去佛堂禮佛,然後我發現他特別留心佛堂到底供水供得怎樣,連著三天,小阿喀都先去佛堂看有沒有供水。我在佛堂門口迎接阿喀的時候,發現阿喀進去的時候會走路很快,看一看到底有沒有供水,等到他出來的時候就突然很放心,連著三天,看三天之後,第四天他就沒看了,因為他發現:喔!我有供水。 [01′00″]</p>
<p>   雖然供水這件事,看起來就是家家都有清水,每天你拿著這樣的清水倒進七個水碗裡,到天黑之前要把它撤下來,然後把碗擦一擦扣起來,就這樣一個動作。但是很多善知識其實非常非常地關注,因為這就是集資糧啊!在供養的時候你要專注,比如說你要對皈依境認真地供,養成習慣就是天天供。你想:世上的水那麼多,家裡邊的水是很多的,可是我們卻沒有時間在三寶前擺上七碗水供養,這就是沒有養成習慣。 [01′40″]</p>
<p>   那麼怎麼樣養成這個習慣呢?開始做就是了!找一個小本,然後列上「供水七碗」,今天做了就打勾,沒做的話就去佛前懺悔一下。或者你覺得懺悔的話你有內疚感,那你就總結一下:這一週供了三天,喔,下週要供四天,或者哪天全部沒有一天缺的、都要供水。供水供成習慣之後,其實到佛前的時候,你就會把很多憂慮的事情、沮喪的事情好像瞬間清空了一樣。你就面對佛菩薩,端著這個水壺,小心地把那個清水注入到供水碗裡;在這之前你要把供水碗擦乾淨,然後一碗一碗這樣注。注的時候你是非常專注的,你一直盯著那個水柱,因為它會有一個要求,是說:不能太滿,太滿會驕傲;還有不能不足,不足會資糧不足。所以標準說法就是:那個碗上面就差一顆青稞那樣的距離,就是一個米粒吧,不要供到快溢出來了。 [02′39″]</p>
<p>   供完之後再供燈,然後再供香。之後你一定不會馬上就走,還會在旁邊注視著佛菩薩。然後你可以對佛菩薩祈求,比如祈求今天我做什麼希望上師三寶加持我,讓我所做的一切都能成為正法的資糧,不要用不如法的方式去成辦這些事情,也不要以現世的利益去做這些事情;希望我能夠發起菩提心的隨順啊、希求空性啊!你看到佛菩薩就會提正念,看到佛菩薩就會感覺到有希望啊!比如說看觀世音菩薩,有的人一見觀音菩薩就笑,因為觀世音菩薩就是用那種非常非常慈悲的眼睛在看著我們。在面對著佛像的時候,佛陀說我們要對這個佛像像他一樣的話,我們就會得到佛陀的加持。雖然每天就這樣一個短短的可能五分鐘或者三分鐘的供水,但是你想想累積起來會累積多少資糧呢? [03′37″]</p>
<p>   其實以前不方便的時候,就是用一個很小很小的觀世音菩薩的像,或者釋迦佛的像,或者資糧田的像,很小的一張貼在那個地方,下面擺幾碗水就可以了,也不一定非得特別大。但是有條件的話,你可以很莊嚴地布置佛堂。最重要的是我們的心意!我們能否意識到每天不集聚資糧的話,就像大把的黃金和白銀白白流掉一樣;清水到處都是,可是你把它獻給三寶那就是自己的資糧,你不獻的話,今天就過了,過了就沒了,這是非常真實的事情。 [04′15″]</p>
<p>   供水完了,或者你去佛堂之後,通常大家都會禮佛。「禮佛一拜,罪滅河沙。」或者有的人佛堂放著《三十五佛懺》,迅速地就可以念一遍;沒有時間拜,念一遍也行。就像宗大師說:「睡前如果不念《三十五佛懺》,我無法安心入睡!」連這麼偉大的善知識都如是說,我們豈敢每天不淨化業障呢?淨化業障,對我們最好的幫助就是《三十五佛懺》,噶當派祖師說:「你今天念《三十五佛懺》了嗎?沒念呀?那你登地了嗎?」所以每天念一遍也是非常非常值得的! [05′03″]</p>
<p>   所以希望大家能夠重視集資、淨懺,把它納入到我們生活的這種程序之中。其實也就是幾分鐘就完成了,你可長、可短,關鍵是養成一個習慣。我再說一遍,就像大把黃金、白銀的供養,清水就可以了,就像黃金、白銀一樣,獻給三寶就成為我們的資糧。 [05′30″]</p>
<p>   在佛前走過,都想合掌鞠躬一下,或者看佛菩薩一眼,或者禮拜一下,每一次禮敬都是在淨化自己。而且在佛前禮敬的時候,會注意到讓自己的心清淨一下。在那一刻,其實我們也會被療癒,被佛菩薩的笑容療癒,被自己的這個行為療癒,內心裡也會感到清涼和愉悅;有的時候會對這一天的工作,或者一天要應對的事情,也有一個正念的提持;有的時候還會有一個強大的歡喜心的攝持。想一想:我多有福報啊!又遇到佛菩薩,能夠生起信心;而且我有供水碗、我有供水壺,我就每天都可以供養;能夠值遇大師的教法,能夠有師父、上師三寶的攝受......一想這些事情大概就會很開心了!所以生活中再發生一點大大小小的事情,有點不順心的事情,或者別人出口傷了自己,但是想想三寶,然後自己想想說:啊!這些小事也不必在意。其實歡喜也是很大的進趣菩提的一個力量。 [06′45″]
<p>   好!那我們現在再聽一下新版《廣論》的下一段。<p>   那個而且這種事情也不是文字相。我願意講一個非常簡單的故事給你們聽:前天我出去到台中,因為有一個同學出了車禍。然後這個車禍是非常厲害,差一點命送掉,那個腿上的肉整個的不見掉了,那說不定有可能這個腿都要廢掉。要我們平常的時候,當然會抱怨這個、抱怨這個。當然除了這個抱怨那個車子撞他以外,還要其他的抱怨。一般人來:「什麼?我學了佛,沒有保祐我,怎麼反而還要受這個障礙!」我們很多人都會有這樣的現象。我們把佛法看成功就像今天世間上面大家做小販的:我給你三塊錢,你給我三塊錢東西,我給了你十塊錢,你得給我十塊錢的東西。我們把學佛法想成個現前的交易一樣,好像我今天供養了你三斤香蕉,等一下你就應該來加持我,讓我發一個大財,就這麼荒唐法!對佛法的深厚的內涵都不清楚。佛法正規地講都講業,這個業前面是非常的深厚的因緣,絕不是眼前的。 [01′38″]</p>
<p>   師父在這段裡講了一個車禍的同學,這個車禍很嚴重啊!說腿上的肉都整個不見掉了,而且這個腿可能都要廢掉。一般的狀態下應該抱怨那個撞他的,怎麼不小心把他撞成這樣,產生了這麼深刻的痛苦。這是一個抱怨,抱怨撞他的車子。還有一個抱怨誰呀?就抱怨佛菩薩:「我都學佛了,你還不保祐我,讓我受這麼大的苦!」這一下抱怨就是抱怨成這樣子。然後師父分析這種心態說:把佛法看成是做小買賣的,給你三塊錢,你給我三塊錢的菠菜;我供養了三斤香蕉嘛,等一會兒你要來加持。加持讓我發個大財。所以師父說:荒唐,這麼荒唐法! [02′29″]</p>
<p>   接著說:「<p> 對佛法的深厚的內涵都不清楚。<p> 」那我問大家:佛法的深厚的內涵,到底從哪裡去講呢?還記得剛才師父在講什麼吧?就是在講「業」。師父說:「<p> 這個業前面是非常的深厚的因緣。<p> 」講了「因緣」兩個字,說:「<p> 絕不是眼前的。<p> 」然後在前面又加上了一個:「<p> 我們把學佛法想成個現前的交易。<p> 」其實在這一段裡,師父在點醒我們:我們沒有生起前後世的概念,什麼都是用現世的角度在考慮,沒有生起這個生命的相續是一個不斷的過程;它是從此生趣往來世,現在所感得的結果前世是有因緣的。這樣的想法一旦沒有貫通,凡是有什麼事情發生的時候,都局限在此時、此刻、此人、此境這樣去觀察,所以他的生存範圍,還有思考的範圍、時間點都是非常狹窄的。 [03′41″]</p>
<p>   佛法深厚的因緣、內涵,它一定是拉到無限的過去到無限的未來這樣一個時間軸上,去看待這一個人生命所感得的這一切因,或者說結果,或者說苦樂。都是在一個很長的時間軸上去觀察這件事情,並不是就眼前發生什麼,就認為說是那個因。有在聽嗎?多半找因是要往前找的,不是說:「啊!剛才你說我什麼,所以我這什麼。」那只是一個勾起的緣罷了!更深的因可能在過往,可能在很久很久的一個過往。 [04′23″]</p>
<p>   師父在這裡邊更加深一點地揭示出我們沒有前後世的概念,就會這樣去抱怨。為什麼這樣抱怨就是沒有前後世的概念?那沒有前後世的這個概念到底會產生什麼呢?因為眼睛看著、耳朵聽起來,就是那個車子撞了他,他這麼劇烈的痛苦就是那個車子引生的。或者說:「欸!佛菩薩不是可以救,為什麼沒救我?」所以這是很眼前的思考。但是從很深遠的角度去觀察的話,那這件事到底是什麼因緣呢?在佛世的時候,一有什麼事情,弟子都去問:「佛陀,這是什麼因緣啊?」然後佛陀就講個過去的事情:為什麼會今生這樣呢?前世有什麼什麼事情,所以說這一生是這樣。所以根本不是局限在這麼小的一個時間點和範疇和人事物的角度上,去考慮這件事的。有注意到嗎?所以師父說的深厚的內涵,還有前面深厚的這個因緣的理解,一定是涵蓋了一個生生世世無限生命的前提在裡邊,然後才會談到深厚。 [05′33″]</p>
<p>   再聽下一段。 [05′36″]</p>
<p>   我所以特別講這件事情,因為一般普通人很多人會常常抱怨:「我學了佛,怎麼不靈光啊?」實際上,我去看那位同學,那位同學不但不抱怨,而且說:「啊!師父真對不起你,還勞你駕,這我業障很重啊!我淨了我的罪障啊!」那我聽了是非常讚歎!佛法本來告訴我們這是業,今天了解了這個業以後,應該清楚這一件事情的所以發生,跟眼前學佛不學佛是沒有關係,以前如果你造了這個業,這個業一定會感果。現在我們了解,造了這個因就感果,沒有感果之前這個業一定不會消失。 [06′33″]</p>
<p>   進一步來說,當這個業感果的時候,是不是同樣又要造業了?譬如說,我以前傷害過某人,那麼今天這個怨碰上了,我會被他傷害,這一點大家懂不懂?請問現在你被他傷害的時候,你採取什麼態度?通常情況之下,他來傷害你,我也不知道為什麼莫名其妙他傷害我,我會覺得:「咦!我也是好端端的,為什麼你今天要來這麼傷害我?」乃至於完全不知道,我們會不會抱怨?我想我們會抱怨。所以學了佛以後,告訴我們叫「觀業忍受」,到那時候我安心忍受﹔那這樣一來的話,前面造的業到此為止,你眼前不會再受。可是我們平常都是受不了,自己會抱怨,三字經一大堆。所以這個時候,一方面前面造的業到現在感果了,不錯,是不是那麼同時又造業了?同時又造業,然後呢將來再感果,所以永遠地輾轉,越纏越緊。 [07′47″]</p>
<p>   因為是基於「今勤瑜伽多寡聞,廣聞不善於修要」,後面師父講了這一段。我們就可以觀察,師父認為我們聽聞了之後,如果能在身心上有受用的話,那應該就是有修要;那麼修要最重要的業果見,在對境的時候就要現起。現起的時候,看!這個同學做的就是師父很讚歎他。去看那個同學,那個同學不但沒抱怨,還說:「啊!師父,真對不起你!還勞你駕呀,這是我業障很重啊!我淨了我的業障。」看他講的這些,真的是我們也要很讚歎啊! [08′25″]</p>
<p>   前一段時間有一個法師也是出了車禍,她幾乎也是對我說了一模一樣的話。她說:「老師,很感謝你接了師父的棒子,讓我在這麼辛苦的時候心有所依呀!」她心裡生起了滿滿的對三寶的感動,沒有去抱怨那個撞她的人。她被撞得已經不能走路了,很辛苦的,肋骨撞斷了好幾根啊,但是她沒有去抱怨那個人,也沒有跟我講她多痛苦,就是在表達滿滿地感恩哪!還講了她覺得透過這次車禍,自己對三寶的信心增加了,覺得她得到了三寶的加持。你看看,這麼痛苦的境!連醫生都覺得驚訝,她能夠這樣子脫險活過來。而且問她疼不疼的時候,她說不怎麼疼,醫生都感覺到非常非常驚訝! [09′18″]
<p>   師父說:佛法告訴我們這樣是業,所以清楚這件事所以發生是以前造那個業,在那個業沒有對治之前,它一定會發生。如果我們去了解這一切的話,認真地去觀察就會發現:實際上當很多不愉快的事情發生,我們不由自主地去抱怨別人或者抱怨環境,這個抱怨的來源是什麼呢?我們會認為是這個境或者是別人使我痛苦,不是因為我過去的苦因使我痛苦的。所以很顯然,一直是向外找造成生命痛苦的原因。一直是向外找的話,因為找錯了,所以這個因一直就拿不掉,拿不掉就一直痛苦。那麼佛陀來告訴我們這個道理,說這個苦果——現在感受的苦,是從不善生的,是從過去的因生的,淨化那個不善,就不會生苦果了;種下善因就會感樂果。一下子要說種下善因會感樂果,會不會說:「看那個人那麼善良,這一生好像也不怎麼樣,好像很倒楣的樣子。」我們又把它局限在此生去看,善因好像馬上就會感果,總是不能在一個前後世的相續裡邊看待因果成熟的這件事情。 [01′23″]</p>
<p>   在這一段,師父又再強調一下:我們到底能不能用那麼長的時間軸去看這件事的因到底是什麼?我們不習慣這樣向後去找,為什麼呢?因為都忘記從哪裡來。如果不學教典,不藉借教理之燈的照耀去看一下到底是什麼原因的話,我們是很難進行這種理性的觀察的。所以師父這個提醒,如果是你的話,你會不會覺得很困難?但是如果有居士做到了、有出家人做到了,那麼為什麼我就不能朝著這樣的思路去想呢?這樣去串習、串習、觀察、觀察久了之後,你這條思路就很熟了,熟了之後就會朝這個路去看。就像一條路你走熟了之後,你就會常常去走那條路,這是一樣的,思路也是一樣的。 [02′17″]</p>
<p>   在這一段讚歎了這個同學之後,師父又觀察說那個果成熟了,在成熟果的時候又繼續造業。造業的時候,師父說當我過去的比如說什麼原因,現在感得我被傷害;當我被傷害的時候,師父講了幾個字:「<p> 你採取什麼態度?<p> 」看了這句話,不知道大家怎麼想?「我採取什麼態度?」你會不會想:「我能採取什麼態度?有選擇嗎?」當我們感覺到自己被傷害之後,有幾種反應,有一種反應是什麼?直接反擊,對不對?因為那個傷害我的人,或者那個環境是什麼,我就反擊它就好了。有一種反應是感覺到傷心極了、絕望,就產生對自己的不諒解,或者對他人的不諒解。 [03′01″]</p>
<p>   但是這都不是一個積極解決問題的方式。積極解決問題的方式是什麼?就是我必須要知道:不可能是別人莫名其妙地傷害到我,所以我們還是去尋找為什麼?我應該採取什麼積極的態度改善生命?比如說當我同樣地還擊那個傷害我的人的時候,如果是懷著瞋心的話,那就造了很大的惡業,這個輾轉下去是沒有窮盡的。用這樣的方式去還擊,那我們還擊別人讓別人痛苦,別人會老老實實待著嗎?他會再還擊回來,所以你還會感到痛苦。這樣子你還擊我、我還擊你,你還擊我、我還擊你......,就是一個沒有窮盡的輾轉,越來越強、越來越強,就纏繞在這裡面。必須得有一方能夠理性地觀察,在對方強烈的態度和激烈的言詞下,怎麼樣拋開情緒的困擾,去看到事物的真正的原因。 [04′01″]</p>
<p>   看到真正的原因之後,我們或許是會感受痛苦的。在感受到痛苦的時候,我們會知道「這是我感受到痛苦了」,但是我們不會想去報復別人,我們會想到:在感受痛苦的時候,其實我也可以得到內心的成長,我也可以在這個時候訓練對真理的認知和熟悉度,甚至訓練我作師所喜。被傷害的時候,我能不能行善呢?我的心是不是被傷害了之後,就只能選擇報復、造惡業?我還是有另一條路?我還是可以行善,我的心還是自由的。萬一被傷害之後就永遠失去了飛翔的能力,癱在地上就只能造惡業,這就是很辛苦的。 [04′45″]</p>
<p>   師父在這裡面給我們講業的時候,我們會發現業是如此地靈動的一件事情,不是像一個釘子把你釘在那兒不能動,它是非常靈動的。為什麼?因為心是靈動的,聽了真理的召喚之後,就會自然地朝著那個可以飛翔的角度去努力試飛呀!像小鳥在試飛的時候,一開始牠都從一個高處好像掉下來一樣。牠媽媽帶牠飛的時候,有的鳥就從那個窩裡掉下來就在地上跑,好幾天你會發現:欸,花叢裡怎麼一隻鳥在那兒蹲著?牠長得很大,以為是一隻大鳥,看牠那個毛都鬆鬆的、絨絨的,黃嘴還沒有退掉,就知道這是一隻小鳥從窩裡掉出來。為什麼掉出來的?牠學飛,飛不上去了,就發現牠躲在花叢裡睡覺。當然牠媽媽還會來找牠,過幾天還要繼續教牠飛。有的鳥很快就飛了,有的鳥就好像學了一個多禮拜還不會飛。有的鳥學了好像兩個禮拜,然後發現怎麼還在花叢裡蹲著呀?最後牠還是飛起來了,因為發現牠在屋簷上蹲著了,就知道牠飛上去了。所以這有一個練習飛翔的過程。 [05′52″]
<p>   怎麼樣在自己感受痛苦的當下能夠不思緒迷亂,能夠頭腦清醒,能夠知道我感受痛苦的當下我不能造惡業?那麼不能造惡業的方式是什麼?比如說:不能口出惡言、心中不能出惡念,把這個控制好叫持戒,持戒就是得清涼嘛!後世就會有很多很多暇滿人身等等那些殊勝的果報在等待著我。所以我這一刻的堅忍,師父說:「觀業忍受」,這個忍不是只是一個忍耐痛苦不發作、徒勞的過程,它後面有一個忍辱的非常喜樂的果報在等我呢!並不是現在白白地痛苦就這樣就算了。 [00′42″]</p>
<p>   所以當我們常常去思考這些,就會激勵我們:當我們感受到被傷害的時候,我們先控制住不要去反擊。有的時候在彼此講話的時候,自己選擇沉默一下、憶念一下正念,不要對方傷害自己之後,馬上就還擊;沉默一下再想一想,再控制一下自己的憤怒,再一點點練、一點點練。有的時候會覺得這過程是很辛苦的,因為不習慣嘛!其實一開始練,哪怕一分鐘,能比過去多一點點的控制力,再控制兩分鐘、再控制三分鐘......,這都是非常了得的成績。因為馬上就火冒三丈,馬上就要出言傷害別人了,但這個時候都能控制自己。師父說這個居士在受了這麼大的痛苦下,他心中沒有瞋恨,他在感謝三寶,感謝三寶為什麼?他可能是感謝三寶、他能活著吧!能見到師父!善知識的攝受力也是很了不起的! [01′37″]</p>
<p>   在這個地方,師父說:「<p> 『觀業忍受』,到那時我安心忍受,那這樣一來的話,前面造的業到此為止。<p> 」就是不會再產生苦果了。如果你眼前不忍受的話,受不了再抱怨,前面的惡業感果之後又去抱怨、又去傷害別人,又覺得我這個惡業是別人給我的,而不是從我的苦因生的。又一次錯亂認識,然後我再錯一次!我認為是別人造成的,我打擊了別人,可是到時候我還痛苦啊,因為造惡業了,到時候又成熟為痛苦!所以這個週轉是沒有窮盡的。 [02′16″]</p>
<p>   那麼,怎麼能讓苦受停止,或者讓這個週轉停止?就必須用正確的方式來把苦因拿掉,我們就不會感到苦果,因為這個目標大家才來學佛。所以我們會發現,佛法會教導我們用清醒的理智來面對自心,不要成為情緒的奴隸。說得簡單,不要成為情緒的奴隸——傷心的時候就傷心、憤怒的時候就憤怒、沮喪的時候就沮喪,都是!但是關鍵這個感受來的時候,我們是否還有理性的、還有正念正知的觀察力在旁邊看著?雖然看起來是他傷害了我,我就成這樣了,但真正傷害我的是我過去的苦因啊! [03′00″]</p>
<p>   一旦我們慢慢地、習慣性地想到真正傷害我的是苦因,我們就會想法去淨化苦因,會去造集樂因、造集善因,這樣的話事情才能解決呀!對不對?才能夠解決。不然我們一直浮在表面上,跟那個外境、跟那個貌似來傷害我的人、跟他理論不停,我們根本沒有在真正的問題、真正的苦因和樂因的那個地方去下手解決問題的話,實際上很多痛苦就是這樣白白過了,無法達到沒有苦的那種生命狀態。 [03′38″]</p>
<p>   所以師父在這裡邊說:「一定要修要」,就舉了業果見。業果見是非常重要的見地,透視了我們二六時中所感受到的苦受,它真正的根源根本不像表面顯現的那樣,就是人、事、物困擾啊,不是像顯現的那般,它有更深刻的原因,是要追尋的。 [04′00″]</p>
<p>   所有的智者都是這樣說的:「是不善生起了痛苦,善因生起了快樂。」那麼不妨我們去實踐一下!因為按照我自己的方法已經這麼久了,也沒過得怎麼好,那麼不妨沿著佛陀的正見去思考一下自己生命的這些問題,可能會得到一個真正的解決。 [04′22″]</p>
<p>   至少這個居士遭受了這麼大的痛苦之後,他還擁有那麼強烈的感恩心;就像那位法師,她自己那麼感動,自己還能笑出來。看著她遭受車禍的人嚇得都笑不出來了,她自己還能笑出來,而且還是非常地開朗。在這麼強烈的一個傷害下,她還能不失開朗,這是一件很了不起的事情! [04′46″]
<p>   我們就來聽接下來這一小段。<p>   結果那位同學他覺得:「啊!這是我的業。」所以他不再抱怨。不但不抱怨,他還告訴我:「以前我學《廣論》,《廣論》上面說無常、無常,好像很有道理,可是對這個無常兩個字感覺得總滿輕鬆。我今天碰見了這個事情,才曉得無常是這麼個無常相!心裡真是膽顫心驚,誰都不知道我這個性命能不能保持到下面一分鐘。」他說他「啪!」一下子撞上去,人就昏倒了,根本一點都不知道,等到醒過來,已經很長一段時候在醫院裡躺在那裡了。他現在有機會醒過來,假定「啪!」一下撞上去給車子壓在他身上,他醒得過來嗎?醒不過來。所以他說:「啊!我現在才曉得無常原來是這個樣。」所以他不但不抱怨而且還感激。 [01′03″]</p>
<p>   這兩個差別大家分得清楚吧?我們平常遇到一點點事情就抱怨,講了很多道理。這個道理幹什麼?增長自己憍慢,然後還要造很多惡業,我們到底是學什麼啊?唉!所以我就深深地感覺到這個特點。這個叫什麼啊?相應,也叫相應。所以我剛才講那個相應,看看我們現在相應在哪裡?我們是相應在增長煩惱,還是我們相應在真正地淨除罪障、積聚資糧,這個對我們才是真正重要的。所以我但願我們在座的每一位同學學這件事情的時候,應該真正懂得這個。 [01′55″]</p>
<p>   師父在這裡重複車禍那個同學他的話,說:「<p> 這是我的業。<p> 」然後師父說他不再抱怨,不但不抱怨,還講了他對無常的一種覺受。在講到無常相的時候有兩個對比,還記得吧?第一個對比是什麼呀?「<p> 《廣論》上面說無常、無常,好像很有道理。<p> 」聽的時候應該是覺得很有道理,「<p> 可是對這個無常兩個字感覺得總滿輕鬆的。我今天碰見了這個事情,才曉得無常是這麼個無常相!<p> 」師父接著用了幾個字,說:「<p> 心裡真是膽顫心驚,誰都不知道我這個性命能不能保持到下面一分鐘。<p> 」 [02′56″]</p>
<p>   有沒有看到遇到這麼大車禍的這個同學,師父去看他的時候,他直接跟師父報告,好像是聞法的體會一樣,講了對無常的一種覺受。所以就出現了——平常聽來的時候是覺得滿輕鬆的,可是實際上真正遭遇到的時候是膽顫心驚。而且膽顫心驚到什麼程度呢?誰也不知道我這個性命能不能保留到下面一分鐘。我想那個居士把這樣的一個覺受報告給師父的時候,師父除了疼惜他之外,一定是很高興的。 [03′40″]</p>
<p>   師父從前面的抱怨說不再抱怨,而且集中在講無常的問題——前面在講業,現在講的是無常的問題。然後師父說「啪」地一下撞上去就昏過去了,如果車子壓在身上的話就醒不過來了,所以他說:「<p> 我現在才曉得無常原來是這個樣。<p> 」接著有一個心態,師父說:「<p> 他不但不抱怨而且還感激。<p> 」受了這麼大的苦和驚嚇,感激之情從何而生呢?大家可以想一想。 [04′24″]</p>
<p>   像我以前也聽到一個居士親口跟我說他也遭遇到車禍,他的車也是在路上走,走著、走著,也是被對面來的一個車不知道怎麼回事就把他撞得在馬路上一百八十度旋轉。他都不曉得怎麼回事的時候,就覺得:完了、完了!等到他自己心裡有念頭的時候,他在想:我現在是活著還是死的?我現在是中陰嗎?他睜開眼睛看看的時候,覺得都是空白狀。幸好他完全沒有受傷,但是他坐在車上是不能動的,沒法動。後來那個司機最先緩過來,他下車去看,那個車整個前端都被大車削掉了,所以他們的車就剩一半停在路上。後來因為這件事,他大概半年到一年都不太敢坐車,寧可用走的,萬不得已才去坐。車禍前一秒鐘是沒反應的,後一秒鐘就來了,所以無常的迅速啊,就是這麼可怕法! [05′35″]</p>
<p>   而對於他心裡所想的事情,如果那個時候沒有想到無常的話,多半無常到來的時候,就像師父用那幾個字,是極度地膽顫心驚的,因為很難應付啊!在這麼強烈的一個對境下,有認真修學佛法的人,他在這個時候就提起了他的正念:這沒有什麼好抱怨的,這就是生命的一種現狀,那叫無常,以前只不過我還沒有遭遇它、我還沒有反應它罷了。 [06′08″]
<p>   師父接著幫我們分析了一下說:「<p> 這兩個差別大家分得清楚吧?<p> 」那我先問一下是哪兩個差別呢?就是抱怨和什麼?和法相應。師父說:「<p> 我們平常遇到一點點事情就抱怨,講了很多道理。這個道理幹什麼?增長自己憍慢,然後還要造很多惡業,我們到底是學什麼啊?<p> 」注意這一段喔!我們平常遇到一點點事情就抱怨。這一點點事情都是什麼呢?跟這麼大的車禍的事情比起來,肯定是芝麻綠豆的事情:人與人間的摩擦呀,甚至是誰多幹了點活、誰少幹了點活,誰臉色不好......,都是這些摩擦。碰到這點事情的時候,心裡的波濤就起來了,不再平靜。不再平靜幹什麼呢?就抱怨。尤其是學法了之後,因為總得講原因嘛,抱怨的時候還要講出很多道理。這個道理肯定都是說對方的,或者說自己所在這個環境不好的,所以才讓我自己感到痛苦,或者事情才出了錯誤,都是由於這些等等、等等的原因。 [01′22″]</p>
<p>   講了很多道理,這些道理到底有沒有去除自他的痛苦呢?有沒有讓問題得到解決,而且也讓事情朝著好的方向去發展呢?看起來都沒有,只是做什麼了呢?增長了自己的驕慢。因為所學的道理拿來說別人,成為抱怨的一個理由,所以增長了自己的驕慢。驕慢是苦因啊!師父接著說:「<p> 然後還要造很多惡業。<p> 」師父說:「<p> 這也叫相應<p> 」,相應什麼呢?「<p> 增長煩惱!<p> 」 [01′55″]</p>
<p>   前面那個人遇到了這麼大一個事情,他心中現起的是這個,趕快跟師父報告他心裡有什麼什麼狀態。而平常沒遇到什麼事情的修行人,卻一點點事情就朝外面去觀察過失或者找別人的麻煩,所學的法都拿來做所謂的照妖鏡了。師父就是在讓我們分得清楚這兩種聽法後的差別,一個是增長煩惱,另一個是淨除罪障、積聚資糧。師父說:「<p> 這個對我們才是真正重要的。<p> 」聽完之後在對境的時候要做這兩件事,就是淨除罪障、積聚資糧! [02′47″]</p>
<p>   師父接著說:「<p> 我但願我們在座的每一位同學學這件事情的時候,應該真正懂得這個。<p> 」學了經典之後,應該懂得不要拿經典的高度去到處繩人、到處抱怨。沒學佛前就抱怨,學了之後也不太容易改,還是遇到境就抱怨;甚至有的人從年輕的時候抱怨到年齡很大的時候,好像一輩子都在抱怨,好像毛病滿嚴重的。但是師父說:我們都在學嘛!學了之後開始改就好了。 [03′25″]</p>
<p>   抱怨的毛病怎麼改呢?有事情發生的時候,你會看到自己心裡不寂靜,或者起瞋心的那一面。看看都是責怪外境、責怪其他人呢?還是內心也有覺察自己的部分?這部分只要認真地意識到什麼是抱怨的這種行相,當這個毛病又來的時候,自己要知道:哇!來了、來了,又開始了!一個是嘴上抱怨,一個是心裡抱怨,還有一個可能動作上有抱怨。那麼我們可以慢慢地,或者很快地改掉這種習氣毛病,為什麼?因為會造惡業呀、增長驕慢哪!對自己和他人一點好處都沒有。 [04′07″]</p>
<p>   如果我們周圍有一個常常抱怨的人,比如說一個團隊,整個團隊的氣氛大概都會有點低迷或者很不愉快。可是如果遇到事情之後,大家都來看自己的問題,然後互相幫助,用一種至少是非常禮貌的狀態來對待他人的話,那這個團隊的工作氣氛也會很愉快的。 [04′30″]</p>
<p>   我們無始劫來向外看,把所有痛苦的根源都歸結為境那方面出現的,而跟我的心關係不大、跟我過去所造的業關係不大,尤其是跟我的過去生好像沒什麼關係。我們看什麼問題都局限在此生此世的某一個時間點,甚至縮小在剛剛發生的事情,就從剛剛發生的事情到現在這麼短的距離,去計算一下那個人錯在哪裡。我們沒有從無限的過去到現在、到未來這樣的一個時間軸,去看待自他的生命所起的所有衝突或者所有的不如意。我們不習慣這樣看,所以常常擷取那一小段就給它下定義,而且是習慣性地去評判。 [05′19″]</p>
<p>   一旦我們聽佛法開始意識到這個問題的時候,我相信每一個同學都想積極地改善,為什麼呢?因為這並不愉快!一個抱怨的人快樂嗎?不快樂。抱怨的心情鬱悶嗎?鬱悶啊!憤憤不平嗎?不平呀!他覺得周圍的人對他好嗎?不好!好為什麼要抱怨?就感恩了!那麼對他現在擁有的一切感到滿足嗎?沒有啊!珍惜嗎?可能也沒有。因為這一切都如此地不如意,而且大家好像都不努力、都不改善,所以好像滿苦命的,就是一直抱怨。因為我們生命的苦樂都操縱在其他人的手裡,所以我們用抱怨別人的方式試圖能夠心情好一點,或者希望別人能夠改善,我的生命狀態會好一點,甚至說我抱怨你其實是出於善意。總之會有種種的理由,我們給抱怨很多條支撐它的柱子,讓這個抱怨的習氣能夠延續下去。 [06′21″]</p>
<p>   但實際上師父說:「<p> 遇到一點點事情就抱怨。<p> 」這一句話就這麼幾個字喔!「<p> 我們平常遇到一點點事情就抱怨。<p> 」這句話師父在這裡講了,但是我們怎麼樣能夠把這句話放在自己身上觀察一下?什麼是一點點事情?然後就抱怨了嗎?抱怨的行相是什麼?在心裡出來、在眼裡出現、在口中出現、在自己的動作中出現。然後我講道理了嗎?講了什麼道理?講這些到底幹什麼呢?我們會認為用這個道理說服別人,甚至規勸別人行善,世界會從此和平,我們大家會過得很安樂。師父說:「增長自己驕慢。」觀點都跟我們感受的是相對的!我們會覺得這樣的話大家都會造善業了,我用抱怨的方式規勸別人或者解決問題的話會很好。師父說除了增長自己驕慢,「<p> 然後還要造很多惡業,我們到底是學什麼啊?<p> 」這句話是反問自己的。就像我現在反問:「我在學什麼呀?」 [07′27″]</p>
<p>   我再說一遍:「<p> 我們平常遇到一點點事情就抱怨,講了很多道理。這個道理幹什麼?增長自己驕慢,然後還要造很多惡業,我們到底是學什麼啊?<p> 」 [07′46″]
<p>   師父在這個居士感人的故事裡,讓我們照見我們自己的現行——平常遇到點事情就抱怨,生命很苦澀的這種狀態,透過師父給我們講的法,意識到這是自己的一個習氣、一個可能需要改善的習慣。那麼你咬牙切齒,從早晨開始就想:看我今天遇到多點兒事情(註 1)。首先要觀察!其實當我們遇到一點點事情的時候,我們不會覺得那是一點點事情,我們會覺得這事情非常大!然後就開始了。 [00′39″]</p>
<p>   那麼怎麼樣覺得這是一點點事情呢?生死事大,無常迅速!如果不念及無常、不念及後世的苦樂,那麼眼前出現的所有事情都是非常大的,因為眼前的這一天的事也很大;可是它和無量生的未來比起來,可能就顯得小多了。比如說飯菜合不合胃口呀?人家有沒有跟你說讓你聽起來很悅耳的話呀?或者說禮尚往來,你送了他、他忘了送給你了等等,這些心裡邊常常起起伏伏的事情,能不能覺察到它是朝著抱怨的方向,甚至在思想那一步是朝著抱怨的方向去思考的?能不能自己先觀察到?觀察到了,就直接給它下定義:這樣抱怨的想法只會增長驕慢,而且造惡業,對我的生命沒有任何好處,對他人的生命也沒有好處。那麼為什麼我不停止這種方式呢? [01′42″]</p>
<p>   所以,這位居士在這場車禍中,他生起了感激的心,在這樣一個很可怕的災難中,他居然生起了感恩心,他沒有抱怨。我前幾節課跟大家講的法師也是這樣的,她也遭遇到很大的車禍,她也是生起了感恩心,說:「能活一天都要好好地感恩三寶!」所以她在養傷、在病床上,乃至能脫離輪椅下地走路的時候,她就錄了一個錄像給我看。大家可以想一想:能走路了!懷著多麼深的感動。可是我們現在對我自己能走路還會很感恩嗎?都覺得這些事情司空見慣的,沒什麼可以感動的。能吃上飯,感恩嗎?也沒有感恩心!衣、食、住、行這些都無憂,感恩嗎?有法可以學,甚至想要看經典的時候有燈,這些事都感恩嗎?可能一切都司空見慣,心裡慢慢地就麻木掉了,好像這些都是無因生的、本來就有,而且永遠不會消失一樣。 [02′55″]</p>
<p>   師父透過每一個例子,都在讓我們把注意力觀察到我們的內心,去抉擇我們所學習的教理。因為真正的修行一定是建立在我們的內心深處,不是讓我們上來就是評外境的,一定要是看內心。所以這裡邊的重點就是:不要遇到一點小事情就抱怨,如果我不知道我有這個毛病,是沒法改的。那麼我如何知道一點點小事情心思就朝著抱怨的方向去呢?那觀察一下自己嘛!甚至做一個簡單的紀錄:今天什麼事情出現了,欸!我又想什麼了?記錄一段時間之後,你再看一下筆記就發現:奇怪!第一天遇到這事情,第二天、第三天遇到不同事情,我的心好像都是朝著那個方向。一週的話,看一個簡單的紀錄,你就可以知道:原來都是朝那個方向——就是抱怨的方向!那麼你就可以扭轉它了。 [03′51″]</p>
<p>   記錄一段時間再往回看的時候,就會發現還是有一些變化,甚至變化很大的。像僧團的法師們常常堅持寫觀功念恩日記,有的是寫厚厚的好多本,有的是從小沙彌的時候就開始寫。你會看到他說開始先觀察旁邊的小朋友,就從借個橡皮呀、借個尺子啊,這樣的事情開始感恩。然後說教務法師怎麼約談我、關心我,然後感恩。慢慢地、慢慢地就發現這個出家人,在常住裡他就會看到越來越多他值得感恩的事情。然後他就跨越了他的班級,然後跨越很多班,甚至看到常住很多大的法師。在他並不是很了解大法師在做什麼的時候,他能從眼前的這些好像看起來星星點點的事情裡,看到我現在有這樣的順緣、能學法的福報,實際上是很多很多人的奉獻成就的。一旦一個人活在很多人的奉獻之中,並且用他的心真實地感受到這一點的時候,其實怎麼生驕慢啊?因為我們的一舉一動,我們的衣、食、住、行,都是很多人的奉獻,所以只有好好學法去報恩了。這句話說起來就是這樣、是很容易的,但是要把它做到,真的要下一番功夫! [05′12″]</p>
<p>   講到這裡的時候就真的很感恩師父,他那麼了解我們,那麼了解我們的習氣毛病,然後又給我們指出當下一步要怎麼辦。而且指出兩個方向:一個是抱怨的,一個是什麼?感恩的;一個是遇到境界就開始拿法去講道理、增長驕慢的,另一方面就是遇到這麼大的事情,看!「喔!原來無常是如此地膽顫心驚!」跟那個輕輕鬆鬆的形成天壤之別。所以從這樣對比的角度,讓我們看到:輕輕鬆鬆所感受的無常,和真正地體會到一點點無常的樣子的時候內心的強大的一個轉變。也看到了我們在最痛苦的時候,信仰對我們的支撐力。 [06′01″]</p>
<p>   所以能遇到這樣一位善知識,如此細心地呵護著我們的三業,一步一步地帶著我們在修行的路上,像學步一樣一步一步帶著我們走,真的是太幸運了!對此我覺得我們真的應該懷著感恩和萬分珍惜的心情,把師父講過的法、把《廣論》好好地、認真地聞思,然後用在自己的身心上,聞、思、修,用在自己的身心上。 [06′33″]<p>   (註 1:「多點兒事情」指小事情,整句話指觀察今天自己遇到的事情其實都是一些小事)
<p>   我們再接著聽一段:<p>   所以在這地方,修行本來是要把我們學的道理要去跟它相應,可是現在呢?「多寡聞」。要修行一定要懂得道理呀!我們現在懂得了很多道理,如果說不能真正在跟它法理層層深入,只有停滯在增長煩惱、憍慢上頭;反過來,假定我們能夠不停滯在憍慢這個上面,我也一定能夠真正地深入。這兩者當中,沒有什麼第三條路。有很多人糊裡糊塗,那根本不相應,這也是白浪費時間。這是一種,所以「今勤瑜伽」的呢,很不幸,不了解道理! [00′50″]</p>
<p>   這一小段大家熟悉嗎?師父講了幾條路啊?「<p> 沒有什麼第三條路<p> 」,對不對?沒有什麼第三條路,是幾條路啊?兩條路。哪兩條路呢?就是「<p> 修行一定要懂得道理呀!<p> 」對吧?因為修行本來就是我們學的道理要去跟它相應,「<p> 可是現在呢?『多寡聞』。<p> 」就不行了,因為修行要懂道理。然後「<p> 懂得了很多道理,如果說不能真正在跟它法理<p> 」,注意!「<p> 層層深入<p> 」。這個「層層深入」,就好像一個宮殿,我們從大門進去,然後一個一個門越來越深,就會看到宮殿裡邊的莊嚴,或者每個大廳的富麗堂皇,層層深入。然後師父說:如果不能在法理上層層深入的話,只有停滯在增長煩惱、驕慢上面。沒深就會停,停了就會增長煩惱、驕慢。 [01′54″]</p>
<p>   反過來,假定我們能夠不停滯在煩惱、驕慢上面,我們也一定能夠深入。「<p> 這兩者當中,沒有什麼第三條路。<p> 」哪兩條路?要麼不能深入,停了!停了就是停在那兒什麼都沒變嗎?不是這樣的,對不對?停下來的時候,依舊沿著老習慣增長煩惱、增長驕慢;如果我們沒有停,我們能夠真正地深入的話,那就不會增長煩惱、增長驕慢,而是什麼呀?如法地淨除罪障、積聚資糧。師父說只有這兩條路! [02′35″]</p>
<p>   大家可以看到師父對修行的觀點一向都是這樣的,說:要嘛修信,要麼就是沒有信心。不可能有個中間的路線!說:學習像逆水行舟,不進則退。對吧?修行也是啊!為什麼呢?因為我們無始劫來薰習的這個煩惱習氣它是非常非常強的,也是非常熟練的。因為我們心一定要對境啊,眼、耳、鼻、舌、身都要對境,對境它不可能沒有反應,我們不是木頭人,一定有反應。反應的時候,如果不會正確的反應,一定會錯誤的反應;或者說如果你不會像經典上那樣如法的反應,那就會用老習慣來反應它。所以增長驕慢、增長煩惱和淨罪、集資這兩個方向,要嘛它、要嘛它,沒有第三條路! [03′24″]</p>
<p>   那麼為什麼師父會這樣告訴我們兩條路,就是讓我們選擇,對不對?為什麼我們會選擇要費這麼多辛苦聽聞和修行?因為我們已經受夠了煩惱的折磨,也受夠了自己對付煩惱的各種方式,我們會發現都不靈,自己生存得還是很不理想,所以我們才求教於智者,求教於三寶、善知識。然後用這樣的教理看一看我解決問題的方式,甚至是我觀察問題的方式到底對不對?沿著我原來那個方式觀察的觀點,我的生命沒有什麼改善;現在學了教理之後,我用教理的方式,注意!用教理的鏡子來照自己的心、照自己的行為,然後去改善它,如果這樣的話,就不會糊里糊塗了。 [04′23″]</p>
<p>   因為我們終究會明了自心,每一天從每一件事上明了。這件事出現的時候:「啊,我又開始抱怨了!」抱怨到一半突然想起來了:「我是不是又在抱怨了?」自己問一下自己。如果意識到自己又抱怨了,那能不能有力氣停下來,還是已經像洪水一般停不下來了?那麼過後可以知道那是抱怨嗎?可以去跟聽自己抱怨的人表示一下歉意嗎?從這樣的角度來切入學習《廣論》課後的鍛鍊的話,這會是我們自心之旅的一個非常驚訝的發現。一旦我們把注意力集中到內心的時候,其實我們也沒有那麼多時間去滑手機呀,去看著各種各樣重複性很高的事情,因為新聞每天是看不完的,全世界這樣、那樣的事情也是看不完的,但是實際上我們心裡的事情也是看不完的。 [05′20″]</p>
<p>   如果能把注意力集中在內心去觀察,就是心裡的擾動或者不擾動,我們都去觀察擾動的時候什麼樣、不擾動的時候什麼樣。就像在海邊撿貝殼,一個浪沖上來,有的時候就沖上了一些好看的貝殼,但是如果帶著沙子的話,那個水和沙子一起出現,你是看不到水裡邊有漂亮的貝殼的。一定等那個浪退去,水慢慢平靜之後,你會發現:欸!這個清清的海水裡邊有漂亮的貝殼。所以每一個生命的浪沖過來的時候,我們到底是只能看到泥沙,還是能夠收穫寶物?像大海可以出生很多寶物一樣,修行可以得到非常精美的經驗和喜悅呢? [06′06″]</p>
<p>   不管我們遭遇的是什麼事情,我們是否能在正在遭遇的這件事上像找到寶一樣?這個心裡一定要用觀察力,讓自己翻滾情緒的那個浪平靜。怎麼讓它平靜呢?深呼吸是一種辦法。還有當你注意到:「我在生氣、我在悲哀、我在非理作意!」當有一個正知力現起的時候,其實朝向負面的那個東西它就會有一定的遏制力,關鍵是要覺察,覺察到自己生命的一個方向,也就是思想的方向到底是怎樣的。所以師父說有兩條路,就是苦、樂嘛,一個走向解脫,一個如果不回頭,就是走向無盡的輪迴。 [06′50″]</p>
<p>   所以還是很感恩師父啊,在第二輪的《廣論》裡,把如此好像很難琢磨的一個道理,用這麼直白的語言講給我們聽。而且把真理嵌在一個這樣怵目驚心的例子裡面告訴我們,說真正體會到的時候它的心態是那樣的;沒有體會到的人,芝麻綠豆的事就抱怨個不停。這兩者的差別,我們心裡自然有一個天秤去秤量一下。 [07′20″]
<p>   好!我們再來聽一段。<p>   那麼正規地來說,剛開始應該廣學多聞,不幸的是「廣聞是不善於修要」,學了很多道理呢,修行不善巧。本來是應該懂得了很多道理,然後呢,照著道理去努力地行持。這個努力行持也並不是等到我念完了再哦,剛開始時已經講過,當我們在學的過程當中,隨分隨力。那也許說:「我現在還沒有懂,怎麼叫隨分隨力?」雖然書本上、理論上不太了解,可是周圍是不是每個人都有——從家庭當中的父母,到兄長、到師友,那他們多多少少會告訴我們。我們應該隨分隨力地在這個圈子裡當中,接受好的這種概念,儘量地把那個壞的漸漸地淨化,這是我們做得到的。特別是學《朗忍》這樣的一個教授,後面非常強調這個特點。那我們能夠做到了,就漸次能夠改善增上,如果做不到,我們始終會停滯在那錯誤的階段。 [01′22″]</p>
<p>   那個錯誤的階段,下面就說:「觀視佛語多片眼,復乏理辯教義力。」我們對於佛告訴我們的話,先我們根本不知道﹔就是知道了,學到了以後——多片眼,我們從一個角度去看。實際上佛要告訴我們的是一個無限地廣的一個面,或者是我們根本沒學到,或者學到了我們會停滯在我們自己這個階段,所以對這件事情看不清楚。 [01′59″]</p>
<p>   這一小段我先提幾個問題,第一個問題是:師父說「<p> 正規地來說<p> 」,正規地,剛開始應該做什麼呢?四個字,叫「<p> 廣學多聞<p> 」,正規地學習佛法。但是接著話鋒一轉,「<p> 不幸的是『廣聞是不善於修要』,學了很多道理<p> 」,接著怎麼了?「<p> 修行不善巧。<p> 本來是應該懂了很多道理<p> 」之後「<p> 照著道理去努力地行持。<p> 」接著又說這個努力行持也不是等我全部都學完了我才開始,然後師父就引出了下面的觀點叫「<p> 隨分隨力<p> 」。 [02′46″]</p>
<p>   注意喔!這裡邊揭示出:第一個是剛開始要廣學多聞,對不對?剛開始的時候有一個麻煩,就是「今勤瑜伽多寡聞」那個毛病在那兒候著。然後開始能夠學很多之後,又有一個毛病叫什麼?不善巧修行——懂了很多道理,應該照著道理去修,可是卻「廣聞不善於修要」。第二個又攔住了! [03′07″]</p>
<p>   那麼我們修要的時候,是不是等到所有的法都聽完了再去呢?師父說不是這樣的,隨分隨力就可以了!那有人又說了:「如果隨分隨力的話,我都沒懂,我怎麼隨分隨力?我都不懂呀!」然後師父說:雖然經典上、理論上的還不太了解,就是不是很透,可是周圍——師父提出了這個觀點——每個人家裡邊都有父母、兄長、師友啊!提到環境了。這裡說了一個什麼道理?除了從經典上學,還有從哪裡學啊?從周圍的環境上,父母、兄長,然後到師友,說:「<p> 隨分隨力地在這個圈子裡。<p> 」注意!下面的抉擇點,那我們在這個圈子裡要做什麼呢?接受好的這種概念,盡量地把壞的漸漸地淨化,而且師父接著說:「<p> 這是我們做得到的。<p> 」「<p> 特別是學《朗忍》這樣的一個教授,後面非常強調這個特點。<p> 」 [04′05″]</p>
<p>   在這裡完全是在講「今勤瑜伽多寡聞,廣聞不善於修要」,在「不善於修要」這個部分,說道理沒懂,那麼我們依靠的是周圍的善友,對吧?師長、父母、同行,依靠這個環境。那麼依靠這個環境做什麼呢?就是接受好的這種概念,把壞的習慣慢慢地淨化。請問什麼是壞的習慣?很多、很多!但是從上面我們聽下來的時候,師父主要講的這壞的習慣是不是抱怨?好的習慣是什麼呀?跟著教典然後來修行,比如說對父母親也不要抱怨,對師長、對同行、對兄弟都不從抱怨的角度,師父說這個是我們隨分隨力可以做得到的。 [04′51″]</p>
<p>   講到這裡,我們就觀察一下:我們對一個家庭、對一個事業單位、對一個團體......,請問我們的觀點是從抱怨的角度去的,還是從淨化自己的業障、增長自己資糧的角度去觀察的?如果開口就抱怨,反映了我們對這個問題的觀點,對不對?就是我們的一個習慣,它是沒有淨化的習慣。如果是這樣的話,學了這點,其實我們可以看一看,看一看周圍的人有誰在抱怨?你要不要學?要不要學?「有道理呀!他的抱怨跟我一樣啊!我們倆是好朋友,我們有事沒事就在一起喝杯茶、抱怨一下,把家裡的、單位的、團體的所有事情都抱怨一下。」而且抱怨完了還要傳遞給更多的人,大家都覺得這是合理的。師父在這裡明顯地已經指出這種抱怨只會增長驕慢、造很多惡業,不會讓我們這個家庭或者事業、團體能夠走得更好。 [05′56″]
<p>   一定要接受好的這種概念!你接受的訊息要學會去揀擇,因為這裡邊已經涉及到向周圍的人學習,對不對?向周圍的人學習,你吸收什麼樣的觀點,可能會變成什麼樣,對不對?比如說從吃有機和不吃有機的角度、從你的健康的角度,有的時候像分水嶺一樣。思想也是,要接受什麼?無毒的思想、有機的思想,然後把那個有毒的思想去掉。從這樣一個觀點來看,處處師父都在教我們抉擇。 [00′32″]</p>
<p>   當我們有一個疑問出來:「欸,一開始修行要怎樣啊?」不能閉門造車,要廣學多聞;廣學多聞之後,不能不善巧,要結合自己的內心來修行。沒懂那麼多,怎麼修行呢?隨分隨力!你懂了的這些,也可以修行。那麼跟周圍的環境學習的話,會聽到很多很多的概念,怎麼辦?接受好的概念,去改掉壞的毛病,不是照單全收。尤其是抱怨這件事情,不能像傳染病一樣,一個傳一個、一個傳一個。因為抱怨不會讓這個世界變美,不會讓家庭變美,也不會讓自己的心變得清涼,所以這是我們需要改善的。 [01′10″]</p>
<p>   這一點,實際上師父也在指出我們待人接物,還有我們看待很多事情,到底從什麼樣的一個出發點去看待?是從一個大家都在改善、有希望的角度,還是說現在越來越糟啊、什麼什麼......因為我的心是灰色的,所以我看出的世界也是沒有希望的,充滿負能量的言論,只要一張嘴,負能量就很多很多? [01′35″]</p>
<p>   所以從我們看事情的觀點,可以觀察到:師父提醒我們的點,是不是接受好的這種概念?「<p> 儘量地<p> 」——師父用一個「儘量地」——這裡邊也有一種寬容,也有一種什麼?要督促大家努力喔!努力!「<p> 儘量地把那個壞的漸漸地淨化<p> 」,用了一個「淨化」,而且說:「<p> 這是我們做得到<p> 」。師父說:這是我們做得到的,尤其是學習了《朗忍》這樣的教授,後面是非常強調這一點。那我們能夠做到了,就漸次能夠改善增長。注意!如果能夠做到了,一切都慢慢改善;如果做不到,我們就始終停滯在那個錯誤的階段。什麼階段呀?你可以說:「今勤瑜伽多寡聞,廣聞不善於修要」,也可以說什麼?抱怨、我慢!發生了事情之後永遠都採用抱怨,都說別人的不是;沒有看到自己生命裡的問題——自己的心裡是有苦因的,要把那個苦因拿掉,這一切不如意才會變成另一個樣子在我們的生命裡出現。 [02′47″]</p>
<p>   我再強調一下:雖然這一小段在講「廣聞不善於修要」,如何去修要的起點,就是在我們平常每天的生活中,就可以修鍊自己了。怎麼修鍊呢?一定要接受好的概念,盡量地把壞的習慣漸漸地淨化。比如說:孝順父母,恭敬兄長,朋友交要有誠信,對待善知識要修信心等等,它都有各式各樣的標準在裡邊。這個標準就是一個好的概念,所謂的限度、界限,過了這個限度,對你自己、對他人都沒有好處的。 [03′25″]</p>
<p>   學了這一小段之後,今天聽了,明天到單位去,或者明天在家裡邊,你特別特別愛對他抱怨的那個人,就可以觀察一下你的心有沒有要改善的趣向?從一個家庭到一個事業單位、到對一個團體、到對整個的世界,我們的看法是從抱怨的角度去的,還是從改善它,從我的內心積極的角度去的?可以明晰地看到在我內心中我是如何選擇的。注意!選擇趣入,不是不得不趣入!我們是有主動權的,因為我們知道了那樣走的結果和這樣走的結果,如果我不想要得到那樣的結果,那麼我就不要從抱怨的角度去;要積資、淨懺的話,那麼就改變自己,讓自己的內心和法相應,層層深入,拿法來照自心,去觀察、修鍊自己。就是不要在那些每天發生的一點小事上去抱怨,而是從發生一點小事那個地方,做什麼?用法鏡數數地來照自己的三業,尤其是照自己的思想朝什麼地方去的。 [04′39″]</p>
<p>   師父說:「<p> 這是我們做得到的!<p> 」我這句話重複三遍了。「這是我們做得到的!這是我們做得到的!」給自己打氣,不要沒出門就說自己一定會輸。尤其是師父說學習了《朗忍》這樣的教授,後面整本書都在強調這一點,那我們如果能夠做到的話,就漸次地改善、增上;如果做不到就很悲哀,就會停滯在那個錯誤的階段。停滯在那個錯誤的階段就等於停在痛苦的階段,我們生命的狀況是沒法改善的。師父是期待我們能夠積極向上地面對生命所有的挑戰,「<p> 佛子雖逢難,善增罪不生<p> 」! [05′20″]
<p>   所以因為前面這種情況,不是偏於這個,就是偏於那個,所以在這種狀態當中,產生種種的缺陷。所以說「觀視佛語多片眼」,對於佛的道理都沒辦法得到完整的認識,都是殘缺不全的。所以佛在世的時候,就告訴我們一個最好的指示啊!平常我們像瞎子摸象一樣——是的,我們是摸到了象,那時候我們應該有一個認識是摸到了象,可是我們畢竟是瞎子,摸到一部分哪!千萬要想辦法多體會、多聽聞,了解全貌,不要執著自己,這個是非常重要的。 [00′55″]</p>
<p>   這一小段已經進入了「<p> 觀視佛語多片眼<p> 」。師父在這一段講的,大家可以觀照一下自己:有沒有考慮過我們的內心要嘛偏於這個、要嘛偏於那個?就是有某種執著,或者偏於自己的感覺,或者偏於自己的經驗。那麼這種現行的狀態,要對到佛語、對到經典的話,會不會都沒有辦法完整地認識?師父說:「<p> 都是殘缺不全的。<p> 」所以師父說:「<p> 佛在世的時候,就告訴我們一個最好的指示!<p> 」其實這應該是個故事,但師父說是一個最好的「指示」,這兩個字喔!那麼指示什麼?說:「<p> 平常我們像瞎子摸象一樣<p> 」,是摸到象了,可是是摸到一部分哪!這個部分要怎樣在內心中找到相應的點呢? [02′06″]</p>
<p>   關於自己對事物的探索就像盲人摸象一樣這點,實際上我們對自己的感覺、很多事情,並不覺得我們是盲目的,對不對?我們會覺得我們眼睛是雪亮的,我看到的可能才是事情的真相、才是事情的原貌。是這樣嗎?為什麼?因為我眼睛看到了、我耳朵聽到了,就我所蒐集到的信息,我們得出的結論,我們會認為應該是這樣的結論。但是,師父說:「<p> 佛在世的時候,就告訴我們一個最好的指示<p> 」,而且那指示前面還有個「最好的」,就是盲人摸象這件事。 [02′50″]</p>
<p>   所以,這個「最好的指示」是什麼呢?居然是盲人摸象。盲人摸象提醒到我們什麼?就是我們摸到一部分。摸到一部分就罷了,把這一部分當一部分理解就可以了;可是我們偏偏會認為什麼?大象是柱狀的吧!大象是細長的吧!如果摸到耳朵,那大象就是那種形狀了!所以我們就會用自己感受的那一小部分,以為全部都是這樣的。用《攝類學》辯論的話就是:有顏色是紅的,對不對?那是顏色都是紅的!只要一部分是這樣,那全貌都是這樣的。 [03′32″]</p>
<p>   這個「最好的指示」很難記住吧!也很難認識吧!大家覺得呢?我怎樣能夠認識到我對事物的認知是片面的呢?舉個最簡單的例子:對境的時候,我們的內心有沒有生起三主要道的證德呢?如果沒有的話,那部分是不是缺失呢?再退一步講,不要說那個證德,對境能不能現起正念呢?如果沒有正念的話,是不是對事物認知的一種缺失呢?再說一個,凡是存在的,上面都有空性,對吧?都有個無自性的道理。但是無自性的真理、真諦,在凡夫的眼、耳、鼻、舌、身、意上,在境界上能夠顯示出來、能夠洞悉到嗎?是很難的,對不對?比量上證得也是不太容易的。 [04′28″]</p>
<p>   所以我們就會發現:當我們面對到佛法的時候,無論是教量還是證量,我們所不知道的、心內沒有現起的、思路上沒有推理出來的東西太多了!包括如是因結如是果,包括前生後世。我們用什麼樣的理路去證得前生後世一定存在、因果一定存在?因為有這樣的前生後世、因為有這樣的因果,所以我大乘發心,生生世世積聚資糧,可以修出來菩薩行。因為我們的心續是可以因為緣起改變的緣故,所以苦因才會被消滅。如果是自性成立的話,那麼苦因將沒法消滅。所以就我們所看到的、感覺到的、思考過的東西,跟佛陀的一切遍智他所看到、思考的、感覺到的東西對比的話,那我們很多很多幾乎都是看不到的。所以從這樣的角度上,比擬說有如盲人一樣,對不對?看不到的。我們看到的那個地方就是黑暗。 [05′33″]</p>
<p>   師父在講到這個公案的時候,居然是說:「<p> 告訴我們一個最好的指示啊!<p> 」指示後面還有一個「啊!」是很語重心長的呀!所以接下來師父說:「<p> 千萬要想辦法多體會、多聽聞,了解全貌,不要執著自己,這個是非常重要的。<p> 」還要「千萬要想辦法」。這一般是特別特別關注我們的人,發現我們遇到困難了,跟我們在一起討論的時候,「千萬要想辦法」,怎麼樣啊?居然是「多體會、多聽聞」,注意!「了解全貌」,後面還有一句「不要執著自己」。 [06′25″]</p>
<p>   為什麼我們就感受到的部分、聽聞到的部分,那一點點東西就當成全貌?就是執著自己所了解的部分。如果在很多的對境上,我們能夠憶念起師父在此處指出的:「<p> 我們一個最好的指示啊!<p> 」意識到自己有可能會看到事物的局部,並不了解全貌。如果在每一個當下的緣起點上,比如某人為什麼這樣對我?我們只能想到前幾天或者幾個月、或者多少年前的事,前生前世的事情我們是想不起來的,幾乎很少想;以前的因是什麼呀?很少去想的,幾乎就是不現見的部分,那麼對我們現在所做的事情、所感得的結果,我們也是很難去看到的。 [07′14″]</p>
<p>   所以看不到的真是太多了,太多太多了!正因為如此,所以我們才想法多體會呀!比如你看不到的怎麼辦?你想法用各種辦法、多一點的渠道去了解,然後要多多地聽聞教言——佛菩薩的教言,要了解全貌。而且很重要的一點,就是不要太執著自己已經學會的、已經感覺到的,或者你以為自己已經有的東西,不要太執著!因為我們有的可能不是全貌。 [07′54″]</p>
<p>   為什麼我們就感受到的部分、聽聞到的部分,那一點點東西就當成是全貌?經典上說:「盲閉慧目」。對什麼盲?對業果盲,導致惡趣;對空性盲,導致輪迴;對菩提心盲然,沒有對一切遍智生起嚮往,我們看不到的部份,恰恰是我們生命中最最需要的部份。就樂因及樂果。在我們的心對境的時候,由於無始劫來薰染的自性執的習慣,我們會重複地覺得事情顯現的即是本質,而沒有習慣向著空性和業果的方向觀察。觀察,脫離顯現的迷幻,進入事物的本質,擺脫一開始對境的時候的執著,沿著佛菩薩的教言去觀察,才能擺脫舊有的習慣,脫離感官的藩蘺,進入真理的自由高空,展翅飛翔。 [08′55″]
<p>   不單是自己的對認識方面是這樣,而且自己的理智上面,又是沒有力量能夠善巧地辨別完整的這個佛法的道理。本來這個理解、辨別,應該是說兩點,就是理智的辨別。這個地方用「言」字,這個有它的道理的,簡單地說一下。通常我們作學問常常有一句話叫「真理越辯越明」。是!你一個人也可以思惟、觀察、辨別,可是的的確確不如在學者彼此之間共同論辯、往復推敲這樣好,往復推敲這樣好。我們不要說作學問吧!譬如我們世間平常自己也感受得到,一個人坐在這個地方<p> ,<p> 也許你覺得沒勁,但是兩個人碰在一塊兒,如果談什麼問題啊,大家辯起來,平常我們常常說「抬槓子」,或者佛門當中叫「沖殼子」。哎呀,這個抬起槓子來,沖起殼子來,是越沖越起勁,越抬越起勁,這勁就提起來了。 [01′23″]</p>
<p>   那麼修學佛法的人亦復如是,我們能夠善巧利用這個特長的話,我們可以產生更深遠的功效。不過這個辯論哪也要有它一套很完整的方法,譬如我們現在經過陳那、法稱兩位菩薩進化以後了所謂因明之學,這就是非常善巧的一個辯論的方法,那這個是在修學佛法當中一個最好的工具。那是所以這個地方所以說,我們理智上面的辨別能力也沒有,修學上面的這樣的學辯的力量也缺乏。因為這樣,自己又不能完整地把握得住佛法的中心,像瞎子摸象一樣;又不能善巧地去辨別這個完整的教義,所以總歸走偏、走錯。因此,對這個圓滿的道路,這個佛指示我們正確的這個,我們就走錯了,所以下面說,離開了智者歡喜的道路。 [02′49″]</p>
<p>   大家有沒有聽到這一段師父是不是主要都是在講用什麼樣的方法越辯越明?用什麼樣的方法?是辯論對吧!介紹了一種學習方法。「<p> 觀視佛語多片眼,復乏理辯教義力<p> 」,如果說缺乏了「理辯教義力」的話,那麼就用辯論的方法把它補起來,所以這一段師父都是在講辯論。是不是這樣?在多少年前講辯論啊?三十年前講喔!像那時候可能我們連「辯論」這兩個字都想不到,看這一段就覺得:喔,大家在一起討論比較好!所以才在這裡邊說:「<p> 一個人也可以思惟、觀察、辨別,可是的的確確不如在學者彼此之間共同論辯、往復推敲這樣好<p> 」,然後師父又重複一遍:「<p> 往復推敲這樣好。<p> 」 [03′44″]</p>
<p>   這裡邊講了一下我們的習慣,或者說我們的習氣。一個人討論一個問題,和兩個人討論問題,說:「抬槓子」和「沖殼子」對吧?這個師父在《備覽》裡還有一大段在講。說:抬起槓子、沖起殼子,越沖越起勁,越抬越起勁。這個「勁」是什麼啊?歡喜心對不對?和力道,就提起來了。一旦把我們生命裡對某一部分跟別人討論問題那個力道提起來,用在佛法上的時候,能夠善巧地利用這個特長的話,那麼可能就不會「復乏理辯教義力」,就不會缺乏這個特點。 [04′23″]</p>
<p>   所以從這樣的一個角度,師父居然給我們介紹了什麼?因明啊!陳那和法稱兩位菩薩的因明之學,說是非常好的一個辯論的方法。現在大家都知道了,從《攝類學》開始,對吧?我們就學習辯論的格式、辯論的方法、幾種回答等等。現在想想,如果師父知道我們這麼多人在學習,他應該會非常非常開心吧!三十年前師父就期待我們能夠這樣地學習。那如果我們這樣地學習,是不是已經學得很好了?不會呀!剛剛開始。那大家沿著這樣的理路學下去就好了! [05′01″]</p>
<p>   這裡邊提出了所謂「因明」,因明的意涵就是指明了原因,而這些量學的論典,也是從正因的角度讓我們明了取捨的主要方法。那麼應該以什麼樣的方式去學習教典呢?師父在《備覽》裡邊有講經典上很多時候都是佛陀和他的弟子問答問題,就是有人提問題、有人回答。後來又講了禪宗祖師也是這樣的,有人提問題、有人回答。有的時候是弟子問,有的時候是善知識問,互相問的。有的時候一個答案,有的人就大徹大悟了。大家也知道果芒派被稱為「多門札倉」,辯論、辯論,辯論的人就從牆出去了,就是他開悟了。但是不是所有開悟的人都可以從牆出去?也不一定!有個這樣的傳說。 [05′53″]
<p>   講一個最簡單的,比如為什麼要用辯論的方式來學習呢?師父在這裡邊提出了一個,說:「<p> 越沖越起勁,越抬越起勁,這勁就提起來了。<p> 」這個「勁」到底是什麼勁呢?就是你投入到你所學的東西的那種心力,對不對?而現在所有教育最頭大的問題就是喜不喜歡學習?我們喜不喜歡獲取知識,或者說我們喜不喜歡用這樣的方式去獲取知識?一旦很多人對學習失去了興趣、提不起勁來之後,那麼這件事是很麻煩的,真的是教育界的一大難題! [00′45″]</p>
<p>   那麼學習佛法也是一樣的,如果我們對學習經典提不起勁來也是一樣的,是面臨很大的困境。如果用這種討論的方式,兩個人開始辯的時候,很顯然你不可能散亂,散亂你聽不到對方的問題,或者對方問問題你一定要回答;你也不可能昏沉,因為那個聲音太大了,又跺腳、又拍手,你面對一個對手,根本沒法昏沉!所以這兩點是可以去掉。另外你也不可能不專注,你不專注的話,一個問題都答不出來。所以你必須全力以赴投入對方丟給你的問題,或者你問難對方的問題。大家都會在那一刻,把所有生命的力量都用到跟對方討論的那件事上。 [01′31″]</p>
<p>   像我們僧團的法師們在辯論之前,他一定要認真地準備辯論的內容。比如說準備一道題要去問難別人,怎麼準備呢?一定要先看相關的經論,他肯定不是只看一本書,很多經典上的觀點他都要看,一定要熟悉經論上的說法;然後再加上深入探討的理路,自己想好了之後,到辯論場上去跟其他人辯論。這道題出現——跟別人討論這個主題的出現,不是隨意抓的,他是經過很認真準備的,有很多教理的依據去問難別人的。那麼被問的那個人,他準不準備呀?最好是準備,不準備上去被問就什麼都答不上啊!通常問別人,有的時候他自己有答案,也許他沒有答案。如果對方的回答,答出了一個超出這麼用心準備的答案,超出了他自己的想像,是非常好的一個答案,而且解開了他自己的疑惑——在問難的時候,如果對方的理路遠遠地比你透澈、比你高超、比你絢麗——那一定是留下很深的印象,甚至終生難忘,因為那印象太深刻了!那個問題可不是信手拈來的,像在水裡撈月亮一樣,不是這樣抓一下、抓一下,他是經過深刻的聞思準備,而且可能很多天的冥思苦想,這樣想出來的。 [03′04″]</p>
<p>   另一種情況,就是被對手問難到答不出來,啞口無言,但是你會覺得實在是太好了!為什麼?「怎麼會有人用這麼漂亮的理路,把我問得完全答不出來!就輸得痛快!」那個時候會有難堪的感覺嗎?可能突然在你面前出一道彩虹的時候,不會覺得自己有多狼狽,因為你看到彩虹。所以會在內心中發出對辯論對方理路的一個禮讚,然後這個理路在我們的內心中同樣地留下了非常深刻的印象。對辯論的對手,也會生出了一個深刻的敬意、由心髓深處產生的一個恭敬心。因為你發現:「哇!這理路太過璀璨,我平常完全都不知道!」以後再在僧團裡看到他的時候,你會覺得:「哇!他有深刻的、不知道什麼時候會出現的一個絢爛的理路。」所以你也不敢心裡對他有什麼非理作意。 [04′17″]</p>
<p>   還有第二種,拿同一道題去問不同的人,請問會得到同樣的答案嗎?會有不同的答案!對不對?這樣的話就不會總是陷在自己的觀點裡想事情,就是那一條路,你會得到好多條路。能夠從更深刻、更寬廣的角度去看待這些問題的時候,經過反覆地辯論,對這個問題也會留下深刻的印象。記住!深刻,不是膚淺的。為什麼?因為你跟他討論一次、跟他討論一次、又跟他討論一次,想了幾遍了?就三遍了。你跟他討論完了,你回來不想嗎?「欸,他的觀點為什麼是這樣的?」然後你第二天拿這又去問別人,有可能是三遍,有可能是六遍,有可能是乘更多遍。比如說:「欸,你是如何成立前後世的?」這個問題你多問幾個人,問一遍你就串習一遍、就討論一遍,所以它不是只想一次、只聽一次而已。這裡邊是強調了一個不只是自己日思夜想地用功的方式。這是用功的。還有一個不用功的,師父說:「提不起勁來跟別人討論。」自己用功的,他也需要跟不同的人討論,因為他會聽到更多觀點。 [05′31″]</p>
<p>   還有一種狀況,就是我們現在僧團也有班級對抗。兩個班都要派出代表,派出兩個人或者更多人,雙方都要精心準備辯論題目。那時候一個人敗了就是他們班敗了,集體榮譽還是挺重要的。所以這個時候大家都會卯足了全力,要衝擊那個辯論題。一個是心力上不會偷懶;再一個,這個時候是僧眾集會呀,在全寺的僧眾面前辯論,在僧眾面前可以得到不可思議的加持力。 [06′06″]</p>
<p>   在被問的時候,可能平常沒有想過的理路,大眾集會的時候突然想到了非常精彩的思路,可能是從前沒有想過的。好像一亮,那個理路就在自己的心上出現,或者非常流暢地在自己的辯論的聲音裡邊流淌著非常深刻的、犀利的理路;或者一個非常善巧的理路。這個絕對會有上師、佛菩薩的加持,還有僧伽大眾的加持。所以說:「<p> 法會中所變心力,暗中獨思難得生起。<p> 」這也是說大家在一起學習、互相討論、在一起辯論,會得到很大的加持力。所以師父給我們介紹的這種學習方法,三十年前就讓我們這樣學習。 [06′59″]</p>
<p>   辯論之所以能夠深入有幾個原因,有一個就是雙方都要懷著正確的動機,不是為了爭個是非、對錯。雖然還是有是非、對錯,但它主要目的不是為了競爭,而是希望透過辯論,不要「復乏理辯教義力」,要深入探討佛菩薩、祖師的意趣。這種辯論到最後才不會變成是只爭勝負、人我是非,它變成了大家一起探討真理。探討這一段,你會發現所有的人都在對這一段的理解獻出他的心力,那時候的學習氛圍是非常非常愉快的。當然也有探索的艱辛,但是如果有這麼多人一起在討論這個題目的話,那個感覺有的時候是氣勢如虹啊!真的是很美的喔! [07′51″]</p>
<p>   所以師父在三十年前就期待我們能夠這樣學習,我們現在已經開始這樣學習了,會不會覺得很高興啊?居士也開始學了。雖然高班的同學已經學完一輪了,但是我們的辯論還是剛剛起步,所以大家要加油啊!要加油!不要辜負師父的期待,他在那麼多年前就對這樣的學習方式表現出那樣的一個歡喜心。大家在《備覽》裡可以聽到那麼歡喜!在這邊也是很高興的。現在我們學習辯論能夠作師所喜,所以大家真的要好好地加油! [08′37″]
<p>   關於「觀視佛語多片眼,復乏理辯教義力」,大家還可以聽一下新版的《廣論》師父是怎樣講的,很短,不長。 [00′11″]</p>
<p>   那麼正規地來說,剛開始應該廣學多聞,不幸的是「廣聞是不善於修要」,學了很多道理呢,修行不善巧。本來是應該懂得了很多道理,然後呢,照著道理去努力地行持。這個努力行持也並不是等到我念完了再哦,剛開始時已經講過,當我們在學的過程當中,隨分隨力。那也許說:「我現在還沒有懂,怎麼叫隨分隨力?」雖然書本上、理論上不太了解,可是周圍是不是每個人都有——從家庭當中的父母,到兄長、到師友,那他們多多少少會告訴我們。我們應該隨分隨力地在這個圈子裡當中,接受好的這種概念,儘量地把那個壞的漸漸地淨化,這是我們做得到的。特別是學《朗忍》這樣的一個教授,後面非常強調這個特點。那我們能夠做到了,就漸次能夠改善增上,如果做不到,我們始終會停滯在那錯誤的階段。 [01′29″]</p>
<p>   那個錯誤的階段,下面就說:「觀視佛語多片眼,復乏理辯教義力。」我們對於佛告訴我們的話,先我們根本不知道﹔就是知道了,學到了以後——多片眼,我們從一個角度去看。實際上佛要告訴我們的是一個無限地廣的一個面,或者是我們根本沒學到,或者學到了我們會停滯在我們自己這個階段,所以對這件事情看不清楚。 [02′06″]</p>
<p>   大家可以看到在新版《廣論》上,師父還是說我們看問題的角度,對不對?佛要告訴我們的是一個無限寬廣的一個面,可是我們根本學不到,或者學到了之後會停滯在我們這個階段,還是過分地在意自己的認識,對不對?沒有像第一遍說的,多聽、多了解、多聽聞,不要太執著自己的認識。差不多觀點是一樣的,有沒有注意到?一樣的。再往下聽一下。 [02′36″]</p>
<p>   他現在講的「片眼」,這個一個眼睛,一個眼睛看東西看不清楚的。你們可以試試看,我們以前做過一個遊戲,這個遊戲是這樣:把一個眼睛閉起來,然後呢,你拿兩個手指頭,就上下的手指頭兜,那自己那個手指頭兜不上啊,你們去試試看。你們有沒有發現哪?你閉上一個眼睛,兩個手指頭兜兜,兜不上。是吧? [03′07″]</p>
<p>   不要等一下有人又是這樣:「啊!我兜上了。」不必,那個都是自己的......。你仔細,就像你張開眼睛,一定兜得起來,可是一個眼睛閉起來的話,你要花很大的勁可能兜得上。眼前這麼簡單喔!手還是我自己控制的,閉上一個眼睛都兜不上了,你現在佛這麼深遠的東西,我們就懂了嗎?所以他說這個「片眼」這道理,是我們最容易的拿我們自己的錯誤的概念去衡量,這是我們的致命傷!也就是說,我們現在具足的能力是這麼地差,直覺的,不行﹔然後理智呢,「復乏理辯教義力」。我們腦筋當中說,是五根所對固然不行,六根那是要理論上面認識,對於這個教真正的深刻的意義,我們也一樣地不懂,因為沒有好好地在這個理論上面下過功夫。 [04′22″]</p>
<p>   好!這一段,師父說「片眼」,不是眼睛都睜開了,對吧?看問題是看不到全貌、看不清楚的。所以這裡面師父說「<p> 我們的致命傷<p> 」是什麼?就是「<p> 最容易的拿我們自己的錯誤的概念去衡量<p> 」。眼前的這一個例子——閉上一隻眼睛、睜開一隻眼睛,然後很大的力氣都對不起來,何況佛法這麼深遠的,我們能一下子就懂了嗎?那我們為什麼會拿自己的錯誤概念去衡量呢?為什麼那樣的錯誤的概念,卻成了一個丈量事情的標準呢?我們認為我們獲得了標準,這樣的標準也沒有去多方地求教、多方地探討和辯論,所以以為自己的就是標準。但是一旦上辯論場,被多方的角度問難一下、討論一下,可能就會減少這種自我感覺良好、自己認為的就是最後的答案的狀態,對不對?我們會保留學習的空間、保留觀察的空間。 [05′33″]</p>
<p>   師父在這一點,還是希望我們能夠認識到我們的無明,「盲人摸象」或者「片眼」——把一個眼睛遮起來,都是看不清楚、看不到全貌的。那麼看不到全貌怎麼辦呢?就是要多觀察、多辯論,因為「觀視佛語多片眼,復乏理辯教義力」,這兩點都是要我們下功夫學教典。 [06′01″]</p>
<p>   世尊也曾經這樣說過:「<p> 比丘與智者,應善觀我語,如煉截磨金,信受非由敬。<p> 」所以提到對於經義——經典上的意思,必須要以量來觀擇。至尊慈氏也這樣說過:「<p> 以理思擇善妙法的思惟者,恆常不遭魔障礙。<p> 」以正理去思擇,這樣的一個思惟者不會被魔障所障礙。《入中論》中也說:「<p> 異生皆被分別縛,能滅分別即解脫,智者說滅諸分別,即是觀察所得果。<p> 」我們凡夫到底怎樣能夠獲得解脫呢?就是從觀察得到的結果。說一切聖眾、補特伽羅都共稱:不依據正理,僅追隨著言辭者,就是鈍根的「隨信心行者」;以正理思擇取捨處,才被智者譽為「隨法行者」。因此如果有一種說法:以正理去思擇、以正理去推理的模式,對志求解脫者而言不重要的話,這樣的魔語,具智慧者應當緊閉雙耳。聽到這樣的話應該把耳朵閉起來,因為這是錯誤的、不可以聽的!一定要去廣泛地辯論、多方地觀察、好好地學習,因為這是先輩祖師對我們的一個叮囑吧! [07′34″]
<p>   大家好!又到了我們一起學《廣論》的時間了。在聽聞之前,請大家觀察一下自己的內心,看一看我們有沒有做好聽法的前行?其實聽法的前行是很重要的,因為它會端正我們的動機,而且讓我們對這一節課有一個很深的用心。因為我們知道:能抽出這樣的時間用我們全部的身心一起學習《廣論》,這也要有很多的資糧。並不是很輕鬆、很隨意就可以值遇到宗大師的教法;也不是遇到了之後,我們就能生起信心;也不是生了一點信心之後,我們就能夠堅持十年、二十年這樣的聽聞、思惟和修學。所以這一切都要感恩生生世世攝受、引導我們的善知識對我們悉心地教導!這樣的時光,是無量劫來不知道花了善知識多少心血、我們自己用了多少努力才換得的,對我們來說是很珍貴的。所以一定要用自己全部的身心安立大乘的動機和這樣的法相應,來一起學習和討論,才不會虛度這樣的光陰。 [01′35″]</p>
<p>   好!那大家就觀察一下自己:我為什麼要聽聞《廣論》,或者思惟這些教理呢?就是為了令無窮無盡的有情能從痛苦的輪迴裡解脫出來,我必須去成佛,必須發起菩提心,證得究竟的大覺佛位,這樣才能夠幫到所有的如母有情,令他們達到究竟離苦得樂這樣的目標,也令我自己的生命達到究竟地離苦得樂。 [02′13″]</p>
<p>   好!那下面我們就接著聽師父講的《廣論》。<p>   那麼要曉得我們真正修學佛法,它需要很多條件,很多條件。圓滿的佛法,通常我們來說,說悲、智,然後說性宗、相宗;次第下面依著上去的話,說聞、思、修慧,戒、定、慧三學,每一個方面都層層構架因果相循,這樣地上去。這絕對不是片面、局部的,這一個要想得到圓滿的引導的話,一定要有殊勝的教授。 [03′11″]</p>
<p>   這一小段,如果我問大家問題的話,看!又出現了!又出現了什麼了?注意那幾個字,師父又講了!「<p> 真正修學佛法<p> 」,師父總是在修學佛法前面,或者修行前面加上「真正」二字。就是發心要來得真切,然後我們要用至誠懇切的心來學習。 [03′38″]</p>
<p>   說:「<p> 真正修學佛法,它需要很多條件,很多條件。<p> 」這裡尤其是師父講了什麼?「<p> 圓滿的佛法<p> 」,在佛法前面又強調了「圓滿」。說:「<p> 圓滿的佛法,通常我們來說,說悲、智<p> 」,然後舉了「<p> 性宗、相宗<p> 」;注意!「<p> 次第<p> 」,依著上去提到了「次第」,「<p> 戒、定、慧<p> 」,「<p> 聞、思、修<p> 」等等。然後師父說:「<p> 每一個方面都層層構架因果相循<p> 」,就是絲毫不亂的,師父說:「<p> 這樣地上去<p> 」。注意!又出現了!「<p> 絕對不是片面、局部的<p> 」。前面師父講的那個圓滿的佛法,師父又闡述了一遍——圓滿的佛法,它不是片面的,也不是局部的。 [04′29″]</p>
<p>   講到這裡,我們就會想:「那圓滿的佛法要怎樣才能得到呢?」「什麼是圓滿的佛法呢?」師父就說:「<p> 這一個要想得到圓滿的引導的話<p> 」,出現了「引導」,「<p> 一定要有殊勝的教授。<p> 」這裡說「圓滿的佛法」,然後要得到圓滿的引導的話,一定要有殊勝的教授,就引出了從圓滿的佛法到圓滿的次第,依次第上去,然後層層架構因果相循。如何能夠得到這種圓滿的佛法的引導呢?就是「一定要有殊勝的教授」。所以在下面一段,師父就講了「教授」。 [05′20″]
<p>   這個「教授」,這地方要說明一下。教授呢這地方特有所指,就是指經過善知識把這個經論裡邊,換句話說,經論這就是諸佛引導我們凡夫,從凡夫地一直到成佛的最圓滿的這一個內涵,這個裡邊重要的關鍵所在。所以它本末何在,然後大小的次第,以及很多關鍵的地方,這個就是「教授」。譬如說我們常常看一本書,那麼看過了以後啊,並不能夠把握得住這個裡邊的重心,以及它上去的很多關鍵在什麼地方,這不知道;以及性相二宗之間,怎麼樣互相配合,那麼小乘,然後呢上去怎麼樣地層層上去,這裡邊都有它必然相互的關係。你能夠了解了,這個時候它是相輔相成必不可少的;如果你不了解的話,往往會產生種種流弊。 [01′27″]</p>
<p>   以我們目前來說,我們常常聽見一句話說:性相角立。性宗跟相宗就像牛的兩隻角一樣,各是各的,實際上呢恰恰相反,性宗跟相宗必須是互相相輔相成。這個就像鋼筋、水泥一樣,兩個——鋼筋加上水泥,水泥加上鋼筋,那個房子才造成功很完整的結構。現在你把它拆開來了,骨頭是骨頭,肉是肉,乃至於說這兩個你不能配合的,這豈不是很糟糕嗎?這個差在哪裡呢?就是沒有得到這個正確的教授,現在要殊勝的教授,你能夠得到了這個東西以後,那才能夠把佛所說的圓滿的道理能夠認識。 [02′26″]</p>
<p>   這兩段大家可能也都很熟了,尤其是帶班的班長,可能已經都很熟了。在我們聽聞經典的時候,有一種心態是要不得的,就是:「啊!這一段我都知道是怎麼回事了,我聽得很熟。」聽得很熟之後,注意力就會分散,就不會再往深去探究。這樣的話,我們就會停在原有的那個層面上,久了之後就會慢慢地漫不經心吧!或者會不會有一點小驕傲呢?說:「我都懂了!」或者你感覺到索然無味。這些都是學得久的同學特別要注意的!就算對這一段學過一千遍,但是我是否能夠真正地了解師父在這一段裡所講的內涵是什麼?就算是了解了這樣的內涵,那我心中會不會生起合量的覺受,來跟這樣的內涵相應呢? [03′29″]</p>
<p>   所以我們重複地聽聞一段師父的教言,不要覺得我已經都懂了、我聽過了,或者這是我熟悉的,然後就開始不認真。這種心態久了之後,唯恐成為教油子。雖然教油子這個詞大家很恐怖的、很驚恐的,因為一旦成了教油子之後就很難治,但是要知道我是怎麼變成那樣子的?所以聽聞的時候好好發心,再次地聽聞聽聞過的教典的時候,不要漫不經心,不要以為自己已經了解了,要去往深了探究。還有一種思路就是:「我可能要閉關修,才能把這段修出來。」也不是這樣的,在聽聞的時候就要有層層遞進的感覺,層層遞進。 [04′18″]</p>
<p>   所以,在這一段提出了怎樣能夠得到圓滿教法最重要的圓滿引導,一定要殊勝的教授。那麼「<p> 教授<p> 」,師父說這裡邊是「<p> 特有所指<p> 」的,指什麼呢?注意!大家可以看一下手抄,是「<p> 經過善知識<p> 」——出現了「善知識」,「<p> 把這個經論裡邊<p> 」——又出現了「經論」。然後師父說:「<p> 換句話說,經論這就是諸佛引導我們凡夫,從凡夫地一直到成佛的最圓滿的這一個內涵,這個裡邊最重要的關鍵所在。<p> 」大家可以想一下這句話,在提到要有殊勝教授的時候,善知識出現了。那麼善知識要做什麼呢?就是要把經論裡邊的一種關鍵指導給我們,一種內涵讓我們能夠領會得到。什麼內涵呢?就是諸佛要引導我們凡夫;誰引導我們呢?是諸佛;引導誰呢?凡夫;做什麼呢?就是從凡夫地一直到成佛的最圓滿的一個內涵。 [05′34″]</p>
<p>   師父用這麼簡潔的一句話,但是這裡邊的內義實在是太豐沛了!而這裡邊每一個都不能缺,每一個!聽的時候不知道你們會不會心生歡喜和感動?因為什麼?這裡邊出現了「善知識」。如果沒有善知識,無法啟發我們宿世的善根,就會變成冥頑不靈或者沒有感覺。有了善知識指導我們,我們才能夠認識十方諸佛,才能夠知道我現在是個凡夫;居然是個凡夫,還能夠從凡夫去修一個道,能夠成佛!所以這裡邊跌宕起伏的很多內涵,都在這一句話裡師父就交代完了。 [06′26″]
<p>   師父就說:那關鍵所在和圓滿的內涵到底是什麼?又講一遍,大小的次第呀、關鍵啊!後來又舉了一個看書的例子,說怎麼樣能夠把握這重心呢?關鍵是什麼呢?然後層層上去有個必然的聯繫,每一個都是必不可少的。注意下面開始引到下一段,說:「<p> 如果你不了解的話,往往會產生種種流弊。<p> 」 [00′29″]</p>
<p>   那我問大家一個問題:不了解什麼呢?不了解什麼會產生種種流弊呢?接著就到下一段了。下一段師父就舉了一個例子「<p> 性相角立<p> 」,說性宗跟相宗必須是相輔相成的,像鋼筋和混凝土一樣,如果拆開來的話是非常糟糕的。然後說:「<p> 差在哪裡呢?<p> 」為什麼會把應該相輔相成的佛陀教誨弄得好像互相矛盾?師父說:「<p> 這個差在哪裡?<p> 」還記得師父怎麼講的嗎?「<p> 就是沒有得到這個正確的教授,現在要殊勝的教授。<p> 」把圓滿的佛法弄得好像都是前後矛盾、對立的原因,為什麼學人會把它弄成這樣子?就是因為沒有得到殊勝、圓滿的教授! [01′28″]</p>
<p>   得到圓滿的教授會怎樣呢?得到這個教授的話,會學到圓滿的教法;如果沒得到怎麼樣呢?他就會把教法裡包含的各個部分互相對立起來,甚至會認為彼此是不相容的,就弄反了。這裡邊最關鍵的部分就是要得到教授——殊勝的教授!得到了之後,師父說:「<p> 你能夠得到了這個東西以後,那才能夠把佛所說的圓滿的道理能夠認識。<p> 」注意!又出現了「佛所說的圓滿的道理」。師父在這一段數數地提出圓滿的佛法、殊勝的教授。如果沒有殊勝的教授的話,我們就會把佛法的各部分對立起來,自己就互相矛盾,弄不清楚了。 [02′22″]</p>
<p>   師父講述得很簡潔吧!佛陀最偉大的事業也就是說法事業;我們所有的人都要從聽聞佛法開始領悟真理,開始去修行佛道,所以不重視聽聞是不可以的!那麼我們學了二、三十年以上的人,會不重視聽聞嗎?大家看看內心裡有沒有這種邪執?剛才我舉的:已經聽過了,就不再認真聽了,那是不是不重視聽聞呢?覺得聽一遍就可以去修行了,修行才是必要的,聽聞變得沒那麼重要,尤其是重複聽聞已經知道的因果故事或者師父的一段教誡。當重複聽聞的時候,我們以為我已經熟悉了,甚至沒有耐心,我只對新奇的、沒有聽過的才有一個好樂心。這就是我們聽聞佛法一個停滯的狀態,是要調整的。 [03′23″]</p>
<p>   另外,前面聽聞軌理一定是沒有做好,做好了之後,一個字的佛陀教法進入我們的耳根,我們都會心生感動。因為能聽到一個字的佛法也是非常不容易的,也是善知識花了很久的心血,才把這個傳承傳到我們的耳邊。這一刻不是那麼漫不經心就過了,不是「我知道了」就沒有意義了,就不值得用心了!不知道我這樣講,你們覺得可以嗎?觀察一下內心啊,觀察一下內心! [03′57″]</p>
<p>   所以這三段,都是強調圓滿的教法一定要有一個圓滿的引導;要得到圓滿的引導,要有殊勝的教授。如果沒有得到這種殊勝的教授的話,我們就得不到圓滿的佛法引導。為什麼呢?我們會把圓滿教法裡邊所包含的各個部分完全對立起來,開始自我混戰。不能把它們按照一個道次第非常恰到好處地排好,自己依次地修學,可能會非常混亂。 [04′32″]</p>
<p>   所以得到這個教授,善知識依照經典引導我們這個教授,是何等地重要!是何等地欣喜、何等地珍貴!那麼我們現在是不是正在學習這樣一個圓滿又清淨的教授呢?學習圓滿教法的次第?所以是何其幸運!一定要好好地珍惜能夠值遇這麼圓滿的教法,有善知識這樣為我們一點點講,然後我們大家一起來討論,還有這麼多同學一起學,這樣的時光真是太珍貴了! [05′10″]
<p>   好!我們來聽下一段。<p>   那麼說到這裡,我順便提一下一件事情。譬如我們經常啊,常常這麼說,大家也了解說,以我們目前佛所傳下來的三藏十二部經典當中,有兩部圓教經典,有兩部。所謂「圓教經典」就是最徹底、圓滿地把佛自己要身證、內證的經驗和盤托出。也就是說從我們凡夫地一直到最究竟圓滿的這個程度,所有的內容都告訴我們的那個經典,叫作圓教的經典——一部是《法華》,一部是《華嚴》。是就它的總相來說,換句話說,就它的最後結果來說,《法華》跟《華嚴》說的都是最後究竟決定成佛。 [01′11″]</p>
<p>   師父在講完了圓滿的佛法要獲得殊勝的教授,然後就講了兩部經典——《華嚴經》和《法華經》,我們都很熟悉的。很多人都誦過《法華經》、《華嚴經》,像我們有一些出家人還會背《法華經》。師父說:這個經典,就是把我們凡夫一直到最究竟圓滿的證德部分和盤托出的。說:「<p> 《法華》跟《華嚴》說的都是最後究竟決定成佛。<p> 」在這裡邊講了所有的有情最後都可以究竟決定成佛,對吧!那麼,注意!接下來師父要講:《法華經》和《華嚴經》說的都是最後究竟決定成佛,是不是就沒有差別呢?大家往下聽! [02′14″]</p>
<p>   可是從另外一個角度來去看的話,這兩個之間就有絕大的差異。《法華》一開頭的時候是授記,乃至於二乘大智舍利弗等等,每一個人都成佛。最後說,不要說證羅漢果了,隨便一個人,他只要有一天接觸到了佛法,留下那個種子的話,他最後也成佛。所以《法華》裡面說:「若人散亂心,入於塔廟中,一稱南無佛,皆已成佛道。」一個普通的人以散亂心,就像我們普普通通,你跑到那個廟當中看見了佛像,啊!歡喜了,說:「啊!南無佛。」念了一聲佛,他最後這個種子也成佛,說明這個,究竟一定成佛!但是這個成佛的時間上來說,那卻是從種下這個種子到最後圓滿的時候,不曉得要經過多長多遠的無量無邊的阿僧祇劫。那是個天文數字,我們根本無法想像!不要說是個凡夫,就是一個證了果的小乘聖者,像大智舍利弗等等,他們都要還經過很長的天文數字的一個年代才能成佛,所以成佛的時間這麼遠! [03′57″]</p>
<p>   而另外同樣的是圓教的《華嚴》呢?善財童子以「十信滿心」最後以十大願王導歸極樂,就一生取辦。這個差得天差地遠,這個差得太遠、太遠了!假定說這個兩者時間當中說,啊!反正慢一點成佛沒關係啊,那個時候我們在天堂上面享福,那倒不妨慢一點。要曉得這樣的天文數字,那一段時候的話,極大部分、極大部分都在惡道當中受無量無邊的痛苦啊!現在這種痛苦叫我們受一點點都受不了,何況這麼長的時間。所以這個時間對我們是絕端重要的一件事情。這個裡邊兩者同樣成佛,而真正決定的關鍵,如果我們有機會、有能力,以及自己想去抉擇的話,是決定會找那個快速的,絕不可能說慢慢地來的。 [05′01″]</p>
<p>   師父說:另一個角度,這兩個之間就有絕大的差異。什麼差異呢?「<p> 《法華經》一開頭的時候是授記,乃至於二乘大智舍利弗等等,每一個人都成佛。最後說,不要說證羅漢果了,隨便一個人,他只要有一天接觸到了佛法,留下那個種子的話,他最後也成佛。所以《法華經》裡面說:『若人散亂心,入於塔廟中,一稱南無佛,皆已成佛道。』<p> 」一個普普通通的凡夫用散亂的心,跑到寺院裡看到了佛像,哎呀!歡喜了,說:「喔!南無佛。」念了一聲佛,最後這個種子他也會成佛,看起來成佛太容易了!究竟成佛——這是《法華經》裡提出來的觀點。 [05′58″]</p>
<p>   接著師父提出什麼?「<p> 但是這個成佛的時間<p> 」,注意!「時間」出現了!說:「<p> 從種下這個種子到最後圓滿的時候,不曉得要經過多長多遠的無量無邊的阿僧祇劫。<p> 」根本無法想像——天文數字!這是一個散亂心的。「<p> 不要說是個凡夫,就是一個證了果的小乘聖者<p> 」,注意!這裡邊除了凡夫,還有證果的小乘聖者回小向大的話,也要經過天文數字那麼長的時間。所以成佛的時間太遠了!師父說:「<p> 成佛的時間這麼遠!<p> 」 [06′47″]</p>
<p>   那麼《華嚴經》呢?《華嚴經》這裡舉的例子是善財童子十信滿心,以十大願王導歸極樂,一生取辦,說:「<p> 差得天差地遠<p> 」太遠、太遠了!然後師父說了天堂和惡趣的差異,對吧?說:如果這麼遠的時間都是享福的話,那沒關係!當所有的生命感到快樂的時候,時間都過得很快,就算無量阿僧祇劫也很快。但是如果絕大部分的時間,都在惡道中受無量無邊的痛苦,而且痛苦的強度是什麼樣呢?就是「<p> 叫我們受一點點也受不了的<p> 」,可是要受那麼長的時間啊! [07′35″]
<p>   師父又說:「<p> 這個時間對我們是絕端重要的一件事情。<p> 」注意!時間。有在聽嗎?有走神嗎?聽到這兒會不會又覺得聽過了?但是聽過了你在想什麼呀?關鍵是你的心有改了嗎?有沿著師父講的這個理路改嗎?有注意到「時間」嗎?如果注意到了的話,師父接著說:「<p> 這個裡邊兩者,<p> 」注意!「<p> 同樣成佛,而真正決定的關鍵<p> 」是什麼?說:「<p> 如果我們有機會、有能力,以及自己想去抉擇的話,<p> 」這三個部分,有機會抉擇。 [00′51″]</p>
<p>   為什麼?聽到了《法華》和《華嚴》,也聽到了善知識引導的教授,有機會了!有機會的時候,有能力否?有能力了。有能力還分幾種,他有能力但是他不想做,對不對?所以有能力又是自己想去抉擇的話,看這條件喔,說:「<p> 是決定會找那個快速的,絕不可能說慢慢來的。<p> 」注意!這是一個聽聞相應的狀態。我們再一次地聽聞到了《法華》、《華嚴》的這個公案,我們是否是有機會的、有能力的,以及自己想去抉擇的那個聽法者呢? [01′33″]</p>
<p>   師父說如果是的話,那我們決定會去找那個快速的,絕不可能說慢慢地來!自己可以對照內心一下,雖然這個公案已經聽得非常熟了,但是是否得出師父在此處所指出的那個結論?因為終究是要得出這個結論。如果沒有得出這個結論,這一段可能沒聽懂,需要非常非常認真地做聽聞軌理,重新地聽聞。 [02′04″]</p>
<p>   那麼拿這一段話觀察內心,我們可以自己問一問:我有機會聽聞到成佛這件事,而且有機會聽到快和慢兩條路嗎?現在就聽到了嘛!有的已經聽到二十多年了。那麼有能力去抉擇嗎?就是時間長短啊、長時間都在惡趣裡流轉,能不能對我們在惡趣裡流轉這件事成立前後因果,然後從我們相續裡的苦因和苦果、樂因和樂果這樣的成熟去抉擇?最大的問題是:自己想去抉擇嗎? [02′47″]</p>
<p>   像我們平常買個房子、買個地、買個東西,都會想找物美價廉,花很少的錢得到最好的、最滿意的一件物品。那麼當我們用全部的身心想要去成佛的時候,我們也想要找一條不要那麼費力氣的路,尤其是不要在惡趣那麼長時間,受那種一秒鐘都不能忍受的痛苦,那麼一定要去抉擇的!師父說:如果有機會、有能力,以及自己想去抉擇的話,是絕對會找那個最快的。師父在以前也講過這樣的道理。 [03′30″]</p>
<p>   如果現在的我還沒有想去抉擇的話,那我是差哪一個條件呢?是沒有機會聽?是沒有能力抉擇?還是我不想去抉擇?不想去抉擇到底是因為什麼呢?是因為沒有聽懂師父在這裡邊講的《法華》和《華嚴》的意趣嗎?還是因為我不在意?還是因為我沒聽懂我以為我聽懂了,我沒有再深思?大家可以好好地觀照一下自己,看自己是缺哪個條件,或者我們已經對這一段生起了絕端重要的這樣一個看法。 [04′11″]</p>
<p>   絕端重要的看法是什麼樣呢?當你看到這一行文字,你就會不眨眼地盯著、全神貫注地聽著,因為覺得這是無量劫來我生命最關鍵的部分,可以讓我少受那麼那麼多的痛苦,這太關鍵了,我豈能馬馬虎虎地聽聞!就算我一聽聞的當下覺得懂了,可是我抉擇的,有深入骨髓嗎?我有做夢都不忘這件事嗎?我有在來生也會想起來嗎?甚至在死有到來的時候,我也會現起來:我一定要走大乘,一定要走一個最快成佛的路,一定要發菩提心!有沒有在我們的生命中留下難以磨滅的印象,甚至生生世世都銘記著它? [04′59″]</p>
<p>   因為我相信師父這樣教導我們,應該也是講很多了吧!所以如何用一個相應的心,來回報師父這千古的叮嚀、千古的呼喚?每遇到一個地方師父就開始講了,說:「千萬不要走那遠路啊!遠路太苦了、太苦了!而且時間太長了!」而且師父還列了三點說:「有機會、有能力,你想去抉擇的話」,你怎能不抉擇呀!已經是不知道怎樣的苦口婆心了!不知道講了多少遍,這樣重複地講。那麼對我們來說,是否能把這樣的叮嚀放在心上?因為什麼?怕我們受苦啊!能不能放在心上然後產生定解?這是最關鍵的! [05′58″]
<p>   好!我們現在再聽一段。<p>   現在這個問題說,那兩者當中,為什麼一個這麼快,是一個這麼慢呢?哪!就是這樣——你有沒有得到圓滿的教授、教誡!你得到了,就是一生取辦!否則的話,對不起,你就是轉這麼大圈子。那麼這個關鍵是沒錯,哪來得到那個圓滿的教呢?要有殊勝教授。哦,所以啊大師看見了這個內涵,又鑑於眼前這個狀態,所以他說:我見已啊,來解釋此大車道。哦!那個告訴我們,這個才是走這一條大乘的圓滿的道路。 [01′01″]</p>
<p>   當我們有機會、有能力,而且自己想去抉擇,那麼現在這個問題:兩者當中為什麼一個這麼快,一個這麼慢呢?喔!原來是「<p> 你有沒有得到圓滿的教授、教誡!<p> 」大家可以把這句話在腦海裡再回放一下:有沒有得到圓滿的教授、教誡,會決定什麼呢?決定快或者慢。決定快和慢會決定什麼呢?就決定我們少受很多苦,還有一個是多受很多苦。如果平常討論問題說,做這個生意,受了很多苦可能結局還不怎麼好,我們一定不去做的;或者我們選一條路去哪個城市,說那條路非常地辛苦,而且可能中間還會遇到很多不吉祥的事情,那我們一定不會走,因為我們都想離苦得樂,而且還想快速地離苦得樂。所以這裡邊最重要的問題居然是有沒有得到圓滿的教授、教誡!得到了什麼樣呢?一生取辦!得不到的話,師父說了:「<p> 對不起,你就是轉這麼大圈子。<p> 」我們是在惡道中轉的喔!是無量無邊阿僧祇劫,而且受的痛苦是一秒鐘都受不了的痛苦,要受那麼長的時間。 [02′34″]</p>
<p>   接著師父講出了什麼呀?說要得到圓滿的這個教法,一定要殊勝的教授。然後師父就說:「<p> 哦,所以啊大師看見了這個內涵。<p> 」看到了什麼內涵啊?快速成佛的路啊!還有那條遠路。然後又看到了現在修行者現存的這些困境,或者說弊端,或者說錯謬、苦楚。宗大師看到了這個內涵,所以他說:「<p> 我見已啊,來解釋此大車道。<p> 」師父用如此親切的語氣為我們訴說大師的心意,然後說:「<p> 那個告訴我們,這個才是走這一條大乘的圓滿的道路。<p> 」所以「見已釋此大車道」的那個偈子,居然在這麼長的講述之後突然出現! [03′45″]</p>
<p>   不知道讀到此處大家什麼感受?雖然我也讀好多遍了,但是還是感激涕零。如果沒有大師解釋這個大車道,我怎麼辦呢?就算大師在六百多年前就講了,如果師父不是費盡千辛萬苦得到這個教授來為我們講,我怎麼辦呢?而且剛開始講的時候還沒人願意聽,剛開始組建班的時候,講、講、講就剩師父一個人了,講、講、講就是師父一個人了。 [04′29″]</p>
<p>   我們可以自己想一想。我以前遇到一個居士,他說他廣論班裡有三十個人,開到半年的時候全跑光,一個都沒有。他非常非常傷心,就再也都不當班長了。如果一次又一次悉心、非常努力找來的人,然後你給他講,都跑光了,還能夠堅持講嗎?師父遇到了這麼美的教授,他心裡這麼珍愛,然後想把它告訴這些同學,可是開始是沒人喜歡聽的。師父就是穿越了那樣的困境,一直走到我們面前,所以我們才能夠聽聞到這樣的教授,才能夠認識到:喔!有圓滿的這樣一個教授,有近路、有遠路,最關鍵的問題就是要獲得這個殊勝的引導。 [05′26″]</p>
<p>   想一想:如果沒有師父這樣矢志不移地堅持,我們豈能等到內心信心的善法的花開放?如果善知識用如此的慈悲心來等待我們、來引導我們,那我們應該用什麼樣的心去回報他們呢?就是把他們千辛萬苦求來的這個教授,好好地珍惜在心上。首先要認真地聽,不能對聽法馬虎,不能因為聽聞好幾遍了之後就心生麻木,就不重視聽聞軌理,甚至對說法師、對師父給我們講的也不珍惜了,這都是在內心裡要破斥的、要對治的。一遍又一遍地聽了,才能夠如量地生起那樣的感動和那樣的定解,這才是對的! [06′30″]
<p>   這幾節課我都特別強調「聽聞軌理」,因為聽聞軌理是非常重要的一個修行。事先要思惟聞法勝利,再思惟正在聽法的過程之中我應該注意什麼;要思惟到令心轉動、令心轉變,轉變為非常非常希求聽到佛法,然後感受到聽聞佛法千載難逢的「機會」,師父講的是「機會」!這個機會珍惜到什麼程度呢?就是盲龜遇浮木那樣的機會,一百年牠出來一次,浮木在大海上漂,那個烏龜恰巧把牠的脖子伸到那個軛木孔裡邊,是這樣的機會喔!這樣的機會有沒有能力聽呢?耳朵是可以聽的,而且智力正常、是有能力可以思考的,然後又想思考——這樣的機會! [01′03″]</p>
<p>   一旦得到這麼難得的條件,如果聽聞軌理做不好,我們被一些雜亂的心思所干擾,而對於每一節課師父要講的要義,就在心裡輕輕地散過去,甚至完全沒有痕跡的話,那有什麼損失比這個更大呢? [01′23″]</p>
<p>   講全廣的時候,我都是觀想我們坐在一個大的教室裡,我們一起學。很想看到大家的眼神是怎麼樣的,有沒有專注啊?有沒有歡喜啊?有沒有領會啊?而你的坐姿是怎麼樣的?因為有一種坐姿就很容易昏沉。另外,聽法的時候最好坐直,一直駝背的話,久了之後也會疲憊。有沒有打起全部的精神來聽呢?如果有一天我們真的在一個大教室裡聽的話,我就會看到大家的眼神,看到大家的坐姿,那時候我可能就會提醒你們。每一次提醒的時候,都是在訓練聽聞軌理的專注力,不要散亂!為什麼要強調聽法的坐姿呢?因為那種坐姿比較容易提正念,身體一歪了之後其實不太容易提正念。禪定的時候為什麼都要七支坐,坐得那麼好呢?就是比較容易提正念,而且對身體比較好。 [02′30″]</p>
<p>   所以在聽聞的時候,前行的準備一定是非常關鍵的!不要因為現在把音檔打開就可以聽,前行就不做,不做久了之後就浮浮泛泛地、散散漫漫地去聽,甚至平常就是特別不專心,很隨意就聽了。這樣聽久了就會養成壞習慣,聽法也不那麼珍惜,這樣對自己損失就太大了! [02′55″]</p>
<p>   所以,學得越久的同學,越是要注意最基礎的、前面的,比如說思惟聞法勝利。這一點大家一定要放在心上去思考,思考到內心真的很感動,感覺到千載難逢,「我坐在這裡能夠聽聞宗大師的教法,能夠聽到師父以這麼清晰親切的、容易趣入的方式講解《菩提道次第廣論》,至少在字面上能聽得懂,然後我們就可以深入。」要認識到這個機會像盲龜遇浮木那樣,心裡要生出萬分珍惜的感覺。 [03′43″]</p>
<p>   這樣來聽的話,就不會輕易地錯過師父講的每一個字,而且也不會覺得這個我懂了、那個我懂了,會深刻地感覺到這是沒聽懂的。因為每一次聽聞的時候我們都會聽到更深一點的內涵,抉擇自心的時候、往內心裡看的時候,都會看到更多的邪執,看到過去沒有看到的東西。發現每一次自己都有看到、都有破到自己過去沒破到的邪宗的話,怎麼能說過去那個是懂了呢? [04′23″]</p>
<p>   聽完之後要好好地迴向,一定要迴向無上正等菩提,就像把一滴水放進大海,這個善根會永不乾涸。而且認真地做了聽聞前行之後,我們真的可以收穫到法喜——因為聽聞佛法內心裡很喜悅。這種喜悅就是因為思惟這些真理產生的,它完全地由理性的正理抉擇,產生內心的歡悅或者內心的深度感動。 [04′57″]</p>
<p>   聽著師父的語氣,聽著師父字字句句對《廣論》的解釋,我們認真地做了前行之後是會感動的,是會碰觸到師父慈悲的心意——師父所傳遞的諸佛慈悲的心意!你感受到一點點那樣的慈悲的時候,生命的狀態就會變得柔軟、變得調柔,還有舒適。甚至你看不過去的事情,就因為聽聞了這樣的教法之後,不知道為什麼,心裡突然就柔軟下來了,看不過去的也看過去了,過不去的都過去了;或者沒有勇氣行善的,也突然獲得了勇氣。因為我們感受到了佛菩薩對我們千古慈悲的心意,感受到了這樣一位師長以這樣的願力和行持,以這樣堅忍的毅力在引導著我們。而且他說:「只要你不放棄,我願意陪你走完最後一程!」佛菩薩的願力喔!佛菩薩的誓言就是說到做到! [06′10″]
<p>   大家好!很高興又到了我們研討《廣論》的時間。今天想利用一點時間,跟大家講一下最近常常跟法師們討論的一個主題,就是關於煩惱蓄積的問題。談到蓄積,有很多種積累,比如說積累財富、積累知識;沒有人願意累積煩惱和痛苦,但是煩惱在不經意中是會累積的。累積了這種東西,慢慢地變強或者被境界很強烈地挑戰之後,就會成熟為猛烈的苦受,所以煩惱是不可以累積的。 [00′50″]</p>
<p>   觀察一下我們每天的生活,會發現可能有很多小小的不愉快,比如說聽到了別人說一句不中聽的話,或者別人做了一件你覺得不太合理的事情,乃至林林總總的、大大小小的一些不好的心情。這些不好的心情有的時候就好像讓它過去了,或者為了不給別人造成麻煩就自己忍了。這種忍的方式,或者放著的方式、轉移的方式,是不是讓那種煩惱不再增長呢?大家都會發現忍一次、兩次、三次,乃至第幾次的時候就會有一個爆發,就會發現自己突然很生氣了。但是實際上那是一個小小的境界,可能就是最後那根草,然後原先忍耐的東西全部都跑出來了。<p>  [01′48″]<p>   基於這種狀況,就討論到煩惱應該是隨時出來就要隨時用正念之矛讓那個煩惱削弱掉。那麼怎麼樣讓煩惱不要蓄積,而是疏導它呢?比如說這一天的生活之中,我們要發現什麼叫「煩惱」,就是開始不愉快了。那在這個不愉快的時候用蓋的行不行呢?比如說:啊!屋子裡邊進了一條蛇,然後你拿個布給牠蓋上或者不注意牠,是不是危險性就消失了呢? [02′28″]</p>
<p>   對於我們的心來說,可能一早起來就要對煩惱處於一種警覺的狀態,比如說皈依發心,要認真地、殷重地祈求佛菩薩,說:「我這一天二六時中,一定不能作『作已增長煩惱』的那種惡業,因為將來會忍受苦果。」那麼怎麼樣去及時地發現我在生煩惱?怎麼樣養成立刻、立刻就發覺的這種良好習慣呢?就是早晨要有個預備,就要準備一會兒我可能會碰到這樣的境、那樣的境......。可能我們沒法想像這一天到底會遇到什麼事情,所以我們只能準備,著上正念、正知的鎧甲,準備去忍受境界之刺。 [03′20″]</p>
<p>   對於有準備的心來說,我們就知道:「啊!看,那個又來了!」什麼又來了?那個境界又來了。同時也發現自己的非理作意呀、感傷啊、沮喪啊、孤獨感啊,或者很多負面的東西也都湧出來了。湧出來的時候,我們可以讓它停止;停止了之後,要去觀察一下:到底是境界那方面出問題呢?還是我心中的非理作意在出問題?通常都是兩者配合。讓我們變得越來越痛苦的作用力,還是要以心為主,否則全部都交給境界、交給他人的話,那我們的生命永遠將失去掌控力,朝著快樂的方向是不可能把握到的。 [04′08″]</p>
<p>   所以要看一看是不是自己在朝著非理作意的方向了。當我們說:「你又非理作意了!」好像是一個對自己的負評,但是卻是一個發現。如果發現自己在非理作意的話,那就想想非理作意的結果——會造惡業,造惡業的結果就是自己會痛苦、他人也會遭殃,所以這個時候就要把非理作意的續流想辦法停下來,或者讓它變弱。 [04′39″]</p>
<p>   那麼如何讓煩惱不要像蓄水池一樣一直蓄積的辦法,就是截流啊!如何截流呢?就是在每一次心對境的時候,不要再用非理作意的方式增長煩惱。因為人生有很多的痛苦、不如意、求不得等等,諸多的麻煩,很多的境界不是自己希望遇到的,有的時候是很突如其來的,有的時候是意想不到的,種種不如意。那麼如何提起警覺的心,不要被瞋恨的火燒掉了自己的功德林呢?對境的時候能夠提起一個警覺的心,就變成是非常重要的事情。 [05′32″]</p>
<p>   當大家討論到這個問題的時候,會發現我們用忍的,就是對境的時候先不要發作,比如說不要對別人口出不敬,也不要用眼睛瞪別人,先把這些忍了;但忍了之後,是不是在內心裡真的能夠消融掉呢?可能又會變成一種不愉快、胸悶,或者生悶氣的方式,就把它留下來了。留下來那個東西並沒有好好地處理,因為它有的時候在意念上其實還在自言自語,或者說自己內部還有一個聲音一直在非理作意,續流還沒有停下來,但是身、口是防住了。身、口防住了也是一件很不容易的事情,但如果能進一步地把非理作意的意樂部分能夠防住,才能夠不蓄積煩惱,對吧? [06′30″]</p>
<p>   那麼如何去防範呢?從我們聽聞的教典中會得到正念、正知,所以每天的聽聞就很重要。為什麼呢?因為當我們有了很大量正念、正知這樣的正能量的輸入之後,才能會在六根的門頭豎起一面明鏡,在對境的時候照到非理作意的存在,能夠照清楚這就是非理作意。照清楚是什麼?就是我們能夠覺察到意念的正在進行式,非理作意一開始,然後就覺察到了。有些人是非理作意一段時間覺察到了,可是前面的非理作意到底是什麼?有人記不清楚,有的人能記得很清楚。總之越早追蹤到它越好,而追蹤到它那面明鏡一定就是從聞法上得來的——聞法、憶念正念,然後獲得正知,這樣得來的。所以它是要常加訓練的一個功夫。 [07′35″]
<p>   每天的晨起發心很重要,要讓自己有一個警覺心:今天不管遇到怎樣、怎樣的境界,我的心都要朝著正念的方向去串習,要制止非理作意,因為非理作意會帶來痛苦。當發現那個境界又來了,來了之後隨眠的煩惱被攪起來了,發現之後立刻就停,這樣就不會蓄積;如果停不下來就會蓄積。 [00′34″]</p>
<p>   如果及時發現了,需要處理一下。請問蓄積的這種不愉快的情緒,怎麼處理啊?它是一種苦受啊!怎麼把這個苦受處理掉呢?就是不太痛快的這種心情怎麼處理掉呢?要轉啊!怎麼轉呢?有很多種方式,比如說聽《廣論》、聽全廣是一種方式;有的同學是拜三十五佛,拜完就覺得很開心了;出家就承事善知識啊、承事僧眾啊,在家就承事父母啊,或者為大眾做一些事情。總之要從那個非理作意的續流轉到一個善的續流上。而那個善的續流要很強,這個時候才放著,不要還在非理作意的續流上的時候你就不管、就休息了,因為它做夢可能都在增長。 [01′24″]</p>
<p>   所以這一段時間大家在探討這個問題,尤其是小朋友都開始注意到這個問題的時候,就很小心對境造意業這個部分。一旦開始小心警覺這個部分的時候,我們會發現:到底苦樂的那個權利是放在誰手裡的?我們一開始修行的時候都發現是境界做主、他人做主,如果他人說幾句很歡喜、感恩的話,我們就會高興;說幾句不中聽的話,就會不愉快。我們的心情是非常非常浮動的,非常容易被境界之風吹動,是完全沒有自在的。 [02′13″]</p>
<p>   在完全沒有自在的這種現狀和習慣下,我們要得到一點主動權,通常都有一些困難。但是只要開始了之後,就不要一直打擊自己,比如說今天發現我開始警覺的時候已經晚了、已經很難自控了,就不要接著又給自己貼一堆標籤:我不能修行啊、我業障重啊、我笨啊、或者我煩惱盛啊......,一大堆標籤就貼出來,這個時候就是跑題了。不要跑題,繼續地觀察,然後耐心地去尋找原因。 [02′49″]</p>
<p>   在上百起、上千起貌似失敗的心對境的安立之中,我們會觀察、會把它列為例子,我們會發現:欸!我覺察到煩惱的速度比以前要快了,雖然我還是控制不了,但是我覺察力變快了、變敏銳了,洞悉煩惱動向的這個慧眼已經變得很清澈了、看清了。然後我會發現煩惱不會有那麼多理由,而正念卻有很多理由了。總之,在看到自己煩惱很多,幾乎是一對境就產生煩惱的時候,請大家不要輕易地打擊自己。因為這就是我們開始準備出征了,要征服煩惱——無始劫來的煩惱。 [03′35″]</p>
<p>   所以一開始的時候要朝正向的作意鼓勵自己,哪怕我有一念覺察,我有幾念提正念,然後接下來全部都是非理作意,那幾個正念就是光亮,就是我手中的希望,要朝著那個地方鼓勵自己。一定要堅持下去,不要蓄積非理作意,不要蓄積負面情緒。怎麼做到呢?先要覺察,然後設法停止;如果停不下來,能夠越快覺察也好。如果停不下來全部,我可以停下來少部分,或者那個很濃的量變淡、沒有那麼強、變弱,這都是一個進步。 [04′22″]</p>
<p>   總之,希望大家能夠朝著進步的方向總結自己。每天如果覺得造了一些惡業,或者你觀察到有很多惡業,那麼晚上就念一遍三十五佛。如果沒有時間拜,念一遍也是功德無量。把三十五佛念一遍、懺悔一遍,然後再休息。每天持之以恆地做下去,一定一定會有收穫的! [04′47″]</p>
<p>   把最近我們討論的這個很鮮明的議題供養給諸位,希望大家也能從中受益! [04′57″]
<p>   大家好!又到了我們一起研討《廣論》的時間了,今天想繼續研討師父講的舊版《廣論》。在討論之前,希望大家能夠好好地端正自己的發心,用一個大乘的意樂:我是為了能夠成就究竟的正等覺的佛位,來聽聞《菩提道次第廣論》。那麼為什麼要成就那樣一個佛位呢?因為只有成就那樣的佛果,才能夠令所有的有情從痛苦中解脫出來。我們先安立這樣的動機,為了這個而作聽聞。 [00′46″]</p>
<p>   也可能在開始聽課的時候你很辛苦,就是工作呀,或者身體不舒服、很疲憊。如果你現在很疲憊的話,可以深呼吸一下,調整一下自己的呼吸,這樣的話可能就不會那麼有壓力,不舒服會有一種緩解。然後慢慢地把你的心放在法義上,放在說法的這個音聲上。其實身體不舒服或者疲憊,聽一聽不一定會更累。像我自己的經驗就是當我很不舒服的時候聽師父講的《廣論》,每次聽都會覺得比不聽的時候要舒服。因為聽的時候可能是忘記了,但是有的時候可能是得到一種加持,就會感覺到身體都很舒適,心情也很愉快! [01′40″]</p>
<p>   好!那我們現在就來聽一小段。 [01′46″]</p>
<p>   平常我們常常說大乘而不用「大車」,那個地方大車是有個原因的。在《法華經》上面這個羊、鹿、牛車那個譬喻呀,佛就告訴我們,佛出世真正的目的都把最好的東西給一切眾生。所以比喻當中說不同的根性引誘他,但是最後都是同一的大白牛車。所以這個「大車道」就是表示這個才是真正最圓滿、最徹底、最究竟、最正直的。現在到大師就見到了前面的這種不理想的情況來解釋:啊!原來這個才是最殊勝、究竟、圓滿的道路。從這地方我們就了解本論真正的內涵,實在是無比的精采、無比的圓滿! [02′54″]</p>
<p>   在這一小段裡提到了「大車」,又講到了「《法華經》」。諸位有多少人讀過《法華經》?可以去試著誦一遍。很多鳳山寺的法師是會背《法華經》的。 [03′15″]</p>
<p>   這裡面那個著名的譬喻就是不管是羊車也好、鹿車也好、牛車也好,最後佛陀都希望我們能夠乘上大白牛車,就是能夠走上大乘成佛之路。那麼在這裡邊師父說:「<p> 佛出世真正的目的<p> 」,注意!「<p> 佛出世真正的目的都把最好的東西給一切眾生。<p> 」這裡邊提出了誰呢?是佛陀。那出現在世間,什麼是真正的目的呢?就是要把最好的給誰呢?一切眾生。 [04′05″]</p>
<p>   所以這裡邊就涉及到最好的東西,和接受這個最好的東西的人——就是一切眾生。那麼何謂最好的東西呢?這個最好的出現之後,眾生真的會認識它的價值嗎?比如說從來沒有見過,會覺得這是最好的嗎?佛陀認為的最好的,可是眾生就會認為這是最好的嗎?那麼怎麼樣彌補中間的距離呢?所以師父說:「<p> 比喻當中說不同的根性引誘他<p> 」,就是要找出我們眾生能夠相應的點,讓我們對這個產生好樂心,然後跟著佛走走,發現:喔!最後那個大白牛車才是最殊勝的! [04′57″]</p>
<p>   佛陀會根據不同根性的有情因材施教,雖然他已經找到了最完美、最殊勝的,但是在我們都不認帳的狀態下,佛陀還是想了辦法。我們通常幫一個人,說:「我這個是最好的,你認不認?」「不認!」那拂袖而去,只能說你不識貨!但是佛陀沒有因為我們不認識就拂袖而去,而是繼續像慈愛的母親一樣。我們身體需要什麼?好的食物,可是我們因為口味——我們小的時候都犯這種問題——就是不吃,然後媽媽就很焦灼,想各種辦法讓我們吃對我們身體最好的東西。它這裡邊就是因為不同的根性,所以設置了羊車呀、鹿車呀、牛車呀,然後告訴這個小孩:「很好玩啊,快來吧!」然後大家很高興跟著去了。所以再一次地想念佛陀的悲心、憶念佛陀的悲心。 [05′56″]</p>
<p>   師父在這裡邊接著又說了「大車道」,說:「<p> 表示這個才是真正最圓滿、最徹底、最究竟、最正直的。<p> 」師父是這樣解釋的,看起來是在詮釋一個大乘道。我也聽過師父對大車道的另一種解釋,可是在第一遍的《廣論》裡,師父只是就《法華經》的部分,解釋了這個要走大乘。 [06′20″]</p>
<p>   這個「大車」其實它是指龍樹菩薩與無著菩薩,他們以聖位菩薩的行相,不需要依靠他人所寫的解釋而善巧地解釋佛語的密意,開啟了中觀和唯識兩大宗派,好像拓了兩條大車行的那個道一樣——大道,所以稱為大車。「大車道」是指兩位大車所說的道,佛陀親口授記了這兩位能夠無誤地解釋佛陀的密意,所以後學一定要依靠大車的解釋才能夠了解佛陀的密意。而宗大師就是依據傳承的教授,解釋了大車所說的道次第。其實大車和大車道有一個這樣的意思,但是師父在此處就從《法華》的角度解釋了這個問題。 [07′16″]</p>
<p>   師父在這裡邊解釋大車道,表示這是真正圓滿、徹底、究竟、正直的。那麼怎麼樣是真正圓滿、最徹底、最究竟、最正直呢?我們真的得去學習龍樹菩薩和無著菩薩的論,才能夠了解佛陀的密意到底是什麼。 [07′39″]</p>
<p>   接著師父說:大師看到了前面那種不理想的情況之後,就「釋此大車道」。看看!佛菩薩面對困境的時候,他的選擇永遠是積極進取的,去找方法解決這個困境,而不是看到了:「啊!修行人都有這麼多困難。」然後坐那兒哀嘆啊、抱怨哪!沒有選擇這種行為,而是選用見到這樣,所以來解釋大車道,讓大家認識到這才是最殊勝、究竟、圓滿的道路。然後說:「<p> 從這個地方,我們就了解本論的真正內涵。<p> 」為什麼說是無比地精彩、無比地圓滿呢?因為它詮釋的是佛陀最好的那條路、最好的那條路。給我們選的是非常地精彩、非常地圓滿,如果我們沿著大車道去了解這個的話,就一定會了解到佛陀的密意。所以師父在這裡邊發自內心的讚歎、發自內心的感恩、發自內心地珍惜本論的精彩和圓滿,引領著我們好好地學。 [09′03″]
<p>   大家好!又到了我們一起研討《廣論》的時間了。請大家端正一下自己的動機,把自己的續流從平常忙碌的那些事情上轉到聞法上。觀察一下自己為什麼要來研討《菩提道次第廣論》呢?應該用什麼樣的動機才能跟這樣的法相應呢?就是一定要再安立:為了利益無窮無盡的有情,我必須希求佛果、成就無上正等菩提,將來才可以利益無量無邊的如母有情。那麼成佛的因到底是什麼呢?因一定要先知道,要想知道這樣的因就必須要聞法,所以聞法的時候注意要專注,要將所聞的法義結合內心。 [00′58″]</p>
<p>   今天我們來學習師父講的下一段<p> ,<p> 這一段師父是從他的經驗來說的<p> 。<p> 說剛開始學習佛法的時候遇到了種種的困境,最後是接觸到了本論之後解決了這些困境。可以從這個經驗中,知道《菩提道次第廣論》本身是會解決修行人遇到的困境的。大家可以聽一聽,師父到底剛開始學的時候示現遇到了什麼樣的困難呢?《廣論》又是怎麼解決的呢?好!大家開始聽! [01′41″]</p>
<p>   以我個人的體驗來說的話,我當初修學佛法以後,也是遭遇到種種困難。那個大乘、小乘固然是彼此間有種種諍論,乃至互不相容,可是對我們畢竟比較更隔閡一點。南傳是小乘的,我們都是大乘的。但是就以我們目前來說嘛,我們同樣是大乘的,對不起!這個裡邊又有各式各樣的問題。有說性宗、有說相宗,然後呢又是教下、又是宗下,有人講修行的,有人講這個。乃至於同樣的宗下,對不起,它有五家七宗;同樣的念佛嘛,它又有這樣的不同的法門,大家互相彼此間不能相容,我實在是覺得不曉得怎麼辦是好! [02′43″]</p>
<p>   這一小段,師父說自己「<p> 當初修學佛法以後,也是遭遇到種種困難<p> 」,這個「也是」就是很多人學佛法其實會遇到困境。那麼師父遇到的困境是什麼呢?說大小乘縱然有種種諍論,但是好像還好,主要是大乘內部的;同樣是大乘的,性宗啊、相宗啊、教下呀,乃至各種法門、念佛法門之間,當我們不會融會貫通的時候,就會發現彼此好像是不能相容的樣子。然後說:「<p> 實在是覺得不曉得怎麼辦是好!<p> 」比如說看一個禪宗的,然後看個淨土的,再看看天台宗的......等等,接觸很多法門之後,聽得很多,但是要自己用功的時候都不知道怎麼辦了。 [03′43″]</p>
<p>   像我想起來有一些居士說:「到底是念阿彌陀佛呢?還是念觀世音菩薩呢?」「是念觀世音菩薩呢?還是念地藏菩薩呢?還是念文殊菩薩呢?」甚至觀想佛像要打坐的話,到底是觀想觀世音菩薩呢?還是觀想文殊菩薩呢?這問題好幾年都決定不下來,覺得好像哪個都行,又覺得哪個都捨不下。到最後就莫衷一是,陷入猶豫的困惑。 [04′17″]</p>
<p>   像之前大家都聽過一個公案吧!就是有一個人他在思考因果的問題,不知道這因果到最後是怎麼回事?後來他就去問一個修行人,說:「如果是大修行人的話,還落不落因果呢?」那個人就回答他說:「不落因果!」然後就是因為「不落因果」這句話,他得到了五百世的野狐身。這個故事很有名喔!其實他就答錯了一個字,應該答「不昧因果」,就是非常非常有修行的人不是不落因果,好像因果的法則在他身上失效了,不是這麼回答!而是說他不愚昧於因果,他會對因果了了分明、毫釐不差地精勤持戒。 [05′11″]</p>
<p>   就一個字喔!你想想,當我們對一個問題起了疑惑之後,如果是真正的疑惑,就會梗在心頭啊!然後你會一直探索這個問題,可能跟很多人探索,但是你得到答案並不是很滿意,然後自己去看經典、看論典,好像看得疑雲更重了,一個問題在心裡有的會鬱積十年。像那個人問了因果的問題,後來給他答的是這樣答的,如果他信了的話,說:「最有修行的人就不落因果」,好像因果法則在他之外了。如果這樣去修的話,也是非常危險的! [05′54″]</p>
<p>   所以當我們很想修行的時候會遭遇到種種困難,師父說:「<p> 不曉得怎麼辦是好!<p> 」因為對這件事非常認真啊!我們是非常非常認真用生命來求解脫,希求證悟的體驗。可是一旦陷入疑惑,沒人指導、問不到答案的時候,真的是非常痛苦的。 [06′25″]
<p>   那麼再聽下一段:<p>   一直等到接觸了本論,乃至了解了本論了以後,不但把這個問題整個解決,彼此不但不矛盾哪,而且彼此間都是互相呼應,互相呼應,所以真正的關鍵就是我們沒有了解圓滿的教法。這地方我要隨便一提,譬如說我們現在修行,那麼大家也許誤會了:哦!要我們樣樣學會了以後然後再來。不是這個意思,照樣地你念佛的是念佛,我參禪的是參禪,可是假定你善巧地了解了這個方法以後,你參禪也好、念佛也好,結果是大不一樣。 [01′01″]</p>
<p>   在不知道如何是好的這種痛苦中,師父說:「<p> 一直等到接觸了本論<p> 」,直到《菩提道次第廣論》出現了,然後「<p> 乃至了解了本論以後,不但把這個問題整個解決<p> 」,注意喔!是有「<p> 整個解決<p> 」這四個字,它解決的幅度是比較徹底的。然後,發現了彼此不但不矛盾,而且是互相呼應的,所以想想那時候該多麼地驚喜呀!大家都知道師父走到任何地方、天南海北任何國家,他的僧袋裡永遠都背著這本論,還有弘一大師的《南山律在家備覽》,還有《般若經》。「<p> 所以真正的關鍵<p> 」,師父說:我們到底有沒有了解圓滿的教法?如果了解了圓滿的教法,我們就會對佛教內部的各家各派自然有一番圓融的見解。 [02′14″]</p>
<p>   所以後來師父教我們:不論你是念佛的也好,念佛的就繼續念佛,參禪的就是參禪的,都可以學習本論,都可以了解本論。可是學了和不學有什麼差別呢?如果善巧地了解了這個方法之後,那麼參禪也好、念佛也好,注意那幾個字:「<p> 結果是大不一樣!<p> 」就是圓滿的教法它所呈現的這個見解、修行的次第,會給予修持不同法門的修行者一個非常大、非常大的指引和幫忙,解除疑惑,並且可以讓我們不停地校對自己的方向精不精準——內心的方向、見解......很多。所以學習本論之後,無論是參禪也好、念佛也好,不論是學什麼法門,結果是大不一樣的! [03′21″]</p>
<p>   所以師父一定是懷著非常非常喜悅的心,遇到了《廣論》、發現了《廣論》、了解了《廣論》,然後才把這本論介紹給我們這麼多的修行人,希望我們能夠真正地解決自己的修行難題,而且能大大地增進我們用功的進度。同樣的時間去用功,一旦你了解了正確的方法之後就不會走彎路,尤其是——那句話很有名,「寧可千年不悟,不要一日錯路!」一旦錯了之後就不知道錯到哪裡去了,是比較危險的。 [04′00″]</p>
<p>   無論我們是學習什麼法門,只要了解了圓滿教法的這個次第,都可以在我們的困境上給我們一個相當精確的指引。舉個最簡單的例子,比如說我以前就特別相應於念死法門,但是到底是怎麼樣念死呢?怎麼樣把念死結合淨土法門這樣去修持呢?那時候會發現各人有各人的想法,大家都沿著自己的想法去念死。可是等到學習《廣論》之後,《廣論》上念死的那個法門——三根本、九因相是如此地清晰,條分縷析非常清楚,你照著修即是了。對不對?很明晰吧! [04′48″]</p>
<p>   還有比如說修皈依,到底要如何皈依呢?上寺院裡請師父幫我們皈依,領皈依證,然後回來到底要做什麼呢?去參加法會,或者吃素、做善事,到底要怎麼皈依呢?我們就會理解為「我有一個皈依師父」;但是三寶的功德到底是怎樣的?如果不學習的話,其實佛、法、僧三寶的功德是不了解的,皈依學處到底是什麼也不是很清楚。但是一旦學了之後,你就會發現很多很多修行的祕密,在《廣論》裡全部寫得非常清楚,而且完全不給人一種玄而又玄的感覺。它非常清晰明了,像一個非常非常亮的燈照著腳下的路,讓我們在那些幽暗取捨的地方,非常非常清楚——向左、向右走、向前幾步走——非常清晰的次第,不會走著、走著就迷惑了。 [05′45″]</p>
<p>   一看《廣論》,總有一種心明眼亮的感覺,尤其是學到空性的部分。講到空性的部分,我們就是讀《金剛經》啊、讀《心經》啊,可是到底空性的次第是怎麼修的?到底空性的見解什麼樣是最純粹的?沿著這樣的見解觀修了之後,確實能夠解決生死輪迴,而不會修到斷滅空,甚至因為錯修了這個去墮落了;或者因為錯解空性,結果還把業果見廢除了,認為不需要重視因果,甚至也不需要重視戒律,產生了這樣奇怪的看法;或者一切都空了,什麼都不在乎了,產生了種種可怖的偏差。 [06′35″]</p>
<p>   可是一旦學習《廣論》之後,我們會發現:哇!空性的見解、依止善知識啊、積累資糧啊、小心持戒啊,它有一個嚴格的次第。而且對於空性見解學習次第的討論辨析方面,真的是太多浩瀚的典籍,可是《廣論》就把它鋪設得非常清楚。乃至修習菩提心,我們發了一點心就覺得自己是菩薩了,但是到底是發什麼心?這裡邊就提到七重因果、自他換,尤其是提到「增上意樂」,如果不這麼明晰地指出增上意樂的話,我們其實不了解菩提心真正的定義是什麼。我們會把一個普通的發心,跟真正的菩提心完全混為一談,而且也真的不了解什麼是修習菩提心的次第,比如說七重因果、自他換這兩個傳承,到底去哪裡求呢?聽都沒聽說過!自己閱藏能不能閱明白呢?不一定!就算能,花多少辛苦才能閱出來七重因果和自他換呢?而且它還是建立在出離心的基礎上,自己如果不想從三界裡出離的話,如何對沉淪於三界的有情發出真正的慈悲心呢? [07′52″]</p>
<p>   所以它這個嚴格的次第,真的是每一步都非常清晰,解決了我們修行人多少焦灼、多少探索的迷惘,還有那種怎麼想也想不明白、走投無路的痛苦!真的像一盞燈一樣,陪伴著我們在多少個、多少個修行的岔路口,讓我們非常輕鬆地就走上了康莊大道。 [08′21″]</p>
<p>   這都是師父對我們的深恩啊!一旦這樣的一本論在手,捧讀它的時候,千萬不要覺得這個值遇的因緣是很容易的,然後就產生輕忽,甚至不去很珍惜值遇道次第、值遇師父講說道次第這個因緣,那真是太遺憾了吧!所以大家一定要好好地學習,好好地珍惜能遇到這樣圓滿教法的這一次暇滿人身的機會! [08′57″]
<p>   大家好!又到了我們一起研討《廣論》的時間了。最近想問大家《般若經》有沒有堅持誦啊?有沒有時間拜《三十五佛懺》?就算沒有時間,可以每天念一遍嗎?有沒有在佛前常常地頂禮?有沒有注意到孝順父母啊?每天要問候或者承事父母親;如果父母不在的話,也可以誦經迴向給他們。總之,生命對我們來說每一天都很珍貴,要用自己的存活之際多造善業,這樣的話,對現生和來世都有無量的利益。 [00′48″]</p>
<p>   前兩天我們有討論到一個主題:當有事情發生,內心開始不寂靜或者不痛快、生煩惱的時候,到底是轉外境容易,還是轉內心容易呢?我們習慣性地都是希望別人能改,會非常輕鬆地看到別人的過失。為什麼呢?因為這個習慣太熟悉了,一下子就會看到別人哪裡錯了,或者沒有配合我,所以讓我心裡不舒服。看起來只要讓別人不這樣說、不這樣做,或者今天不要發生某種事情,就會過得很舒心,至少不會這麼挫敗。似乎世界上痛苦的原因,都是在他人、在境界那方面。所以我們無始劫來養成的習慣,就是觀察他人的過失,在境界上糾纏、過不去,沒有去反省自己在煩惱發生的過程之中到底要負一些什麼樣的責任。 [02′08″]</p>
<p>   寂天菩薩在《入行論》裡有這樣說:「<p> 佛說彼一切,皆由惡心造。是故三界中,恐怖莫甚心。<p> 」在三界中最恐怖的到底是什麼呢?是那些猛獸、是毒蟲、是他人造作的災難,還是自然災害等等?當然這些都是很恐怖的,但是在《入行論》裡寂天菩薩說:最恐怖的,實際上是自己的心!在三界中,心是最恐怖的! [02′43″]</p>
<p>   雖然很多人都讀過《入行論》、也背過《入行論》,但是我們是否有足夠的時間認真地去思考一下:為什麼菩薩把最恐怖的因素或者說那個根本列為「心」呢?這樣的看法是正確的嗎?有什麼依據嗎?為什麼他要這樣講呢?因為我們每天都小心著外面、小心著他人對我們的傷害,甚至小心著氣候呀,小心著各種各樣的問題。但是如果最恐怖的是自己的心的話,我們會小心自己的心嗎? [03′29″]</p>
<p>   所以佛菩薩都認為生死輪迴的各種痛苦到底是出自於哪裡呢?說顯然是出自於內心。出自於什麼樣的內心呢?就是不調伏的內心。因為內心不調伏的緣故,就會產生怖畏。那麼我們怎樣才能夠去除現生以及未來世的怖畏呢?就是要把心中的苦因拿掉。但是由於我們沒有熟練地掌握調伏內心的辦法,所以在對到境界的時候會第一千次、第一萬次地去尋覓境界的過失,會一直著在他人的過失上;時光都浪費了,沒有時間看自己內心的過失、沒有時間檢查自己。因為無始劫來的續流真的是像瀑布一樣,一刻都不停地去觀察境那方面的問題,所以我們就虛度了很多可以檢束內心的珍貴光陰。 [04′37″]</p>
<p>   從這點上來看,如果由於我們內心有煩惱、有各種障礙的緣故,產生了種種痛苦,那麼問題的答案就出現了!到底苦惱來的時候是調伏境,還是調伏心呢?那就要看看痛苦的根本在哪裡?如果痛苦的根本在境上,那就去解決境;如果痛苦的根本是心上的無明和煩惱、各種障礙,那麼就應該去解決內心的障礙,這樣就不會痛苦了。 [05′10″]</p>
<p>   所以一切不順的,或者說各種各種痛苦,追根究柢都是來自於我們未馴服的這個心續。如果我們對這樣的一個見解能夠在內心中確立,並且常常去串習的話——會不會忘?會忘!忘了再提起來——那麼每天之中大大小小、林林總總的事情,總是在提醒我:「這種痛苦是源於我未馴服的心。」那麼這樣的作意就可以了嗎?還要轉念!當有一件事情發生之後,我們會發現內心著在境那方面是很嚴重的,很少會把那個力量抽回來,看看自己內心的念頭出了什麼問題,或者說自己的等流有什麼問題,或者動機有什麼問題。因為全部的時間都在計較他人的問題和境界上那方面的問題,就是沒有時間來反省的。 [06′16″]
<p>   如果有時間來反省的話,好像湖水,靜靜的時候才能夠映出天上的星星和月亮,我們內心也是。寧靜了之後,才會發現自己生命中更深一層的問題。所以步調不能太快、太雜亂、太匆促,因為這樣,我們就無法關注內心、無法看那些念頭。在二六時中的工作中、學習中,在家庭中、大大小小的這些事物之中,請大家要稍微放緩一下腳步。放緩腳步做什麼呢?凝視一下自己的心。要記得三界中最恐怖的就是內心了!因為最痛苦的根本存在於內心,所有的痛苦的來源,是我們並未調伏的心。 [00′59″]</p>
<p>   佛菩薩來到世間告訴我們這樣的真理,我們在內心中能夠樹立這樣的見解,反覆地去練習的話,自然會嚐到修習佛法的甜頭。你會發現:實際上改變內心比改變外境容易多了,因為他人的心是很難把握的。我們如果靜下來看一看自己的心,每天看一看、每天看一看!大事看一看、小事看一看、凡事都看一看!我們就會越來越熟悉自己的心,會熟悉自己對境的那個套路,你會知道這個事情來了我會怎麼想,是怎麼發生的,然後把它那個方向變成是向內調伏,馴服我這顆未馴服的心;讓良善能夠生起來、寬恕能夠生起來;對他人慈悲,對父母親啊、師長、三寶,甚至一個陌生人、一個他有情,我們都應該恭恭敬敬地對待。這樣的話,就不會產生很多雜亂的、痛苦的這些因。所以每天起來的時候,如果提一下這樣的正念,這樣一天的生活之中我們就會少造很多惡業,因為我們會有一個正知力在關照自己的三業。 [02′21″]</p>
<p>   長此以往這樣地用功下去,自然我們就會習慣於遮止三門的惡業,習慣在身語意上去造作良善的念頭,慢慢地讓我們的善業像瀑流水一樣絕對不會停止,而且越來越增長、越來越增長。這樣的話,我們在現世的時候就會收穫一個平靜的、調柔的、感恩的心;不會用語言去刺傷別人,或者對他人的付出很麻木,或者凡有事情發生都是他人的錯;我們就非常容易反省自己;就會在生命裡發現很多很多美好的、值得珍惜、值得感恩的事情。 [03′09″]</p>
<p>   所以到底事情發生的時候是轉境容易,還是轉心容易呢?也希望你們可以討論一下。我覺得這個討論是非常具有價值、非常具有意義的!雖然經典上講了很多次了、佛菩薩耳提面命地常常叮囑我們,但是心對境就會迷失,我們就會認為凡是境界那方面都是出問題的。可是三界中最恐怖的莫過於這顆心了,它會出生一切痛苦;當然你好好修行它的時候,它就會出生一切快樂,所以大家要好好地努力! [03′53″]</p>
<p>   另外,當我們開始注意到很多的痛苦、甚至所有的痛苦的根本,都是出自於內心的時候,我們就會發現:在跟他人相處的過程之中,到底是把自己放在重要的位置?還是把他人放在重要的位置?是愛自還是愛他?我們都知道我們有我愛執,所以當有事情發生的時候,自他還是不公平的。我們常常讓他人退居在角落,然後把自己放在一個堂而皇之的非常非常重要的位置。實際上,這就是苦因,佛說這就是苦因。 [04′33″]</p>
<p>   如果能夠好好地信受佛所說的話,調整自己以自我為中心這樣的一個習慣,變成是愛他勝自——愛惜他人勝過自己,把這個習慣慢慢地調伏過來。然後把特別愛重自己的這個不調順、未馴伏的部分把它調伏,調伏到非常非常地尊重他人,能夠把他人放在自己生命最重要的位置。《入行論》裡也有講:佛陀是這樣做的,所以佛陀得到了一切快樂;那麼眾生呢?是把自己放在最重要的位置,所以就成熟了太多的痛苦。所以看一看兩者的結局,就應該知道選擇什麼樣的思想、什麼樣的行為。 [05′35″]</p>
<p>   說到此,就是希望我們真能夠把佛菩薩講的教言在內心裡好好地思考、好好地珍惜,因為能夠聽到這樣一句「愛他勝自」,真的是非常非常不容易的!如果能夠把愛他勝自列為生命的宗旨,生生世世實踐的話,我們生命的視野會特別地開朗。在我們每日的很多很多的觀察之中,我們眼裡自然會看到他人的好、他人的付出、他人的不容易、他人的艱辛。這樣的話,我們就好像在黑夜裡不會老是習慣注視黑暗,會習慣去看到滿天的星辰。 [06′29″]
<p>   好!下面我們就聽師父的帶子。<p>   我現在隨便說一個例子。我請問,譬如說我們目前來說,這個念佛是最多,實際上呢也的的確確適應我們目前的機,是最善巧的一個法門。在末法的時候,我們要想解脫這個苦惱的最善巧的法門,莫過於念佛是千真萬確,但是祖師告訴我們說這是萬修萬人去,這也是千真萬確的事實,為什麼我們修了半天修不去?這不是一個大問題嗎?當然這個原因很多,那麼,這個地方我簡單地說明一下。說我們所以為凡夫不能去的原因是為什麼?因為我們業障很重,而我們的智慧資糧不夠,所以我們要把業障淨除,然後呢資糧積聚了,那麼然後你拿這個功德迴向,如果夠的話,你就能夠往生,這是很明白的一個道理。 [01′20″]</p>
<p>   現在我們其他的不談,說現在為了要求念佛,然後我就單單念佛,這個好。可是我們往往產生一個問題,因為剛才說的,眼前事實上面大家沒有圓滿的教授,所以往往啊除了自己走自己的這個一門以外,往往彼此間哪不能互相認識,乃至於排斥。「排斥」,這事情是有非常嚴重的障礙的。 [01′59″]</p>
<p>   師父在這一段說:念佛是很多的,實際上的的確確適應我們目前的機,但是祖師說這是萬修萬人去的千真萬確的事實,為什麼我們修了半天沒去?師父說:「<p> 這不是一個大問題嗎?<p> 」原因是很多的。師父舉了其中的一個原因,就是業障重、智慧資糧不足。如果業障能夠淨除、資糧積聚了的話,拿這個功德迴向,自然就能夠往生了,說:「<p> 這是很明白的一個道理。<p> 」 [02′40″]</p>
<p>   可是這是對於不能往生、不能去的原因的分析,就是去的功德和淨化的業障不夠,所以拿來迴向的話不夠往生極樂世界。那麼為什麼不夠了呢?師父在下一段說:「<p> 其他的不談。<p> 」在這裡邊列舉了一個「排斥」。排斥什麼了呢?自己要走一門深入的這個法門之後,排斥其他的,師父說這是會產生嚴重障礙的。 [03′14″]</p>
<p>   那麼為什麼內心裡會排斥呢?師父說:「<p> 眼前事實上面大家沒有圓滿的教授,所以往往啊除了自己走自己的這個一門以外,往往彼此間哪不能互相認識,乃至於排斥。『排斥』,這事情是有非常嚴重障礙的。<p> 」所以他那個起因,師父歸結為:因為沒有得到圓滿的教授,自己就走自己的這個門,其他的都不認識。第二步,因為不認識,乃至於排斥,排斥是有很嚴重的障礙的。 [04′03″]</p>
<p>   那麼到底為什麼在這裡提出了「排斥」,然後提出了這個嚴重的障礙?難道是排斥會造成往生的障礙嗎?去極樂世界的障礙嗎?如果這樣的話,問題就太大了!所以接著大家往下聽。 [04′25″]</p>
<p>   佛說得清清楚楚,他為了幫助一切眾生,所以啊求各式各樣的法門。所有的法門它無非是解決一切眾生的種種方便的這個法,法無大小,本身最主要的應機、應機。而每一個法都經過佛無量劫捨頭目腦髓,這樣積聚起來的,所以它有它的無比的價值在。我們現在隨便輕輕易易地否定它、毀謗它了,不知不覺當中造成功這個謗法的障礙。我們修學佛法的人都應該了解,佛經裡面告訴我們,你造五逆十惡,諸佛菩薩有辦法幫忙你啊懺悔解除,你謗了法,對不起!沒有辦法。結果我們現在修行的人自己謗了法了,請問這個是什麼?增加無比的障礙!你說辛辛苦苦地念佛,念佛的功德不一定得到;你隨隨便便排斥別人,產生了絕大的障礙,你這樣的一點點你就能去了嗎?不但不能去啊,而且是積累了很多罪過,所以在這一點我只隨舉一例。 [05′56″]</p>
<p>   剛才說「排斥」是源於沒有圓滿的教授,除了自己這個一門深入之外,彼此都互相不認識,甚至產生了排斥。那麼排斥到什麼程度呢?師父在這一段裡就直接引申到謗法這個非常非常嚴重的問題。學了《廣論》的老同學都知道謗法是非常非常恐怖的,為什麼呢?因為「<p> 佛說得清清楚楚,他為了幫助一切眾生,所以啊求各式各樣的法門。所有的法門它無非是解決一切眾生的種種方便的這個法,法無大小,本身最主要的應機。<p> 」這是師父剛才講的。 [06′50″]</p>
<p>   那麼「應機」,就是適應各種眾生的根機、心量。為了應機,每一個法都是經過佛無量劫,無量劫!大家要知道無量劫有多長的時間!多長的時間做什麼呢?「<p> 捨頭目腦髓,這樣積聚起來的。<p> 」就是一個一個積聚起來的無量法門。「<p> 所以它有它的無比的價值在。<p> 」佛陀是用生命換來的,不是用一生的生命,是用多少生、多少世的生命換來的這麼一個珍貴的法!可是由於我們不了解它的緣故,就認為它沒有價值,只有我現在學的有價值,其他人學的都沒有價值;忘記了其他人學的,也是佛陀無量劫來用頭目腦髓換來的。注意!師父在這裡邊用了幾個字:「<p> 我們現在<p> 」,注意聽喔!注意聽,不要走神!「<p> 我們現在隨便<p> 」,師父用了「隨便」,然後「<p> 輕輕易易地否定它、毀謗它了。<p> 」注意!「隨便」,何等輕鬆的、不在意的一個態度;「輕輕易易地」,幾乎就是順口就來了,眼神啊、心態呀、念頭上,就非常非常輕鬆地否定了佛陀用生命換來的這麼珍貴的法。用整個生命換來的東西,輕輕地、隨隨便便地就毀謗了、否定了它。 [08′33″]
<p>   謗法的業是怎麼造的呢?隨便造的!要像搬石頭一樣那麼沉重地造嗎?不是的!輕輕易易地就否定它了,是非常非常容易造的。而且師父又在後面說:「<p> 不知不覺當中造成功這個謗法的障礙。<p> 」看這幾個字,用下去是怵目驚心的喔!隨便輕輕易易地否定它、毀謗它了,不知不覺當中造成這個謗法的罪障。師父把我們的現行看得太清楚了! [00′41″]</p>
<p>   那謗法的業到底有多可怕呢?新的學員可能不太了解,老學員都知道,提到謗法的業障,臉色都會變喔!說:造了五逆十惡,佛經裡面說諸佛菩薩還有辦法幫我們懺悔呀;但是謗了法,對不起,就是很難喔! [01′02″]</p>
<p>   所以師父又回過來說,我們辛辛苦苦地念佛想要往生極樂世界,可是由於沒有得到圓滿的教授,不知道其他的法門也是佛陀用無量劫的頭目腦髓換來的,也是為他有情離苦得樂辛辛苦苦地積聚出來的,有無比珍貴的價值。我們不知道這個珍貴的價值,就非常無知地、無知地誹謗了它,產生了絕大的障礙。師父又講一句:「<p> 你隨隨便便排斥別人,產生了絕大的障礙。<p> 」 [01′42″]</p>
<p>   這裡邊有個問題我也在思考:排斥別人就會謗法嗎?我們排斥別人的時候,是否連帶著就會對他所修行的法也持著一種輕蔑的態度?師父說謗了法的,這麼大的一個惡業,「<p> 不但不能去啊,而且是累積了很多罪過!<p> 」在《菩提道次第廣論》3A 的部分,師父就非常勇悍地提出了「謗法」這件事情。 [02′14″]</p>
<p>   很多人是不太了解有謗法這個問題,甚至當時也不知道謗法有多嚴重。所以當提出這個謗法的問題的時候,很多人就看佛經,說:「謗法會這麼嚴重嗎?」在《地藏十輪經》裡邊就廣泛地列舉了謗法會感得什麼樣的結果。還有在《廣論》後面會慢慢地學到,這是一個極大的、會墮落的、在身語意三門造作惡業的門徑。所以師父在一開始的時候就這樣告訴我們:這個地方絕對不可以去!絕對不可以輕鬆地、隨意地否定他人所修學的法門!這樣的話,自己就很難懺悔乾淨。 [03′04″]</p>
<p>   這個發現是很獨到的!一門深入的人,因為對其他的法門缺乏廣泛的了解,也就自然缺乏廣泛的包容。比如說大家都知道有八萬四千法,那麼八萬四千法我們到底能知道多少法?說禪、教、律、密、淨。這些法門之間,師父說他之前的經驗就覺得:啊!大乘和大乘之間總是有一些很難理解的部分,但學了本論之後就全部地開竅、全部地理解了。師父在此處說:當我們修一法就著一法。著在一個法上產生是我慢嗎?還是什麼?總之就是「他人都不行,我最厲害!」因為這個心態謗法!因為沒有學到圓滿傳承而謗法! [03′51″]</p>
<p>   這些都是要提醒我們在二六時中,對於修持其他法門的修行人真的要普同恭敬。要想他修的法也是佛陀傳下來的,絕對不可以用輕蔑的態度輕易地否定別人,說自己好。自己所學的這個法門好,自己就好嗎?這是兩個問題。那麼他人有點毛病,他人所學的那個法門就有毛病嗎?這也是兩個問題。師父在那麼多年前就提出了:一定會讓我們墮落的這個謗法的業,千萬、千萬不能造! [04′26″]</p>
<p>   在這一小段中,師父說:「<p> 佛說得清清楚楚,他為了幫助一切眾生,所以啊求各式各樣的法門。所有的法門它無非是解決一切眾生的種種方便的這個法,法無大小,本身最主要的應機<p> 」,然後師父又說了一遍「<p> 應機<p> 」,重複一下。「<p> 而每一個法都經過佛無量劫捨頭目腦髓,這樣積聚起來的。<p> 」大家會不會覺得:「每個法是怎麼來的我也不知道呀!真的是佛捨頭目腦髓換來的嗎?」這個很多經典裡都有講。我現在舉一個《大乘大集地藏十輪經》卷六的部分。我念一下,你們聽一下就好了,以後也可以回去看整本的經,很多經典裡都有講。說: [05′30″]</p>
<p>   「<p> 善男子,是故若欲於三乘中隨依一乘求出生死欣樂安樂厭危苦者,應於如來所說正法,或依聲聞乘所說正法,或依獨覺乘所說正法,或依大乘所說正法普深信敬,勿生謗毀障蔽隱沒下至一頌,常應恭敬讀誦聽聞,應發堅牢正願求證。毀謗三乘隨一法者不應共住下至一宿,不應親近諮稟聽法。若諸有情隨於三乘毀謗一乘,或復親近謗三乘人諮稟聽受,由此因緣皆定當墮無間地獄,受大苦惱難有出期。何以故?善男子,我於過去修菩薩行,精勤求證無上智時,或為求請依聲聞乘所說正法下至一頌,乃至棄捨自身手足血肉皮骨頭目<p> 髓<p> 腦,或為求請依獨覺乘所說正法下至一頌,乃至棄捨自身手足血肉皮骨頭目髓腦,或為求請依於大乘所說正法下至一頌,乃至捨棄自身手足血肉皮骨頭目髓腦。如是勤苦,於三乘中下至求得一頌法已,深生歡喜,恭敬受持,如說修行,時無暫廢。經無量劫修行一切難行苦行,乃證究竟無上智果。復為利益安樂有情,宣說開示三乘正法。以是義故,不應謗毀障蔽隱沒下至一頌,常應恭敬讀誦聽聞,應發堅牢正願求證。善男子,如是三乘出要正法,一切過去未來現在,過殑伽沙諸佛同說,大威神力共所護持,為欲救拔一切有情生死大苦,為欲紹隆三寶種姓令不斷絕。是故於此三乘正法,應普信敬,勿生毀謗障蔽隱沒,若有毀謗障蔽隱沒三乘正法下至一頌,決定當墮無間地獄。<p> 」 [08′40″]</p>
<p>   所以師父在這裡邊說:「<p> 每一個法都經過佛無量劫捨頭目腦髓,這樣積聚起來的。<p> 」這句話是有經典依據的,不是為了嚇唬我們把它誇大了說的,是在很多經典裡佛親口宣說的。 [09′01″]
<p>   好!接著我們再聽下一段。<p>   那就是說,假定我們了解這個大概的,也不要說最徹底圓滿的,有一個稍微深一層的認識,那時候我們曉得:啊,是沒錯啊!修學佛法需要這樣的圓滿的,我眼前哪只是限於目前的狀態,沒辦法真正地深學、廣學,將來我決定要深學、廣學的!所以先因地上面種下一個要深學、廣學的因,所以懷著這個非常慚愧的心情,現在一心一意只有祈求這個大善知識,念阿彌陀佛,你就只管念你的自己,這是一方面。 [00′52″]</p>
<p>   剛才在聽這一段的時候,大家有沒有回憶到上一段?是什麼原因我們會容易造作謗法的罪呢?是因為我們對圓滿的教授沒有一個清晰的了解。所以在這一段,師父說:「<p> 假定我們了解這個大概的,也不要說最徹底圓滿的,有一個稍微深一層的認識<p> 」,就是對圓滿教法有稍微深一層的認識,那個時候我們就會曉得:哎呀,是沒錯啊!修學佛法需要這麼圓滿的,可是我眼前就是沒有辦法真正地去廣學三藏十二部、佛所留下來的這些教典。比如說《大藏經》就那麼多部,還有祖師們、菩薩們所造的論又那麼多,我都沒有體力、沒有時間、沒有機緣去廣學那些法門。那麼這樣想的話,就會對很多很多的法門產生一種珍惜的、很想去學它的心。但是由於現在的條件不能學,所以就產生了一個慚愧心。然後一邊慚愧著,不能說現在不學就算了,應該在因地上面,師父特別講:「<p> 所以先因地上面種下一個要深學、廣學的因。<p> 」 [02′21″]</p>
<p>   請問什麼叫「因地上要種下廣學、深學的因」呢?大家想一想。因地是哪裡呀?怎麼種?農夫在土地上耕種,秋天的時候就會有糧食、就會有果實出生。那麼我們修行人在哪裡耕種呢?就是我們的心田吧!心上就是我們的因地吧!所以當我們知道有這麼廣博、深邃的佛法法門的時候,要隨喜和恭敬佛為了無量的眾生說了這麼多法,我想都把它學會。所以在因地上一聽說之後,他沒有說:「其他的法我都不要、其他的法都不好、就我這個好!」沒有生起這樣一個誹謗的意樂。他直接就轉了!轉成什麼呢?「我要學!我需要!我需要深學、我需要廣學!佛說的這些無量的法門雖然我現在沒有機會,但不是我不需要的,是我全部都需要的!無一遺漏地全需要的!」所以在內心裡邊就種下了一個廣學、深學這樣的樂因。 [03′46″]</p>
<p>   有沒有發現那差別?他不是排斥,不是不認識,就是哪怕有非常粗淺的認識,對到這無量法門的時候,直接產生這樣的一個心念,或者這樣的一個願,絕非是排斥、輕視;直接翻過來的,這就是在因地上種一個廣學、深學的因。注意!是在心念,是在心田上種下這樣的因——我現在不能學,我慚愧呀!但是不能說我慚愧就算了,我要廣發正願!佛所說的所有的教典,祖師、菩薩造的那些論,我全部有一天都要精通,都要學會它!把它受持在自己的心上,然後廣泛地弘揚。 [04′33″]</p>
<p>   所以師父給我們的下腳處,有沒有看到是如此如此地清晰!那不能誹謗、不能去排斥別人,到底應該怎麼做呢?師父就說應該這樣想,然後懷著慚愧心種下一個廣學、深學的因。注意!在下面又提出了:「<p> 現在一心一意只有祈求這個大善知識<p> 」,又列出了大善知識;「<p> 念阿彌陀佛。<p> 」然後就只念自己的,這也叫一門深入。雖然一門深入,但他的心是對佛所說廣闊的經論的海洋和虛空敞開了。他沒有封閉、沒有排斥,沒有非常無知地認為那些對自己沒用,甚至對佛所說的那些法造惡業,毀了自己的現在和未來。 [05′25″]</p>
<p>   所以看看有善知識指導的當下一步,和沒有善知識指導當下盲修瞎鍊的一步,它的起步點簡直是天上、地下,差這麼遠!那你說他起步點差這麼遠,到目的地又差多遠呢?一定是有一個走到極苦的地方,有一個就走到了最快樂的地方,實現了他的所願。所以在這點,我覺得真的是很感恩師父手把手地教我們修行,讓我們在當下的緣起點上如何同時一門深入,同時又對廣泛的佛所說的教法,能真的在內心裡產生一個禮敬和要廣學、深學的心。每每想到這一點,真的、真的很感恩師父!很感恩師父! [06′15″]
<p>   好!那我們接著聽下一段。<p>   另外一方面呢,旁邊的人哪如果在那地方,他弘他的教也好、他學他的禪也好,如果你有了這個正確的認識以後,我想我們就會這樣想:「對啊!這個佛法在世間真不容易啊!佛陀經過無量阿僧祇劫捨頭目腦髓,積累的這個圓滿的教法,流傳在世間。我們作為修學佛法的佛弟子,應該努力去把它弘揚、傳持。而我現在力量不夠,只能念佛,已經感到慚愧,現在看見他卻是能夠弘揚教、他能夠弘揚禪,我讚歎歡喜得不得了!」在這種狀態當中必然結果,說:「是的!將來我也要弘,可是眼前力量不夠,所以我現在念佛。那麼,我眼前單單......如果是每個人像我念佛,那個佛法不是慢慢地、慢慢地只有這個了,別的沒有了嗎?幸好他在這樣努力啊,我就非常讚歎、非常歡喜。我可念我自己的佛!」結果呢,一方面你讚歎別人,增長自己的功德;一方面哪我也讚歎你、你也讚歎我,佛教彼此互相讚歎,於是這個教法也旺,我們也增長功德,不影響你的念佛。 [01′36″]</p>
<p>   上一段師父是說對自己的這一方面,然後接著是另一方面。另一方面是哪一方面呢?就是可以看看,弘揚教的、學禪的呀,當我們有了這個正確的認識之後,注意!我要提問題了:說我們有了正確的認識之後,請問是何種正確的認識呢?大家想一想,你們有什麼答案?注意!是產生了這個正確的認識之後,心念轉了,轉成什麼了呢?師父第一句話就說:「<p> 對啊!<p> 」什麼是對的?「<p> 佛法在世間真不容易呀!<p> 」為什麼說佛法不容易呢?來源——佛陀經過無量阿僧祇劫捨頭目腦髓積累的這個圓滿的教法,佛陀那時候積累的,現在居然在流傳,稀有吧?珍惜吧? [02′48″]</p>
<p>   那麼我作為修學佛法的佛弟子是應該有責任的,什麼責任呢?應該努力地把佛經過無量阿僧祇劫捨頭目腦髓積累這個法,要弘揚、要住持、傳持下去啊!這是師父的宏願啊!它是有使命,有責任的。師父要把這種責任傳給我們,現在就在傳給我們。可是,如果看到其他人能夠弘揚教、能夠弘揚禪,就歡喜、讚歎得不得了。為什麼?因為看到佛陀用這麼無量的難行苦行換來的教法,居然經過他人的弘揚還流傳在世間,我還能夠看到這麼美的教法在弘揚著,難道不感激涕零嗎?感激涕零!又說了:「<p> 是的!將來我也要弘。<p> 」看到他人的好、看到他人做得正確,就是發正願啊:「我也要如是啊!」 [03′56″]</p>
<p>   所以這樣想了之後,一方面讚歎別人、增長自己的功德,當我這樣去讚歎別人的時候,師父期待:「<p> 一方面哪我也讚歎你、你也讚歎我<p> 」,注意下面那句話:「<p> 佛教彼此互相讚歎,於是這個教法也旺,我們也增長功德,不影響你的念佛。<p> 」這幾句話是什麼意思呢?師父對我們這些弟子們提出了他的期待,就是:我讚歎你、你讚歎我,佛教彼此互相讚歎。如果這樣讚歎了就教法興旺,個人也會增長功德。 [04′53″]</p>
<p>   做得到嗎?舉個簡單的例子,我們現在在學《廣論》,我們能夠真心地讚美其他的寺院、其他的山頭所做的佛教事業嗎?捫心自問,能夠真心地讚美嗎?別人做到我們做不到的地方,我們能夠發自內心地讚美嗎?為什麼不能發自內心地讚美呢?學習清淨圓滿傳承教法的弟子們,對於佛陀所說所有的法要一併地恭敬,對弘揚佛陀所說的所有法門的善知識們也要一併地頂禮、頂戴。尤其是在佛法還沒有廣泛弘揚的時候,最初花費了千辛萬苦去化度有情的那些大善知識 ,現在令佛教呈現出這樣一個局面那些善知識,他們所做的努力很多很多我們是不了解的,怎麼可能因為自己學了《廣論》之後反而輕視他人呢?反而輕視其他善知識的修學,甚至其他佛教團體的修學呢?這個是極度要對治的! [06′12″]</p>
<p>   所以我們應該虛心地向一切大善知識、大德法師們,乃至居士們學習。正因為學到了這樣清淨圓滿的教法,我們才知道每一個寺院、每一個山頭、每一位善知識,都是辛辛苦苦地在推展佛教、在教化有情,每一步走起來都是非常非常不容易的。不要輕易地就說別人哪裡哪裡做得不好,好像只有自己是超勝的。只要這樣地一開口,就知道你沒有好好學習,沒有聽懂師父所教的。 [06′50″]</p>
<p>   所以一定要設法讓自己的心銘記師父的教誨,就是佛教要彼此相互地讚歎,一定、一定要恭敬其他的善知識在推展佛法方面所做的這些艱辛的、難以想像的努力。這是我做不到的,所以我要好好地頂禮其他的善知識能做到的部分,並且我也發願:我要向他們學習,我將來也能夠做到! [07′24″]</p>
<p>   要看到其他的寺院、其他的山頭在推展佛教,能從內心深處真正、真正地發出歡喜和讚歎。覺得有這麼多大德、有這麼多大善知識,甚至有這麼多法師還有居士們在努力,佛教是非常非常有希望的!佛教非常非常有希望,眾生就很有希望,這是一件多麼美的事情!所以一定要依教奉行,要讚歎、要恭敬、要發願廣學,向一切善知識、法師,甚至那些為了佛教的弘揚付出了非常多努力的居士大德們,真的要好好地學習! [08′12″]
<p>   你在這種狀態當中,有什麼樣不同呢?前者儘管你念佛,可是因為你謗法呀,造下來絕大的惡業。念得的一點功德被這個惡業抵銷啊,還透三分,反而欠了很多自己還不知道。所以明明是萬修萬人去的最好法門,念了半天念不去。你現在懂得了道理,不要你改變,卻是產生這麼大的功效,第一個。第二個,因為你因地當中已經這樣想:「對啊!我將來一定要求圓滿的佛法,我現在先走這個路......。」等到你一旦到了極樂世界以後,完了以後,去了,那個時候你心裡想一想:「現在到了,現在我要廣學、深學。」你很快地這個因又啟發,所以這條直道又走上去了。要不然的話,你儘管到了那個地方去,你種下去的因,到那時候發出來的芽,你還是會走你的老路子。至少到那時候,你重新要去懺悔等等,豈不浪費很多時間?所以這一點我們要認識的。不管是你準備走圓滿的路子、不管你走目前哪一門,這個道理我們應該認識。所以這個圓滿的教法,對我們實在太好、太好了! [01′27″]</p>
<p>   好!大家剛才聽師父講的,我想要提一個問題。比如說「<p> 你在這種狀態當中,有什麼樣不同呢?<p> 」請問:「你在這種狀態中,有什麼樣不同」是哪種狀態呢?還記不記得上一次研討的?哪種狀態呢?大家想一想。是有什麼不同?學了正確的見解有什麼不同?後面師父說「前者」,就是沒改變的時候;「<p> 前者儘管你念佛,可是因為你謗法呀,造下來<p> 」,注意那兩個字,「<p> 絕大的惡業。<p> 」因為謗法的惡業是非常非常恐怖的,所以它不只是一個大的惡業,它是一個絕大的惡業!絕大的惡業會產生什麼呢?絕大的惡業會產生絕大的痛苦,時間又特別長,非常地痛苦! [02′34″]</p>
<p>   我們念佛是為了求生極樂世界,得到生命最究竟的快樂,去除所有輪迴的痛苦,可是卻因為謗法造了這個絕大的惡業,師父說:「<p> 還透三分<p> 」,還欠了很多!我們<p> 一邊<p> 想要得到快樂,可是一邊還種下了苦因,沒有對佛所說的其他無量的法門產生恭敬,產生由心底裡的隨喜,反而去誹謗佛所說的法,這個惡業一定是非常非常地可怕!所以最重要的,大家可以看後面那幾個字,師父說:「<p> 反而欠了很多<p> 」,注意後面有幾個字,「<p> 自己還不知道<p> 」。 [03′23″]</p>
<p>   那麼這種狀態是一種什麼狀態呢?可能是覺得自己非常用功地修行,自己很開心,甚至還生一點我慢,或者覺得自己的修行的狀態不錯。因為不了解所有佛所說的法都是無量劫佛陀捨頭目腦髓換來,是針對不同眾生的根機救有情的,把它看得好像不應該存在的樣子,甚至是覺得很有過失的樣子,造了這樣絕大的惡業自己還不知道。 [03′56″]</p>
<p>   那我現在問大家:為什麼自己不知道呢?是不是不認識謗法罪呀?那麼為什麼不認識謗法罪呢?就是沒有親近善知識聽聞、去了解什麼是謗法罪。所以自己不知道這個問題,最初的原因應該是源於沒有聽聞到;如果聽聞到了還犯的話,那是對自己的三業失察。所以儘管我們學《廣論》已經很多年了、很多是老學員,但是是否我們能夠很好地防範自己的三業?甚至念頭能不能對佛所說的所有的法保持著深深的恭敬?自己平常二六時中所有的行為,對到《般若經》啊、對到《廣論》啊、對到很多很多戒律呀、對到很多經典,是否能夠有足夠的恭敬啊? [04′58″]</p>
<p>   因為現在好像我們掉到法的堆裡一樣,到處都有經典,好像經典也不是難可值遇的樣子。我們去世界這麼多學《廣論》的中心,到哪兒都有很多《廣論》、很多《般若經》。是不是到哪兒都可以遇到的時候,佛法就好像不是那麼難可值遇,然後對於經典沒有一個非常非常誠敬的心、如對聖顏的心?這些地方大家都可以檢查一下自己,因為最恐怖的是自己還不知道的時候造了很大的惡業,然後那個惡業感果的時候就只能很恐怖地去領受。所以,最好清清楚楚,每天要看著自己的三業,尤其是對上師三寶的對境、對法寶的對境。 [05′46″]
<p>   這裡邊師父說:「<p> 明明是萬修萬人去的最好法門<p> 」,為什麼念了半天沒去?說:信、願、行,還有資糧不夠。所以,師父接著說:「<p> 你現在懂得了道理,不要你改變<p> 」,可以繼續念,「<p> 卻是產生這麼大的功效。<p> 」什麼功效?因為不謗法了,可以累積不可思議的資糧呀!大家知道一句佛號那就是消多少劫、多少萬劫的生死重罪,在《三十五佛懺》裡都有。如果說能夠常常念,大家都常常念「南無阿彌陀佛、南無阿彌陀佛」,常常念,一念就消八十億劫生死重罪。在《三十五佛懺》裡有講到每一尊佛號它能夠滅除的重罪。 [00′47″]</p>
<p>   如果以這樣的力度來念佛的話,我們有命存活的念念中,珍惜時光,我們可以消多少罪業,同時又對佛陀所講的所有法門都保持著恭敬隨學的心;對於修學不同法門的善知識或者僧眾還有俗眾,都保持著恭敬心,真的像遍地黃金一樣,我們可以累積相當多的資糧!所以這是「<p> 第一個<p> 」。 [01′12″]</p>
<p>   接著師父說:「<p> 第二個<p> 」。「第二個」說什麼了呢?還記得嗎?這裡邊提到了「因地當中」,注意!提到了「<p> 因地當中已經這樣想<p> 」,因地當中的想法。有沒有發現師父照顧我們是非常非常仔細的?因地當中——我們都在因地當中,現在喔!現在!我們想什麼呢?正確應該想什麼?「<p> 對呀!我將來一定要求圓滿的佛法,我現在先走這個路......。<p> 」那時候很多很多居士都在念佛吧!就是在很多很多人念佛的時候師父開始講《廣論》的。所以在因地當中他先念佛,但是他說:我將來要求圓滿的佛法。注意喔!這是三十年前師父講的。說:我將來一定要求圓滿的教法,我現在先念佛;一旦到了極樂世界之後做什麼呢?那時候又開始想:「<p> 現在到了,<p> 現在<p> 我要廣學、深學。<p> 」有發現嗎?生到極樂世界之後,這個人的心續也還是那樣的,他在因地裡要廣學,所以到極樂世界他還是要廣學。廣學做什麼呢?請大家回答。 [02′31″]</p>
<p>   比如說想到去極樂世界就可以了,「啊!阿彌陀佛把我救到極樂世界了!」但師父為什麼還要算一下我們到極樂世界之後去做什麼?這是為什麼?到極樂世界要深學、廣學做什麼?成佛呀!對吧?要成佛呀!為什麼要成佛呢?度盡蒼生呀!所以這還是一個大乘的走法。有沒有發現師父在幾乎可能的每一處,都在提醒我們因地要發廣大心?然後這個心要生生世世相續下去,就是要成佛! [03′16″]</p>
<p>   所以師父說:「<p> 很快地這個因又啟發<p> 」,注意!很快地這個因又啟發,這個速度——成佛的速度。接著又說:「<p> 所以這條直道<p> 」,這是一條直的,沒有曲曲彎彎朝後走或者完全走反了,直著就走過去了。就是從因地裡你要發廣大心,發一個成佛的心,不要發下劣心,甚至不要在一邊念佛的時候一邊造謗法罪還不知道。接著,如果不是這樣的話,會怎樣呢?說:「<p> 到了那個地方<p> 」,原來種的什麼因啊?就是不廣學,到那個時候發出了芽,又走到老路,然後那時候還要再懺悔,師父說了幾個字:「<p> 豈不浪費很多時間嗎?<p> 」 [04′02″]</p>
<p>   有人說:「到極樂世界,怕浪費時間幹什麼?」想一想有多少有情在地獄道、餓鬼道、畜生道,那有情是誰呀?是如母有情啊!我們如果能夠快點、快點成就的話,就可以幫忙曾經為我母親的那些有情啊!那個時間是他們受苦的時間哪! [04′24″]</p>
<p>   所以在後面師父說:「<p> 不管你準備走圓滿的路子、不管你走目前哪一門,這個道理我們應該認識。<p> 」哪個道理呢?就是我們一定要修學圓滿的教法,而且要對佛所說的所有的法門,要知道是無量劫來捨頭目腦髓換來,是為了無量的有情能夠安立正確的次第而講說的,並不是沒有什麼所為、沒有什麼作用,這個道理我們要認識。 [04′53″]</p>
<p>   「<p> 所以這個圓滿的教法<p> 」,師父接著說:「<p> 對我們實在太好、太好了!<p> 」大家聽師父的帶子的時候,會發現師父真的滿心洋溢著歡喜,好像都一直在笑著講這一段。師父對圓滿教法的那種歡喜心,我們聽著師父的語調,彷彿看到他的笑容,那個加持力就會加持到我們的內心。 [05′18″]</p>
<p>   對比一下我們平常在學《廣論》的時候、在學《備覽》的時候,甚至在學五大論、在學《攝類學》的時候,會不會怖畏其難,沒有感受到圓滿教法的莊嚴,然後就沒有那樣的歡喜心?你說:「這麼難,我有什麼歡喜心呢?」那你可以想有很多人賺錢也很不容易呀,為什麼他有歡喜心呢?因為考慮到勝利呀!比如說學習《攝類學》可以成為一切遍智的因啊!所以我們就不怕難,我們就去學「紅白顏色」等等,學很多、很多。所以能遇到這個圓滿的教法,一定要在內心深處深深地隨喜,想到師父那個發自內心的讚歎,說:「<p> 實在是太好、太好了!<p> 」 [06′00″]
<p>   那麼現在大師就把真正的中心告訴我們,說主要的是能夠把圓滿的教法留在世間,你們能夠圓滿地學固然好;其他的人你只要得到了,不管你得到了以後,自己用的用在哪裡,哪一部分都得到好處。所以他把這個圓滿的教法解釋,他自己本身也看見了這個事實,了解了這個道理,他心裡面是非常歡喜。有這個圓滿的教法,整個的那個弊端可以救,整個的佛法可以興,而這個正是佛菩薩一向的他的志願,一向的作法。所以他說:「故我心意遍勇喜。」啊,真歡喜啊!真歡喜啊!這歡喜的情況是遍而勇,遍而勇!這不是說這樣地淺淺的、小小的,因為諸佛菩薩的心量本身這個狀態就是這樣。那麼,這個是他造論的宗旨。 [01′24″]</p>
<p>   在這一小段,大家可以繼續聽到師父非常非常地歡喜。師父說:「<p> 現在大師就把真正的中心告訴我們<p> 」,那麼可以想一下中心是什麼?「<p> 主要的是能夠把圓滿的教法留在世間<p> 」,這句話熟不熟?因為師父一直一直地教誡我們要把法留下來,把圓滿的教法留在世間,他最最在意的事情就是把法留下來——把圓滿的教法留在世間。 [01′58″]</p>
<p>   所以師父接著說:「<p> 能夠圓滿地學固然好;其他的人你只要得到了,不管你得到了以後,自己用的用在哪裡,哪一部分都得到好處。所以他把這個圓滿的教法解釋,<p> 」這個「他」是指誰啊?「<p> 他自己本身也看見了這個事實,了解了這個道理,他心裡面是非常歡喜。<p> 」誰呀?宗大師,對吧?說:「<p> 有這個圓滿的教法,整個的那個弊端可以救,整個的佛法可以興。<p> 」注意!為什麼師父這樣地歡喜圓滿的教法?這樣辛苦地把這個法一定要徹底地留下來呢?就是因為整個的弊端都是可以救的,整個的佛法都是可以興起來的。 [02′54″]</p>
<p>   興起來是什麼意思啊?就是聞思修啊!僧俗二眾很興盛地學習佛教啊!這樣的話,「<p> 正是佛菩薩一向的他的志願,一向的作法。<p> 」注意!師父講完了這個時候,突然講到這一句話。不知道你們會不會覺得是突然?講到「<p> 我心遍勇喜<p> 」這個偈子,講到圓滿的教法要留下來,整個的弊端都可以救起來,整個的佛法都可以興旺,接著直接說道:「<p> 正是佛菩薩一向的他的志願,一向的作法。<p> 」佛菩薩一向的志願是什麼?令佛法可以全部興盛,然後可以救度蒼生。 [03′41″]</p>
<p>   注意!還有一個:「<p> 一向的作法。<p> 」這個作法是什麼意思呢?當我們看到弊端,我們有時候會選擇抱怨,有時候選擇哀嘆,然後無能為力,甚至會去說別人的過失——因為某某人所以才有這樣的弊端,我們並沒有意識到我們對這個弊端擁有什麼樣的一個責任。會想要拯救這個弊端或者改善這個弊端嗎?比如說看到哪裡做得不好的地方,我們會想:把它做好就是把佛教興旺起來嗎?師父說這正是佛菩薩「<p> 一向的作法<p> 」。作法是什麼呢?就是弊端是可以救的。請問佛菩薩用什麼來救這個弊端呢?整個的弊端喔!師父說:「<p> 整個的那個弊端可以救!<p> 」什麼弊端呢?用什麼來救呢?就是用圓滿的教法。用圓滿的教法怎麼救呢?就是要有人講圓滿的教法,有人聽受圓滿的教法,並且依照所聽受的來結合內心的這樣一個修行。 [04′49″]</p>
<p>   所以並不是對著弊端哀嘆,也不是把造成這樣的原因一直推給別人,自己好像什麼責任都不負,就只負責批評。佛菩薩一向的作法不是這樣的,而是直接把這件事解決。而解決的方式是如此地完美,就是要傳持圓滿的教法,很多的弊端就解決了,整個佛教也會興旺起來。所以悲心和智慧和力量都是極致地圓滿。 [05′20″]</p>
<p>   在這樣的狀態下,說:「<p> 我心意遍勇喜。<p> 」然後師父說了兩遍:「<p> 真歡喜啊!真歡喜啊!<p> 」歡喜地又說:「<p> 遍而勇,遍而勇!<p> 」講兩遍。「<p> 這不是一個淺淺的、小小的<p> 」,又出現了——歡喜心!又開始為我們介紹佛菩薩,「<p> 因為諸佛菩薩的心量本身這個狀態就是這樣。<p> 」什麼狀態呀?「遍勇喜」!記得《入行論》有偈子吧?「<p> 有情若解脫,心喜如大海。<p> 」我們的內心又何嘗高興得像大海那樣遼闊無邊,一浪、一浪,像海浪不停息的那樣的歡喜心;但是有情若解脫的話,菩薩就會產生那樣的歡喜心。所以這裡邊再度地說到了諸佛菩薩的心量。 [06′12″]</p>
<p>   前面說到了諸佛菩薩的志願、諸佛菩薩的作法,此處又講到諸佛菩薩的心量本身的狀態就是這樣。所以師父一直在給我們介紹佛菩薩怎麼做的、佛菩薩的志願是什麼、佛菩薩的心量是什麼樣。為什麼要一直這樣介紹?就是讓我們心生渴仰,能夠嚮往這樣的生命境界,能夠把自己從只關注自我的苦樂,只關注幾個人的苦樂,甚至只管自己這樣一個我愛執的爆發狀態,慢慢地引生到嚮往佛菩薩的生命境界,很渴望能把所有有情的離苦得樂擔在自己身上那樣的一個責任感。所以,很想擁有那樣的一個責任感,為了這樣的一個願心或者行心而心潮澎湃。有沒有感覺到師父講這一段心潮澎湃?他為佛菩薩的志願所激動、為佛菩薩的心量所歡喜,這個感受可以透過師父的語調直接地傳遞過來。 [07′26″]</p>
<p>   我也在師父身邊的時候親眼看到,比如師父捧到《般若經》、捧到《廣論》那種全身心恭敬的樣子,都是雙手捧著,非常非常非常珍重的樣子。講到大師教法的時候,師父常常都會非常非常地歡喜,有的時候也是很感動!我跟在師父身邊,看到師父在頂禮宗大師、在頂禮三寶的時候虔誠的樣子。比如講到菩薩戒的某一段,師父說他講到菩提心的時候是沒法休息的,因為實在是太歡喜了!哪天講了哪天都沒法休息。 [08′05″]</p>
<p>   所以這個一向連貫的師父對於佛菩薩的那個心量、佛菩薩的志願、佛菩薩的作法,充滿了渴仰和充滿了實踐的力度。師父在前面這樣走著、這樣示現著、這樣引導著我們,那麼你我要怎麼辦呢? [08′26″]
<p>   大家好!又到了我們研討《廣論》的時間了,今天我們會一起學習《四家合註入門》。在學習之前,請大家觀察一下自己的內心:我現在的狀態,是否能夠馬上專注在聞法上呢?是以什麼樣的意樂來學習呢?要用專注的心,為了利益無窮無盡的如母有情究竟地離苦、究竟地與樂,為了這樣的目標,我們必須去成就無上正等菩提;為了成就無上正等菩提,我們需要知道成就無上正等菩提的因;為了了解那個因,所以才要聞法。那麼當下的起步點呢,就是在因上努力,就是聽聞。不要散亂、不要昏沉!因為每天我們在正法上聽聞的時間也不是很多,就這麼少的時間,一定要設法讓自己的心能夠專注。 [01′09″]</p>
<p>   好!請大家把書翻到《四家合註入門》六十八頁,看中間彩色字的部分,我先念一下:「<p> 其次第二、著作之因者:<p> 今<p> 欣樂且<p> 勤<p> 於<p> ﹝<p>  <p> 瑜伽<p> ,他派雖說四種,然此係指真實瑜伽止觀雙運,及彼隨順內三摩地。﹞者率<p> 多寡聞,<p> 而諸<p> 廣<p> 作<p> 聞<p> 者亦<p> 不善於修<p> 持<p> 之<p> 要,<p> 當今行者,偏執自所信解講修,故<p> 觀視佛語多<p> 成<p> 片眼,復乏理辨教義<p> 之<p> 慧<p> 力。故<p> 遠<p> 離智者歡喜道——<p>  <p> 謂得全然<p> 圓滿<p> 教證<p> 教<p> 法扼<p> 要<p> 之殊<p> 勝教授,見已<p> 而悲憫彼等<p> ,<p> 踴躍造論而立誓云:<p> 釋此大車道<p> 次第<p> ,我<p> 傑喇嘛<p> 心全然遍勇喜。<p> 」 [02′26″]</p>
<p>   下面我們就可以看講記。那麼「<p> 其次第二、著作之因者<p> 」就是第二科判,第二科就是講到了為什麼要著作本論的原因,是什麼呢?又提了一下當時的狀況,說:「<p> 今勤瑜伽多寡聞<p> 」,「瑜伽師」,中文是指修行者。這裡面要解釋瑜伽的意思的話,他派雖說有四種,這四種在《四家合註》當中沒有解釋。密宗對瑜伽的說法,即是為四種,而顯教道次第的瑜伽是什麼呢?就是指「<p> 真實瑜伽止觀雙運<p> 」,還有「<p> 及彼隨順<p> 」,止觀雙運以及不是真實止觀雙運、只是隨順的「<p> 三摩地<p> 」也是可以的。所以他這個「<p> 勤<p> 」,就指想要學習並且覺得瑜伽是很好的。這裡面有一種欣樂歡喜,就是非常非常想要。 [03′35″]</p>
<p>   雖然是這樣,但是他們「<p> 率<p> 多寡聞<p> 」,是指他學習的是很少的。當時宗喀巴大師的時代,很多修行者,他們自認為是很大的修行者,可是往往就是缺乏多聞,這是當時的一種現象。那個時候的很多修行者就是非常非常喜歡修習止觀雙運及彼隨順、非常非常愛樂修行,可是對於教典的學習是非常寡少的,缺乏多聞。 [04′08″]</p>
<p>   那麼第二種,「<p> 諸<p> 廣<p> 作<p> 聞<p> 者<p> 」,也有一些人聽得很多,但是他們真正在修持的時候,卻沒有很好地理解修持的扼要,沒有達到善巧。「<p> 當今行者<p> 」,就在那個時候,行法者、修法者大都是什麼狀況呢?想一想大都是什麼狀況?「<p> 自所信解講修<p> 」,對於任何自己所信解的講說及修持,由於「<p> 偏執<p> 」,不論是好是壞,都說這個是好的,而沒有遍觀一切佛語,只是少分、少分地觀看之後,就對此產生了愛著。「<p> 故<p> 觀視佛語多<p> 成<p> 片眼<p> 」,對於薄伽梵所說的教義,自己缺乏理路辨析的能力,缺乏力量,內心沒有這種分辨的「<p> 慧<p> 力<p> 」,沒有能力區分,所以對經教的意思無法各別地去區分。各別區分是什麼意思呢?比如這裡是講這個的、那裡是講那個的,要分得很清楚,可是他分辨不出來,不能體會其中的義理。 [05′22″]</p>
<p>   所以整個的修行過程之中,這第二部分也是很重要的。他當時為什麼要造這個論呢?就由於當時藏地有很多教派,各有自認為好的修行方式,但是在宗大師看來,很多都是不理解真正修行的方法和佛陀的教義。有些人看起來自己是一個很好的修行者,但是他修行的方法很多是錯誤的。在這種狀況下,造這部論是非常具有意義的事情,因為如果不造這部論的話,有很多修行的方便、學修的方法都是錯誤的。最可惜的是,很多人自己都不知道。 [06′09″]</p>
<p>   我們會發現在這裡邊講了兩種狀況:愛樂止觀雙運及其隨順的人就寡聞;廣聞的人卻沒有達到修行的扼要。實際上這兩種似乎是很用功修行的、很歡喜修行的人,可是很歡喜修行,修行的方法卻是錯誤的,而這個是誰發現的?是宗大師發現的。宗大師發現了之後,要怎麼辦?他校正這些錯誤,來給這些非常愛樂修行、非常用功修行的人一個正確的修行方法,讓大家一生一世乃至生生世世為了修行所流的汗水和淚水不至於白流,這是非常深的恩德! [06′58″]
<p>   既然有上面那兩種狀況,接下來看 70 頁。說:「<p> 故離智者歡喜道——圓滿教要勝教授,見已釋此大車道,我心全然遍勇喜。<p> 」佛薄伽梵的教法,即是教正法和證正法,「<p> 故<p> 遠<p> 離智者歡喜道<p> 」就是得到全然圓滿教證教法扼要的殊勝教授,是說這樣的教授是一切智者非常歡喜的妙道。什麼樣的妙道呀?它是全然圓滿教證的教法的勝教授。所以,雖然是這麼美的、令智者歡喜的妙道,但是前面講的那些人沒有能力看出來。注意!沒有能力看出來,很想看出來,但是能力不夠。因此大師要宣說大車道,也就是全然圓滿教證教法扼要的殊勝教授,即是最殊勝的教授,也是智者所歡喜的妙道。當看到上述的修行者不具備這些之後,宗大師就想要寫這部論。 [01′21″]</p>
<p>   接下來最後兩句是「<p> 踴躍造論而立誓<p> 」,雖然狀況已是這樣,大師就不再有所顧慮,而立下誓願說要解釋這個大車道。「釋此大車道,我心全然遍勇喜」,大師自己對此十分地歡喜。 [01′41″]</p>
<p>   再翻到 73 頁,這後面有一些我問仁波切的問題。在聽的時候我就一直糾結這個「瑜伽」到底是什麼?在想相似的瑜伽為什麼可以歸結為瑜伽裡邊?瑜伽——這個止觀的次第、量都是非常明晰的,相似的為什麼還可以歸到瑜伽裡邊?所以一直在問仁波切這個事情。在 73 頁看到仁波切講的那段。又說一遍:「今勤瑜伽多寡聞」,在藏文裡「今勤瑜伽」就是指他在這方面非常努力的修行,沒有說完全就是一個瑜伽者,還沒得到,但想在瑜伽方面努力的這些人對此有興趣,尚在修行過程中。藏文中「今勤瑜伽」,對於什麼精勤呢?對「瑜伽」精勤。那麼他們想要得到什麼呢?他們想得到的就是瑜伽,原文上也是很清楚的。看!仁波切又說一句:「是很清楚的,想向瑜伽努力的這些修行人,意思就是這樣。」又說一遍! [02′56″]</p>
<p>   而註解是指趣向於隨順止觀雙運這點,並非完全具足止觀雙運,但在內三摩地、止的部分努力的修行人。「隨順」是表示沒有做錯。而且他們大多數都寡聞,這說明很多人就是這樣,剛開始的時候,不重視學習佛教的教理、教言,不重視學習;有的是學到以後,開始修的時候,學修不能結合,在修的過程中方法也有很多錯誤。這些都是當時出現的一些問題,宗大師看到了這些情況之後,他想把大車軌這個道講出來。 [03′41″]</p>
<p>   當時在跟仁波切請問的時候,仁波切講了一下出現的問題:雖然很樂於修行,可是卻不注重學習佛教的教理和教言,不注重學習。其實這種現象現在應該也是滿普遍的,大家可以觀察、觀察。如果沒有聽聞道次第,沒有師父這樣給我們詳細地講解《廣論》,我們並沒有發現學習佛教的教理和教言會是這麼重要的一件事情。我們今天能對這樣的法義進行聽聞,能有這樣的善根,還有歡喜心堅持聽聞——比如現在正在聽的「你」——都要感謝師父的深恩。 [04′32″]</p>
<p>   現在我想提一個問題:為什麼想要修行的人,他會落入這種不重視多聞的現象呢?為什麼想修行的人不重視多聞呢?為什麼提到修行的時候會不重視學習教理呢?大家可以想一想。當我們說到一個人非常有修行的時候,我們的心裡會出現一個什麼樣的影像呢?是不是會出現他在打坐?你們是出現他在打坐嗎?這是一個非常有趣的現象,為什麼說一個人非常有修行就是他在打坐呢?而不是他在學教理呢?好像我們認為非常有修行的人就是在那兒端坐,能夠生起禪定。甚至能夠在禪定中證悟空性這樣的想法可能都沒有,只要生起禪定就是很有修行。 [05′48″]</p>
<p>   我們可以觀察一下自己的心,觀察一下自己對於修行的定義。打坐——很多人就是在修禪定。那麼修禪定的時候,有沒有注意到是為了解脫生死要修習空性、修習無我,還有前面達到空性的很多次第?所以就可以發現當我們想到修行的時候,我們想到的是片段呢?還是全圓的道次第呢? [06′19″]
<p>   如果說什麼是修行的話,一定是一個全圓的道次第;全圓的道次第,那一開始的功夫一定是親近善知識,然後聽聞教典,一定是從這兒開始的。而且一定是要聽全圓的道次第,跟隨有傳承的善知識。所以多聞、學習教理和教典,這個是極其重要的一件事情。因為如果不學習,我們將不知道怎麼修行,修行的次第和數量都不了解。 [00′34″]</p>
<p>   在我們現起一個人端坐在那裡,非常莊嚴地修禪定的時候,那前面他一定有一系列的道次第在進行。比如說他去尋找善知識,跟善知識聽聞教典,一定會浮現出很多教典的樣子,那個修行人在非常努力地聽聞啊、背誦啊、辯論啊、切磋......。把次第和數量弄清楚之後,即使是修禪定也要有善知識的指導,所有的一切都將在詳細地學習教理,明辨其中的取捨之下才能夠進行。 [01′13″]</p>
<p>   這時候就可以觀察一下:當我們想到一個修行者的時候,我們是不是心裡還有很濃厚的那種「今勤瑜伽多寡聞」的習氣?那麼這種習氣是怎麼來的呢?任何習氣應該都是培養出來的。那麼我們為什麼會培養這樣的習氣呢?不只是一生會泡在這樣的習氣裡面。這樣的習氣要怎樣能夠得到徹底的改正呢?宗大師沒有造這本論的話,我們是沒法自救的,因為不知道。宗大師造了這本論這麼多年了,我們也未曾知道,如果師父不是把這本論捧到我們每個人的眼前,就是送給我們了,我們也讀不出來味道。如果師父不是這樣非常慈悲地用我們能夠理解和歡喜的方式一直在講給我們的話,我們也不可能學進去,甚至堅持十年、二十年的學習,一直在聽聞、思惟。 [02′18″]</p>
<p>   所以在學到「今勤瑜伽多寡聞」的時候,好像是因為當時的修行人出現了那樣的狀況,然後宗大師悲憫那些人寫的論,但是我們後世的這些人這個毛病會比那時候的人少嗎?我說的是要觀察自己。所以要特別特別注意:如果這樣下去的話會離智者歡喜道,會離圓滿教要勝教授,會離開那些的。就是怕我們離開智者歡喜的道,所以宗大師才為我們寫了《菩提道次第廣論》。就像宗大師說的,想念他的弟子們,就去閱讀他的兩本論。其中一本就是《菩提道次第廣論》——野風送來的遺囑,這是非常非常珍貴的智慧寶藏! [03′13″]</p>
<p>   有了這本論作指導,然後有了師父這樣非常入心的講說,我們就可以校正自己在修行上的偏失。比如認為修行就是止觀,而沒有看到聽聞是很重要的,不知道聽聞是樂於修行的人非常非常重要的一個步驟,而且是不可逾越的一個步驟。 [03′40″]</p>
<p>   所以,今天我自己和大家能夠再度再度地在《廣論》裡邊學到善知識的這個教授,我實在是覺得非常非常地幸運!因為可以看到現在還有很多沒有學到的人,可能還是這樣子。就算我們學到的人,不認真的話,我們對修行的理解依然是很偏狹的,沒有數數地去對治自己好樂瑜伽卻不重視多聞的這個缺點。 [04′11″]</p>
<p>   比如說一學習,我們學不會的時候就會很焦灼,然後就想:「哎呀!我什麼時候去修行啊?我學《廣論》什麼時候去修行?」好像聞思的時候就不是修行。聞思的時候是修行必經的一個階段,我們必須得詳細地聽聞教典;但詳細地聽聞教典的時間如果一長的話,我們就會覺得好像沒有時間修行,而忽略了這正是修行的一個次第,而且是非常非常重要的部分。 [04′45″]</p>
<p>   所以我們是否能夠對於聽聞教典,貫注像對於修禪定、對於修止觀那樣強烈的嚮往,而且在聽聞的時候就生起強大的歡喜心,覺得我就是在修行、我是在修行「聞」的修行——聽聞的修行。能生出這種腳踏實地、自我感覺得到行進在這個圓滿道次第、正確的次第上的一種踏實感,而不要覺得我聽的時候我沒有在修行。 [05′17″]</p>
<p>   所以我們在學習《攝類學》啊,或者學習《廣論》,發現內心中有的時候會生起覺得這沒有在修行的見解,就要想一想我是不是落入到了「今勤瑜伽多寡聞」這樣的一個見解?非得認為去打坐,或者去念儀軌才是修行;在學習教典、在背誦教典的時候,甚至在辯論的時候,這都不是修行。可能都是這些邪宗在發酵吧!所以大家要注意,面對「今勤瑜伽多寡聞」這個問題,並不是說我們知道了這件事就可以了,我們要向內心中觀察:我現在是不是依然還是這個宗? [06′00″]</p>
<p>   如果是這個宗的話,我們將被《菩提道次第廣論》所救拔,被宗大師的悲心所攝受。是否可以在內心中確認這樣的次第?確認只是歡喜止觀是不可以的,要對全然圓滿的道次第,這些殊勝的教正法、證正法進行扎實穩健、經年累月的聽聞、思惟,然後去辨析其中的取捨——需要特別清楚地辨析出來,這是需要花下時間的。 [06′45″]
<p>   好!請大家把《四家合註》翻到 74 頁。再看一下仁波切回答問題。<p>   說:「觀視佛語多片眼」 是指什麼呢?不全面地去看的意思,就是片段,有些佛語會看、有些就不會看到。假設不遍觀佛語的話,過去經典中宣說了很多各別不同的了義、不了義,有些說補特伽羅有我,有些說補特伽羅無我,不可以只片面地說:「佛宣說補特伽羅有我。」所以對於佛語要全面地學習,不這樣做的話就是「片眼」。不能因為這之前他有說過,就非得固執不可。所以要學的話,就必須全面地學。但是仁波切在這裡邊說:有些人不全面學的話,就體會不到。看前面寫的是「有我」,這是佛講的,是對的。但是為什麼要講「有我」呢?到後來又寫的是「無我」,那不全面看的話,只抓住一句就是「片眼」。 [01′15″]</p>
<p>   在這一部分,可能很多同學也會遇到這種狀況,覺得:欸,佛講的教理好像前面、後面是矛盾的。學得越多的同學有的時候會越容易發現這一點,因為他心中無法會通——佛為什麼要這樣講、為什麼要那樣講?所以一旦我們沒有了解全面的說法的時候,我們就會固執在某一個時期或者對某一類有情講的那個法。在這樣的狀態下,我們很顯然就會犯下對佛語沒有究竟了解這樣一個缺失,所以仁波切在這裡說:「這就是片眼。」 [02′06″]</p>
<p>   比如說我們會認為修行最重要就是修定,對於佛陀講的修定的教理就非常仔細、非常認真地學,但是前面怎麼發起出離心、怎麼發起菩提心,甚至親近善知識、修行因果、暇滿人身的難得易失,這些都沒有聽聞,甚至惡趣苦都沒有聽聞,也沒有去重視閱讀。比如說我們看佛經的時候,自己閱《大藏經》會特別去閱讀「三惡趣苦」嗎?我們會特別特別去閱讀「深信因果」的那些教典嗎?乃至我們會極其極其重視地去閱讀「如何如理親近善知識」這樣的篇章——在《大藏經》中?很顯然,我們會一直找怎麼樣修定、怎麼樣能夠得定,乃至四禪八定全部都修起來是什麼的狀態,我們就只專注在這個部分。 [03′15″]</p>
<p>   所以為什麼會「觀視佛語多片眼」?是和自己的習性有關係的。因為我就比較喜歡學這個部分,學那個部分的時候就沒有感覺,甚至是反感;甚至覺得這是我不需要學的、多的,我不需要學的,我只要學我比較相應的、比較有歡喜心的。所以每個人要找每個人相應的部分,可是為什麼我們沒有去相應全圓的道次第呢?為什麼我們沒有一種力量去跟佛陀講的所有的法都相應呢?只相應一部分,這是為什麼呢?一部分美不美呢?是很美的。但是彩虹之所以美,就是赤、橙、黃、綠、青、藍、紫都有,它不是單色的。我們的心為什麼沒有去相應一種全圓的呢? [04′15″]</p>
<p>   就像我們平常的習慣,比如說想一個什麼問題,就容易栽在那個問題裡出不來了;做一件什麼事情,也會栽在那件事上出不來。好像是看什麼著什麼、想什麼著什麼,很難穿越正在緣的那個事情上,很難穿越當下的緣起點,看到遠方、看到虛空。所以佛陀講的教理浩瀚得像虛空一樣,如果沒有善知識把全圓的道次第在我們面前展現的話,我們並不想仰望虛空,我們只想看著腳下這塊路、從這兒到那兒的一點路弄清楚就可以了,我們並不想瞭望虛空。 [05′09″]
<p>   如何去領略虛空的浩瀚和美妙,這一定要善知識教我們,我們才會想要抬起頭、嚮往那浩瀚的虛空、嚮往那遼闊,而且不去排斥遼闊,想在內心中承載那個遼闊。能夠生起對佛法全圓道次第歡喜的期待,這種心量的擴展,完全是透過佛陀講的教理、善知識的教誨,我們才擴展內心的。 [00′38″]</p>
<p>   比如說我們現在學五大論,學到第一本《攝類學》的時候,一開始就會撞牆,四種回答、辯論......,就有很多問題撞牆。到中間的中級理路、高級理路就不知所云了。學、學、學到《現觀》的時候,那個像海一樣的教理就湧進來了,要讀的書非常地多,那個時候就會嚇到,這麼多、這麼多的教典都要學,而且要在既定的時間內把它看完,還有辯論題、還要背書、還要大考......。這些問題似乎是很有壓力的,可是如果不學的話,我們並不了解佛陀教理細緻的差別,乃至那些祖師對這個教理解釋的細緻差別都是不了解的,那這樣就沒有壓力嗎?這樣就去修行了,這樣沒有壓力嗎?學、辛苦、累,有沒有壓力?是有的。不學彷彿沒有壓力,因為不知道有多少無知的,就不會感受到無知的壓力。但是一旦學了之後就發現:哇!這些細緻的差別全是不了解的,必須詳細地辯論、詳細地取捨,經年累月地思考、跟善知識求教、反覆地看那些教典。 [01′51″]</p>
<p>   像我一直說性華法師把《現觀辨析》看了三、四十遍,看三、四十遍要多長時間啊?像一部論也是反覆地看好多遍,這是要花下時間的。但是如果沒有用這樣的時間,我們就很難懂這個論它詳細的所詮,乃至其中的差別。所以如何做到不片眼?就是要聽聞全圓。聽聞全圓,就要拿出那麼大的精力對佛所說的法進行全面的學習。 [02′27″]</p>
<p>   這樣的學習有壓力,什麼都不學的狀態,那不是更大的壓力嗎?因為那會有愚痴的壓力呀!所以在學習的時候,我們不只一次地會進入:欸!這到底是講什麼呀?似乎前面一片黑暗,完全看不到光亮。但是就在這樣的狀態下反覆地看、反覆地聽、反覆地討論,有的時候就會出現微光,有的時候會出現亮光,有的時候就會全亮了!因為我們的心在學習教典的時候會變得明晰、會變得細緻,而且它也會變得非常地專注。 [03′05″]</p>
<p>   學久了之後,再看到很多教典的時候就不會怕。你會發現手邊沒有那麼多教典倒覺得心裡發慌,看到很多書的時候反而不會怕,想把它一本、一本地看了。其實這也是一個習慣的養成,養成習慣就好了。「今勤瑜伽多寡聞」,他就是那樣的一個習慣。那麼廣聞也是一種習慣,養成了之後其實就樂於廣聞了,就會覺得天經地義,修行怎麼可以不廣泛地學習教理呢?我們會覺得不廣泛學教理是一件非常奇怪的事情。 [03′45″]</p>
<p>   當你內心發現自己已經開始認為學習教理是天經地義的修行的第一步,並不會認為學習教理在浪費修行時間的時候,其實是否也聽了宗大師的話、聽了師父的話,調整了內心的邪執,可以安住於諸大善知識所喜的正確道次第上?如果這樣的話,自己內心為什麼不歡喜一下呢?雖然聞思很辛苦,但是我終於改過來那個習氣毛病,我終於樂於多聞了!而且認為多聞就是修行本身,這是多麼欣喜的變化,所以請大家隨喜一下自己吧! [04′23″]
<p>   上節課講到 74 頁,仁波切對於「觀視佛語多片眼」的「片眼」所指的是什麼。接著是:「<p> 復乏理辨教義力<p> 」,佛薄伽梵所說的教義,要用各自的理路去分析,再再地觀察、思惟是不是這樣?從理論上分析道理的能力,就是這裡邊的理辨教義力。注意!這個「理辨教義力」的「理辨」,是指各自的理路去分析,然後去觀察是不是這樣;它是一種能力,從理路上分析道理的能力。那麼要有從理路上分析道理的能力的話,是不是我們得先獲得理路啊?你那個路是不是理路,還是亂七八糟的路、不是一條理路?正確的理路不是邪妄分別。 [00′55″]</p>
<p>   接下來到 75 頁的時候,說:「<p> 圓滿教要勝教授<p> 」,圓滿佛薄伽梵教法中一切扼要的最勝教授,比如像《廣論》這樣的道次第,這是所有智者歡喜道。大師觀見他們相續中遠離了智者歡喜之道,因此如《箋註》中所說的,大師要造此論。在六百多年前,宗大師觀察了那兩種修行人——今勤瑜伽多寡聞、廣聞不善於修要等等這些,相續中沒有智者所歡喜的道,遠離了智者所歡喜的道。注意喔,那都是非常用功的修行人喔!卻遠離了智者歡喜道。所以宗大師見此要釋此大車道,然後他心遍勇喜。 [01′48″]</p>
<p>   接下來仁波切說:科判實際上挺重要的,《箋註》的科判有兩家:一個是遍智妙音笑大師箋註的科判,另一個就是巴梭法王箋註的科判。妙音笑大師的科判——第一個是皈敬;第二,立誓宣說;第三,敦囑勵聽;第四,由辨識所詮之門而明如何講聞此法,四科。接著應該是巴梭法王的科判——此中分為:一、前行趣入講說之方便;二、正敘所說;三、宣講究竟之理。那麼我們已經說完「皈敬」和「立誓宣說」,這就是依照妙音笑大師的科判來說的。那麼依照巴梭法王的科判上來說,「皈敬殊勝天及根本傳承上師」也講完了,第二個「由明希欲造論因相之門而立誓造論」這是第二科。最初「前行趣入講說之方便」分了四科,已經結束了前兩科。 [02′46″]</p>
<p>   如果宗大師沒有造這樣一本論,清淨教法是很難住持在雪域西藏的。是為了非常重大的意義,所以大師造了此論。為什麼呀?可以從之前的偈文中知道,當時西藏的佛教是怎樣的?雖然佛陀的教法曾經興盛過,遍布著許多宗派。但事實上,真正地能夠清淨地修行解脫和一切遍智之道的法,真的不多,是很稀有的!這不是在批評其他的宗派,那時還沒有所謂的「日窩甘丹派」——這個「日窩甘丹派」就是格魯派的意思——宗大師並不是說其他宗派不行。那是什麼呢?是因為我們修行的方式有很多錯誤,所以才這樣說;是為了修持全圓的教法,而造了此論。因此,由於悲憫這些修行人,想以大悲之門為他們宣說正道,大師才說要著作此論。所以「<p> 見已釋此大車道,我心全然遍勇喜<p> 」,內心非常地歡喜,並且對這些人懷著強烈的大悲,而著作了此論。 [04′02″]
<p>   現在請大家把《四家合註入門》翻到 76 頁,看第二段。在第二段裡仁波切講了「所為等四法」。說在造任何論的時候都要具備四法,如果不具備這四法的話,造論就沒有意義了。那麼大家知道那四法是什麼嗎?就是「所詮、所為、究竟所為、係屬」這四個。任何一本清淨的論典,如果不具此四法的話,就不是清淨的論典。注意!這裡邊說清淨論典必須具備這四法,如果不具備就不是。 [00′59″]</p>
<p>   那麼現在逐一解釋一下:「所詮」是什麼呢?如果從《廣論》這本論來說,所詮到底是什麼?就可以從前面說過的「圓滿教要勝教授」的「勝教授」,和「見已釋此大車道」這個「大車道」,來了知本論的所詮。那麼「所詮」到底是什麼?是總攝一切佛語心要,由三士道次之門完整宣說的道次第,就是本論所詮,這是第一個。所以很顯然它是總攝了一切佛語的心要,一切佛語喔!一切佛語的心要。那麼一切佛語的心要到底是什麼?由三士道次之門——三士道完整宣說的道次第,沒有遺漏,就是本論所詮。這是第一個。 [02′04″]</p>
<p>   那麼第二個「所為」是什麼呢?「所為」要分的話還分「現前所為」和「究竟所為」兩者。那麼「所為」到底是什麼呢?那時候雪域有很多修行人不懂修行的扼要,然後修行不完整,為了將這樣一切導入正道,於是就造了此論,這就是「所為」。就是為了把不懂修行的扼要、修行不完整的那些修行人的修行導入正道。寫這本論的目的非常明顯。那麼在修行的時候,或者有缺漏,或者是片面,這前面都已經說了,為了獲得全然圓滿教證教法扼要的殊勝的教授,就是「所為」。所以「故離智者歡喜道,圓滿教要勝教授,見已」,是為了悲憫這一切人,為了令教法清淨,這個是「所為」。在字面上,除此以外就沒有再顯示其他的所為了。 [03′16″]</p>
<p>   那麼間接的所為是什麼呢?將一切具緣的所化機依三士道次第引導而正確修持,這也是所為。原來是當時的那種狀況下修行人所走入的歧途,為了將他們導入正軌所以造的。也是為了將一切所化機依三士道次第所引導之門而正確地修持,所以它的對機是很廣泛——一切具緣的所化機。 [03′55″]</p>
<p>   「究竟所為」是什麼?就是依著這個「所為」,安立一切所化機於圓滿菩提,最終會成佛。依三士道次第修行後,現證究竟無上圓滿正等菩提,這就是究竟的所為。因此宗喀巴大師說:「我心全然遍勇喜。」仁波切又講了一遍,說宗大師是非常非常歡喜的,為什麼呀?你看到這麼清淨的所為,到究竟所為——安立一切所化機於圓滿菩提道,這是一個非常非常令人振奮和歡喜的事情。 [04′38″]</p>
<p>   最後解釋了「係屬」,是指依著所詮成辦所為,依著所為成辦究竟所為,這就是係屬。在論典中並沒有明文。 [04′51″]
<p>   以前有一些老師來討論問題的時候,問說:「現在的人很難專注,長時間的專注都很難做到,就習慣看那些片斷的,比如說滑手機,或者影音、影像這樣一些東西。對於紙本的書好像已經很難做到專注,何況是鴻篇巨著,那麼到底出路是什麼?」那時候我的觀點依然是傳承經典,正因為是在這樣一個被影像和聲音完全包圍的時代,過分地喧雜,更需要沉澱下去的力量,所以更加顯示了經典存在、傳承的重要性。 [00′51″]</p>
<p>   大家如果常常習慣於對一個問題探討得不深入的話,久了之後很多東西都會隨之不深入的。比如信任也不會深入,對內心的觀察也不會深入,當人和人之間彼此有了矛盾,也不深入地去化解矛盾,再建立出更深的信任。所以出現一次問題之後,信任就會缺失一塊,就被打折一下,並沒有做一個及時的修整,到最後把信任的積累分數全部花光了之後,人們就無法建立信任了。信任是要在挫折、失敗和一次次的磨難中,在內心中堅強地建立出來的。你說信任是對其他人的信任嗎?有的時候也是對自己能夠行善的一個信心。 [01′42″]</p>
<p>   所以,正因為是在現在這個時代,經典的傳承更具有非凡的意義。看剛才仁波切講的:「所為四法」是一個清淨論典它之所以稱為清淨的必要條件,它的要求是非常清楚的——所詮到底是什麼。不是一個東西看著很高興,然後很高興地度過此時就可以了;它對現在還有究竟的未來,它都有一個一向連貫的利益。不是僅僅現在歡樂地度過此時就可以了,一定要對現在和未來有正確的饒益——我們的心續能夠斷惡修善,這樣才能夠離苦得樂。所以它引導我們的內心走向幸福、走向圓滿、走向會越來越離開痛苦這樣一個究竟的目標,是非常直接的、非常直接的;沒有什麼相違的因、沒有什麼相似的因在裡邊,就是直接面對、直接解決問題。 [02′48″]</p>
<p>   所以論典在這個時代更有它存在的意義,並不是很多都浮躁了,所以論典好像沒人學。沒人學,我們這麼多同學都在學嘛!正因為是這樣一個時代,我們更需要這種深刻剖析什麼是苦、什麼是苦因、如何斷除苦因、什麼是離苦得樂之道;我們更需要清晰準確地對內心做深刻地剖析,對很多現存的現象進行深刻地分析,然後去找到解決之道。解決之道就是在心上要滅除煩惱、在心上要滅除無明,透過轉心的方式達成內心的愉悅和安寧,甚至永遠的快樂。 [03′32″]</p>
<p>   所以我們在這樣的時代能夠聽到這樣的一本論,而且是師父講,然後仁波切講《四家合註》,我們現在在一起學,我實在是覺得——不敢說我心全然遍勇喜,但是每次到學全廣的時間我真的是非常、非常地高興!不管我們能不能面對面,不管你在什麼地方聽,我都覺得我們坐在一個大課堂裡一起學習《菩提道次第廣論》、學習《四家合註入門》,這真是一件非常有福報的事情!讓我們的心從喧喧嚷嚷、平常的生活中,從一些瑣碎的、煩煩惱惱的不愉快,卡卡的很多事情中抽身,把我們的心力抽出來在這個論典上努力,讓我們在這一刻非常清晰深刻地傾聽佛語、凝視內心,再調整自己的步伐。然後想一想,我們最高遠的目標是為了成就無上正等菩提,不僅僅是為了自我的安樂做很多努力,而是為了所有的有情都能夠趣入最圓滿的快樂,我做很多努力。 [04′38″]</p>
<p>   想一想的話,生命就會感到很遼闊、很振奮,不會被每天發生那些小事卡住,甚至別人的一個不愉快的臉色、一句說錯的話,心裡一直過不去,你就很容易穿越。很容易穿越的原因,就是因為我們能聽到《廣論》、能夠聽到佛語、能夠聽到這麼精彩地解釋內心——解釋很多有情的內心是怎麼痛苦的、解釋佛菩薩的內心是多麼地精彩,我們能夠直面生命最根本的問題,做最根本的解決。不會浮在事情的表面上,光是注意那些表面的事情就讓自己焦頭爛額,事情卻沒有改善。所以在這樣的時代能夠學到這樣的論,實在是師父的深恩、諸位的善根,所以大家一定要堅持學下去、好好學下去!非常地隨喜大家! [05′35″]
<p>   大家好!又到了我們一起研討《廣論》的時間了。今天我們要學習下一個偈子:「<p> 諸有偏執暗未覆,具辨善惡妙慧力,欲令暇身不唐捐,諸具善者專勵聽。<p> 」 [00′21″]</p>
<p>   在學習之前,大家還是要觀察一下自己的相續,讓我們從各種散亂的緣分上能夠集中心力,專心地學習《廣論》;而且要端正自己的發心——為了利益無窮無盡的眾生,我們必須去希求佛果,證得無上正等菩提。因為只有那樣的佛果所具有的悲、智、力,才能夠饒益所有的有情。所有的有情是什麼樣的有情呢?就是如母有情。 [00′59″]</p>
<p>   這個發心在每一次聽法、每一次做事的時候,希望大家能夠常常地憶念。開始的時候可能會覺得在念頭上過一下,但是久了之後,也會慢慢地覺得真的是為這樣一個目的去聽聞、去思惟、去做很多善行的。為什麼我們會為這個目標所動容、被它所牽引呢?因為就算要完成最美好的自利,不成佛也是不行的、也是不究竟的,因為我們還有那麼多的事情不了解。比如說法界有情的心,如果我們沒有去了解、沒有用一個廣大的智慧了解其中的因和果的話,我們還有太多的疑惑、還有太多的不知道,不會成為遍智。如果不成為遍智的話,就會有各種各樣的無知。在遍智的陽光下朗耀的一切所知,一切都已經沒有不知道的,那樣的心就是遍智——凡是所知的他都了解。想一想,誰不想擁有這樣的智慧呢?唯有佛陀有這樣的正遍知的功德,所以有一天希望真的要去獲得那種大智大慧,而且這種大智大慧都全部無一遺漏地用在利益法界有情這件事情上。 [02′30″]</p>
<p>   如果想要利益那麼廣大的有情,我們要累積的資糧也是無量無邊的,所以從現在開始就要殷重地發心。殷重地發心的「殷重」,就是要認真又認真地發心,不要在一開始發心的時候,就略略地、像風一樣吹過去,很輕的、都沒有痕跡,要很殷重地發心! [02′56″]</p>
<p>   好!那大家聽一下師父的帶子。<p>   他是這樣,對於最後有一點說:敦囑聽受。完了以後啊,又一再地諄諄善誘,告訴我們:「你們好好地要聽啊,要照著這個去做呀!」 [03′16″]</p>
<p> 諸有偏執暗未覆,具辨善惡妙慧力,欲令暇身不唐捐,諸具善者專勵聽。<p>   現在上面是有了這個圓滿的殊勝的教授了,這個教授對我們來說,是引導我們走上最圓滿直接的這條大路的,但是並不是人人能學的喲!要什麼條件呢?下面這個就是,凡是具有這種條件的人,哪一個?「偏執暗未覆」,這個偏、執、暗可以總別兩方面來說。總的來說,換句話說就是我們愚癡無明的種種障礙。分別的來說的話,「偏」就是——不偏於斷,也不偏於常。佛是中道說的——普通除了佛以外,其他的所餘一切,不是偏於斷邊就是偏於常邊,是這個偏。「執」呢?就是執著。這個執著是無量無邊的,歸納總說起來——人我執、法我執。所謂「暗」就是無明暗,這是根本。凡是沒有為這個所覆蓋的那些人,單單夠不夠?不夠!還要什麼?還要具足辨別善惡的這個能力。這是什麼能力啊?「妙慧力」,這個是智慧,這個智慧是勝妙的智慧的力量,他還要具足這個力量。 [05′14″]</p>
<p>   這一小段,先提一個問題。師父說:「<p> 有了這個圓滿的殊勝的教授<p> 」,請問:這個圓滿的殊勝的教授是什麼呢?這個教授對我們生命的意義又是什麼呢?是必須的嗎?一定要的嗎?然後師父答說:「<p> 是引導我們走上最圓滿直接的這條大路的。<p> 」請問:最圓滿直接的這條大路是通往何處?既然有了最圓滿殊勝的教授,沿著這個教授又可以最圓滿直接地走上這條大路——這兩句話師父用了兩個「圓滿」:「圓滿」的殊勝教授,引導我們走上最「圓滿」直接的這條大路。注意!第二個出現了「直接」,就是沒有彎路的意思。這麼美好的一件事,就是遇到了這個教授,可以引導我們走在這個大路上。那麼師父接著說:「<p> 不是人人能學的喲!<p> 」要條件。接著就出現了「<p> 條件<p> 」,師父是從一個具足聽聞的條件這樣的角度,來闡釋這個偈子。 [06′43″]</p>
<p>   接著就是「<p> 偏執暗未覆<p> 」。這個「暗」是形容偏執的,它總體來說就是一個無明所攝的。「執」就是執著,無量無邊的執著,根本就是人我執和法我執。但在此句話,就是指偏執的執著。 [07′02″]</p>
<p>   它的作用就是覆蔽——蓋住,全蓋住了,就叫覆;而沒有全蓋住,就叫未覆。「<p> 諸有偏執暗未覆<p> 」,可以理解為:對圓滿的教法沒有理解,只了解了片面的,然後就執取那部分的這種執取的暗,沒有被這個偏執暗覆蓋的人。這是《四家合註》裡解釋的。 [07′28″]</p>
<p>   沒有被覆蓋就可以了嗎?還要再加上「<p> 具足辨別善惡的這個能力<p> 」,就是「<p> 具辨善惡妙慧力<p> 」。「<p> 這是什麼能力啊?<p> 」「妙慧力」師父說:「<p> 這個智慧是勝妙的智慧的力量,他還要具足這個力量。<p> 」這個力量是什麼的力量?是智慧的力量。什麼是智慧?抉擇諸法的心識。此處是具有辨別善惡的這種抉擇,這種抉擇所產生的力量,就是明辨善惡的力量。 [08′12″]
<p>   在新版的《廣論》,師父對這段有一個描述,大家可以再聽一下。<p>   所以如果說一切普通一般人都為這個錯誤的無明所縛,現在呢,凡是不被這個所縛的,他需要什麼條件呢?能夠辨別善惡的妙慧力,這就是我們的資糧啊,這就比較不容易的一點。我們無始以來,現在我們不是沒有腦筋,也有很好腦筋的人,可是我們的好腦筋都用在壞的地方去了。啊!腦筋比誰都好,然後想歪事情想得個靈光,這不能說不好腦筋,但是不能算是智慧。現在我們要具的「妙慧力」,是要真正地辨別善跟惡。那麼這個善惡也有個特點喔!如果做了這件事情,將來果報好的叫作善,將來果報惡的叫作惡,這個是佛法當中,不是眼前看好壞,後面有它的深細的內涵。我眼前可以做得很好看,但是將來——這個所謂包括什麼?意樂,跟我實際上的行為,那就不細談了。要能夠具足這種的妙慧力量,這個妙慧就不容易了,妙慧通常就是對空性、緣起空有正確的認識,那才能夠離開上面這個偏執、這個束縛。 [01′53″]</p>
<p>   師父在新版的《廣論》裡還是在解釋這個「妙慧力」。師父提出了一個「好腦筋」,說:「<p> 我們不是沒有腦筋,也有很好腦筋的人,可是我們的好腦筋都用在壞的地方去了。<p> 」想歪的事情想得靈光,接著師父說了幾個字:「<p> 但是不能算是智慧。<p> 」區分了琢磨事情琢磨得很靈光,和這個慧力是有差別的,不算是智慧。 [02′27″]</p>
<p>   那麼此處說要具的妙慧力,就是要真正地能夠辨別正確的和非正確的,就是善和惡。那麼這個善惡也有特點,師父在這善惡裡面解釋了一下,說:「<p> 如果做了這件事情,將來果報好的叫作善,將來果報惡的叫作惡。<p> 」那麼將來的果報好是什麼?感生樂果。果報惡是什麼?感生苦果。這個是佛法當中——注意!鏡頭又拉遠了——「<p> 佛法當中,不是眼前看好壞,後面有它的深細的內涵。<p> 」我眼前可以做得很好看,但是將來如果不好的話,那還是不要做。師父又往下開演:那什麼事情能夠保證眼前也好、將來也好,要做這樣的事情呢?就是要從意樂上,還有自己的行為上開始注意。這是師父又講了具足辨別善惡的這個妙慧力。 [03′27″]</p>
<p>   這邊又提了一下:妙慧通常就是對空性、緣起有正確的認識,那才能夠徹底地離開上面的偏執、束縛。所以又把我們的心拉向一個目標——什麼能夠徹底地對治「偏執暗」,就去獲得清淨的空性智慧。 [03′53″]</p>
<p>   那我們現在再聽下一段。<p>   所以不被上面這種偏執暗所覆蓋,又有辨別善惡殊勝智慧力量的人,夠不夠?還不夠。他雖然有這個辨別的力量,但是呢他心裡沒有好樂之心,沒有用!還要有一種好樂、歡喜——啊!說我要求這個。他有什麼呢?「欲令暇身不唐捐」,真正一心想修行的那些人,一心想修行。他又想修行,又有辨別善惡的力量,而又沒有被種種愚癡黑暗所障礙這些人。那為什麼說欲令暇身不唐捐呢?要想修行,究實說來,人人想要,但是能修的條件就不是人人具足。這話怎麼講?我們也許會懷疑,怎麼會人人會想修行啊?對!以我們現在佛法來說,的的確確不是人人想修行。現在不要說修行,叫人家信佛法,都是難之又難,怎麼會說是人人要修行呢?這個道理簡單地說一下。 [05′24″]</p>
<p>   又重複那三個條件對吧!「<p> 不被上面這種偏執暗所覆蓋<p> 」,還要具有什麼力量了?「<p> 辨別善惡殊勝智慧力量<p> 」。夠不夠?不夠!說:「<p> 雖然有這個辨別的力量,但是呢他心裡沒有好樂之心,沒有用!<p> 」師父說:沒有用!還要有一種好樂、歡喜的心。說我要求這個。這段話,大家會覺得沒有好樂心就沒用嗎?在這裡邊師父特別強調了好樂心的重要性,我不知道諸位聽起來是怎樣的?好樂心有那麼重要嗎?只要有偏執暗未覆,辨別善惡妙慧的力量就可以了,為什麼還要有好樂之心?其實這好樂之心師父在解釋「欲」,「欲令暇身不唐捐」的欲,把它解釋成一種歡喜心,一種好樂和歡喜的感覺,想要這個暇身不唐捐。 [06′40″]</p>
<p>   大家會覺得沒有這個就沒用嗎?你們會不會覺得沒有這個好樂心也可以吧?如果沒有這個好樂心的話,那上面具足的那兩個力量——偏執暗未覆,又具足辨別善惡這樣的一個力量,這兩個力量到底要怎麼用來聽聞呢?因為它是勸大家聽聞的,如果我們對這個「欲令暇身不唐捐」,就是這一生不要讓它虛度,對這個沒有好樂心的話,就上面那兩個能力好像也沒有什麼用了。師父的立宗是這樣吧!如果現在還不能決定的話,你們也可以想一想。 [07′31″]
<p>   我想給大家再聽一下師父在新版《廣論》裡講的「欲令暇身不唐捐」的「欲」。 [00′09″]</p>
<p>   然後呢,不但具足這種力量,而且還有一個強烈的希望——「欲」,欲。欲是共通的,善惡都通的。欲,就是我要這個、我要這個,一個強烈的願望。如果說普通一般世間人來,強烈的貪名、貪利、貪吃、貪睡,壞的。現在我們這個欲是什麼?善法欲,我要學佛,要力爭上游!佛法當中有一點非常重要,精進是絕端重要,沒有這精進力量的話,佛法是絕無可能。所以後面說「資糧善中進第一」,不管你腦筋多好,如果沒有精進的力量的話,你絕不可能有佛法上面成就的!那麼這個精進要靠什麼呢?要靠這種「欲」,它有這種很強盛的善法欲——我要,要得到這個東西!有了這種對善法的強盛的好樂之心,那自然這種好樂之心,願意去努力,克服我們現在種種的難關。 [01′24″]</p>
<p>   在這一段裡,師父解釋欲是共通的,善的和惡的都是這樣,但是世間的心——貪名、貪利、貪吃、貪睡這些是壞的,這不是好的。此處的「欲」是善法欲,是要學佛,要力爭上游!它是一個強烈的希望、強烈的歡喜心。師父說:要有一個強烈的希望——「欲」。請問什麼是「強烈的希望」?有感受過強烈的希望嗎?我們的內心?不是一個淡淡的、可有可無的,而是必定要達到的、很熾盛的,那叫強烈的希望吧!就是你全身心地都想要實現那個、想要得到那個。 [02′20″]</p>
<p>   師父講到這裡,接著說了一個事情:「<p> 佛法當中有一點非常重要,<p> 」還記得師父講什麼了吧?「<p> 精進是絕端重要,沒有這精進力量的話,佛法是絕無可能。<p> 」師父居然用了四個字——絕無可能!「<p> 所以後面說『資糧善中進第一』,不管你腦筋多好,如果沒有精進的力量的話,你絕對不可能有佛法上面成就的!<p> 」這句話挺震撼的! [02′56″]</p>
<p>   「<p> 那麼這個精進要靠什麼呢?<p> 」推動你精進的那個力量是什麼?就要靠這個善法欲,大家還知道精進的定義嗎?勇於善嗎?就是一個歡喜趣入的力量。說:「<p> 我要,要得到這個東西!有了這種對善法的強盛的好樂之心,那自然這種好樂之心<p> 」,我們就「<p> 願意去努力,克服我們現在種種的難關。<p> 」 [03′24″]</p>
<p>   師父解釋這個「欲」,非常地深透啊!現在我們可以用得上吧!比如說「強烈的希望」,我們就可以觀照一下:我對於學《廣論》有沒有強烈的希望?對於學五大論有沒有強烈的希望?說:「<p> 佛法當中有一點非常重要,精進是絕端重要!<p> 」出現了「非常重要」和「絕端重要」,都是形容精進的。如果沒有這個精進力量的話,師父就說:「佛法是絕無可能!」不管腦筋多好,如果不精進的話,都不可能有成就。而這個精進的推動力就是對善法的歡喜心,可見「欲令暇身不唐捐」的這個「欲」字,蘊含了一個很大的學問。 [04′21″]</p>
<p>   我們可以想一想:如果師父不這樣把這個「欲」用重彩描繪出來,讓我們能夠強烈地注意到它的話,其實念過去就念過去了。這個「欲」字不會在我們的心中留下非常深刻、醒目的力量,也不會讓我們注意到:如果我沒有強烈地想要這一生不虛度的心趣入佛法、產生精進的話,有可能這一生會一事無成、會虛度此生。 [04′48″]</p>
<p>   所以師父用了很小的段落,把這個「欲」字描繪地非常非常清晰。我們可以把它當作目標,也可以把它當作一個尺子,觀察一下自己的現行:我們是否能有強烈清晰的願望趣入《廣論》、趣入五大論?因為只有趣入《廣論》、趣入五大論,用五大論的方式、用《廣論》的方式聞思修,才能夠「令暇身不唐捐」,因為這是一個開始。 [05′18″]</p>
<p>   「<p> 有了這種對善法的強盛的好樂之心<p> 」——師父又特別強調對善法的強盛的好樂之心。那我問一下:「欲令暇身不唐捐的心」是對善法的強烈的心嗎?請問怎樣令暇身不唐捐呢?就一定要精進於善吧!精進於善將來就會有快樂,有快樂是不是就令暇身沒有白白地浪費?因為我們用它去除了痛苦、得到了快樂。 [05′49″]</p>
<p>   所以宗大師說一定要「欲令暇身不唐捐」,是希望我們要為自他的生命爭取到快樂。一定要用這個得到暇身的機遇得到很多快樂,才能夠暇身不唐捐;如果用這個得到暇身的機會造了很多痛苦,那這個暇身就白白地浪費掉了!它還是建立在苦樂上的。所以到此處,可以感受到佛菩薩想讓我們快樂的那種心意。 [06′20″]</p>
<p>   接著說:「<p> 自然這種好樂之心<p> 」,注意!接下去那幾個字,還記得嗎?「<p> 願意去努力<p> 」,願意去努力!有了這個強盛的好樂之心之後,就願意去努力。努力什麼呀?「<p> 克服我們現在種種的難關<p> 」。請問「欲令暇身不唐捐」會遇到問題嗎?會呀!聞、思、修都會有困難的,種種難關,都是願意去努力的。那個願意的推動力到底是什麼?就是強盛的對善法的好樂之心,會推動我們克服種種困難。 [07′04″]
<p>   大家可以再聽新版的下一段。<p>   譬如說我們在座的,譬如說預科班的同學,大家去背書、寫字,它雖然滿辛苦,可是我有我的善法欲,我有我的理念,所以我願意去做。我們後面去拔草,乃至於去打掃廁所,我覺得必須要做積聚資糧,我就很認真地去做。那個都是善法欲,而且也是必不可少的!同樣的,將來越深入,這種越是需要,所以眼前很多事情是鍛鍊我們意志的。當我們了解了這一點,我們就絕對不願意出去的時候拖拖拉拉的;反正時間到了以後,我就不管、不去管它了,那個完全是傷害自己。你養成功偷懶的習慣,你將來要想真正修行的時候,你絕對不可能走得上去!這一點我順便在這個地方一談。所以要嘛不做,要做我就全部精神去做。那現在這種小的是簡單的事情,你有了這個能力了,將來越深入,你才能夠有這種強盛的意志力量。然後呢,不但呢內心當中有這種意志力量,而且你這個精力、體力都夠,你才能夠做這種最了不起的偉大的事情。所以這個「欲」,我在這裡簡單地說一下。 [01′26″]</p>
<p>   在這一段裡師父講到預科班的同學,像背書、寫字,滿辛苦的,「<p> 可是我有我的善法欲、我有我的理念,所以我願意去做<p> 」。比如說背書這件事,我們寺院有一百多個同學背完了《辨了義不了義》,背完了之後他們可以去寺院參訪朝禮。當時有一個小朋友,到了朝禮的時間他沒有背完。很多同學朝禮完寺院回來之後,有一次他見到我,就跟我說雖然朝禮寺院已經過了,但是他想把它背完。其實他當時也是可以去的,但是他的父母要幫他出路費,因為你要是背完了寺院就可以幫你出路費,如果沒背完父母要出路費,他說他不想讓他父母有負擔。我聽了是滿感動,我說:「那你就把它背完吧!」結果過了幾個月,有一天他就來跟我說:「《辨了義不了義》全部都背完了!」我真的是非常非常隨喜他!那麼厚的一本書就背完了。背完了,我就把寺院參訪的一袋禮物送給他,他真的是特別特別開心,露出了非常燦爛的微笑!這件事給我的印象是滿深的,他就是用一個很強的心把《辨了義不了義》背完了。 [02′52″]</p>
<p>   像我們寺院有很多同學《廣論》背完了,因為開始有人背完了,所以後面的班的同學就都有人要去背。所以一開始有高班的同學在背《辨了義不了義》,後來我們寺院背《辨了義不了義》也是一種習慣,就是會往下傳。然後善知識們也說:「背完了之後要複習,不要忘記了!」這一部論據說背一千遍就可以證悟空性,現在我們寺院有出家人已經背到快兩百遍了。 [03′23″]</p>
<p>   大家都知道背一遍就是串一遍,是要花很多時間的。背書就是要砸下時間,到那個時間不管你心情好還是壞、今天的健康狀況怎麼樣,到了背書課的時間你就要去背,不然就沒有進度。還有學《攝類學》的時候,有很多同學是《攝類學》整本背的,所以它是一個非常挑戰的、持之以恆的堅持,這也是出家人對教證法能夠納入心續的一個努力,它需要很多很多毅力和堅持,還有歡喜心。所以師父在這裡邊說:「<p> 我有我的善法欲,我有我的理念,所以我願意去做。<p> 」絕對不可以缺少的,就是善法欲! [04′08″]</p>
<p>   接著師父又舉了一個去拔草、打掃廁所的例子。其實打掃衛生這件事,我們寺院有很多很多出家人在參與。像是掃洗手間這件事,很多同學是默默地掃、偷偷地掃的,因為當作懺悔,或者當作集資糧。有的時候一個人掃好多洗手間,但是他都不講,他會偷偷地累積這個資糧,還不讓人看見。還有同學發心護生啊、撿蚯蚓啊,保護那些小生命,不管是颳風、下雨,他都是風雨無阻一直堅守在那條路上,把那些小生命移開,這都是一個了不起的堅持! [04′56″]
<p>   師父說:「<p> 我覺得必須要做集聚資糧,我就很認真地去做。那個都是善法欲,而且也是必不可少的!同樣的,將來越深入,這種越是需要。<p> 」越深入想要獲得佛法的證悟的時候,就越需要資糧。「<p> 所以眼前很多事情是鍛鍊我們意志的。<p> 」意志真的是要刻意去鍛鍊,如果不鍛鍊的話,我們遇到難的事情就退在後面,就不想前進了;養成習慣的話,遇難就退。這件事我可能心力不夠,或者我的能力不夠,但是能否就這件事因為心力不夠、因為能力不夠我就鍛鍊一下?鍛鍊久了之後,碰到挑戰的我們就敢向前一步。 [00′53″]</p>
<p>   所以師父說:「<p> 當我們了解了這一點,我們就絕對不願意出去的時候拖拖拉拉的。<p> 」師父是一個守時非常非常嚴的人。在僧團裡守時也很重要,如果大眾集會的時候總是遲到,時間久了也會有壓力,所以還是要守時,這也是體現一個精進的例子。 [01′20″]</p>
<p>   養成好習慣是可以的,但是如果養成了傷害自己、尤其是養成偷懶的習慣,將來要想真正修行的時候,絕對不可能走得上去的。所以別看這些小的事情我們好像不是很在意,今天拖一點,然後明天覺得困難就不去了,後天心情不好就不去了,就給自己放水,會養成功偷懶——這裡邊師父說了一個「偷懶」。 [01′52″]</p>
<p>   我也曾問一個小朋友,說:「你堅持背書,最大的困難是什麼?」他當時想了想,跟我說:「最大的問題應該是給我自己找理由——找不背書的理由,因為只要找到那個理由我就可以不背書了。」其實就是此處所說的「偷懶」。我發現那個小朋友那麼小,他就知道要對治偷懶的習慣。他認為:如果他一直給自己找理由不背書,那他就永遠不會按進度背書,他就不可能一年一本書、一本書那樣背完。在他那麼小的時候,就知道偷懶這個習慣是非常可怕的!那麼用師父的教誨來看呢,說:「<p> 將來要想真正修行的時候<p> 」,偷懶——就「<p> 絕對不可能走得上去!<p> 」所以又跟精進那個涵義是一樣的。又跟師父講的:在可上可下的時候,請向上一步,而不要向下一步是一樣的。偷懶就一定是向下一步。 [03′02″]</p>
<p>   所以師父接著說:「<p> 要嘛不做,要做我就全部精神去做。那現在這種小的是簡單的事情。<p> 」別看那個小的簡單的事情,「<p> 有了這個能力了,將來越深入,你才能夠有這種強盛的意志力量。然後呢,不但呢內心當中有這種意志力量,而且你這個精力、體力都夠,你才能夠做這種最了不起的偉大的事情。<p> 」師父把修行一向看為是最了不起的偉大的事情,它需要強盛的意志力、體力、精力等等。在這裡非常強調這個「意志力」,也強調了善法欲在推動我們修行的這個重要性,就是歡喜心、精進的力量。 [04′00″]</p>
<p>   所以「欲令暇身不唐捐」的「欲」字,我們可以多處結合自己的現行看一看:譬如偷懶——當自己沒心力,意志力不夠的時候就選擇下滑,久了之後就自然地會屈服於任何逆境,有逆境來就不幹了,心情不好也不幹了,總之找很多理由偷懶。師父說:修行絕對上不去的!如果絕對上不去的話,就只有一條路——退!所以師父說:就要打起全部的精神去做。培養我們對於善法的歡喜心,這件事就變得非常地重要,因為它會推動我們願意去做。 [04′50″]</p>
<p>   我在想那小朋友為什麼那麼小就知道對治背書的時候偷懶?他就覺得背書是他的一個事業,他一定要把它背完;也可能在背書的時候,他感受到快樂、愉悅和成功感;或者他覺得就應該背誦佛陀的教典......,當然有很多很多他可能自己也講不清楚的理由,他覺得這事非常非常重要。但是他長大了之後,他一定會受益於他自己的那個見解——「不要給自己找理由,我就能把書背完;一旦我找到不背書的理由,我就背不完。」其實就用這麼簡單的方式,他就堅持背了一本又一本的書。 [05′34″]
<p>   大家好!又到了我們研討《廣論》的時間了!這段時間不知道你們修行有沒有進步?無論怎樣,都必須從現在的緣起點上開始努力,那麼當下的緣起點就是聽聞的前行。佛法特別側重動機的修鍊,就是我們做一件事是為什麼做的,現在我們來研討《廣論》是為什麼的?如果只是為了自己能夠離開痛苦、得到快樂,當然也是可以的;但是同樣的時間,如果我們發一個相似菩提心那樣的心念,就是希望為了令所有的如母有情能夠離開痛苦、得到快樂,我必須去希求佛果,得到一切遍智的果位。哪怕我們在內心用一秒鐘的時間這樣作意一下,這都是有不可思議的力量,能夠攝持我們的善根,再去迴向的話,直到成佛都不乾涸。所以在每一次聽聞的時候,我都是希望大家和我——我們一起,要一遍一遍地策勵大乘的發心。 [01′26″]</p>
<p>   所以在每一次動機的策動,雖然你們可能全都會背我說那幾句話了,但是這件事到底在諸位的心中有沒有生根,有沒有成為自己的習慣這很重要!一旦成為習慣,不用策勵就自己出現了,在聽《廣論》之前就油然而生,會生起要發心這樣的一個作意。 [01′54″]</p>
<p>   在聽聞前是這樣作意,從聽聞前行開始擴大、擴大、擴大,課誦呀、善行啊、供養三寶,甚至一日幾餐都是為了進趣無上菩提,就好像原來是寸草不生的土地,現在就開始被青草、被生機勃勃的綠意一點點地覆蓋。希望我們的動機慢慢地由聽聞前行開始擴展、擴展、擴展,直到做什麼事情都不是為了一己之私,都是希望能夠令所有如母有情離苦得樂,我們去證得大覺佛位,為了這樣一個目標! [02′40″]</p>
<p>   觀察一下自己:此時此刻能不能靜下心來,摒除其他的外緣、專心致志,在我們的心念上造就一個純淨的「為利有情願成佛」的動機?以這樣的動機來聽聞《菩提道次第廣論》,來思惟、研討,直到宗大師的教法能在我們的心續中真的生起如《廣論》上所說的那樣的證量。 [03′14″]</p>
<p>   好!我們就可以聽師父的《菩提道次第廣論》舊版的帶子。 [03′21″]</p>
<p>   佛法真正的目的是什麼?這個我們這地方要來找一找。平常我們說佛法,什麼是佛法?三藏十二部教典。一看哪,一看就頭痛,哇!這麼多的書。然後看起來是一竅不通,講起來是大小、性相、顯密,又教你莫衷一是,這是事實。但是如果說你能夠很深入、仔細地去探索它的目的,它的目的就是單純極了,什麼目的啊?兩個字:苦樂——去掉苦,圓滿得到樂,就是這樣。以這兩個標準來說,世間沒有一個人例外,所有的人他真正忙碌的目的無非為這個。不管他是理智的,啊,求什麼,你就他的最深入的這個中心,你去問,幹什麼?他還是找這個。或者有很多的感情的糊裡糊塗的,他雖然糊裡糊塗,可是他為什麼呀?如果說你仔細地讓他探索一下的話,還是這個。所以,普通世間所以得不到,因為並不了解苦樂的真正的真相,以及苦樂的原因。那個事情真正的真相都弄不清楚,所以呀怎麼弄就怎麼錯,而只是佛才把那個內涵說得清清楚楚、明明白白。 [05′00″]</p>
<p>   好!我提一個問題:師父最先提出的問題是什麼?說要我們找一找、討論一下的。對!佛法真正的目的。「<p> 佛法真正的目的是什麼?<p> 」師父接著說:「<p> 平常我們說佛法,什麼是佛法?<p> 」當我們捫心自問,或者我們研討的時候互相問說:「什麼是佛法?」大家心裡會有什麼樣的概念呢?師父舉了一個例子,說:「<p> 三藏十二部教典<p> 」就是佛法。三藏十二部的教典浩如煙海,非常地深邃、博大精深,但是「<p> 一看就頭痛<p> 」,這麼多的書一看呢看不懂,不懂到什麼程度呢?「<p> 是一竅不通。<p> 」我不知道大家看經典,會不會有人覺得自己看懂了?這是看喔!「<p> 講起來是大小、性相、顯密,又教你莫衷一是<p> 」,不知道怎麼樣貫通,甚至是大、小、性、相一個也不懂。接著師父說了幾個字:「<p> 這是事實。<p> 」說如果你感覺到這樣的話,那麼是事實。 [06′29″]</p>
<p>   當我們看不懂、也說不明白的時候會很苦惱。大家一開始遇到《廣論》的時候,都覺得《廣論》很難讀,很多學歷很好的人,他們都覺得《廣論》不是很好讀。那麼這是顯而易見的一個事實,但是有沒有什麼非常簡單的方式,可以說佛法的目的是什麼?因為做什麼事都要有一個目的,那麼「目的是什麼」這件事會不會非常簡單地就了解到呢?那用什麼方式了解呢? [07′02″]</p>
<p>   師父接著說:雖然這樣是事實,「<p> 但是如果說你能夠很深入、仔細地去探索它的目的<p> 」,注意!這裡邊「<p> 能夠很深入、仔細地<p> 」,後面那兩個字叫「<p> 探索<p> 」。就是在佛陀的三藏十二部的教典裡,不要很慌亂地、仔細地,而且不要很膚淺地深入去探索它的目的的話,它的目的就是單純的。而且師父說:「<p> 單純極了!<p> 」是吧?是單純極了吧?很難想像三藏十二部的教典,那麼博大精深的教法,它的目的居然是「單純極了」這四個字。一開始聽到這裡的時候,應該大家和我一樣都是非常地驚訝、驚愕:這麼深邃的智慧,平常的狀態難以企及的這些教典,它的目的難道這麼單純? [08′18″]</p>
<p>   那麼什麼目的呀?居然還有更簡單的,「<p> 兩個字——苦樂!<p> 」接著師父馬上說:「<p> 去掉苦、圓滿得到樂,就是這樣。<p> 」非常肯定!就這麼簡單——苦樂!去掉苦、圓滿得到樂。師父又講一遍,說:「就是這樣!」 [08′43″]</p>
<p>   當我們看到此處的時候,再回頭去想一下佛法的目的:單純極了,就兩個字——苦樂,苦是要被去除的,樂是要被我們得到的。就這麼簡單嗎?用了那麼多的教典,佛陀四十九年說法,祖師大德生生世世擎舉著正法的火炬;佛陀因地不惜捨頭目腦髓,歷代的祖師把它傳承、維繫下來,所受的那些艱辛、憂悲苦惱,就為了眾生能得到快樂、去掉痛苦。就這麼單純的、單純的、極為單純的目的——離苦得樂! [09′27″]
<p>   單是討論一個佛法的目的是什麼這件事,如果沒有善知識引領我們,我們可能會列出一千個、一萬個目的。那麼在這所有的目的中,我們可能找不到一個非常切近我們內心的目的,也不能找到一個極為單純的目的。但是師父說如果你仔細地、深入地、很深入地去探究它的目的的話——那麼說這句話的一定是個過來人嘛!他仔細地、很深入地探究過了,所以他知道佛法的目的是極為單純的——就是苦樂,離開痛苦、得到快樂,離苦得樂,就是這樣! [00′43″]</p>
<p>   師父在講《廣論》的時候,在帶我們聽聞的時候,非常容易地把很多霧霾的狀態、我們思考的一些陰暗的地方,很快地就去除掉了。真的就像一道陽光照進來,你會非常清晰你在學什麼、你在思考什麼,不會越學越混亂,越學越不知道在幹什麼。 [01′04″]</p>
<p>   那麼佛法的目的如果是這麼單純,甚至是單純極了的話,師父說:「<p> 以這兩個標準來說,世間沒有一個人例外,所有的人他真正忙碌的目的無非為這個。<p> 」這句話是在講什麼?佛法的目標就是所有的世間人忙碌的目標——人忙碌就是為了離苦得樂,說:無非是為了這個。不管他是理智的、求什麼,就他深入的這個中心去問的話,還是為找這個。然後也提到:感情糊里糊塗的,他雖然糊里糊塗的,可是為什麼?如果去探索,還是為了這個。 [01′43″]</p>
<p>   但是現在問題就出現了:佛法的目的是去掉痛苦、得到快樂,所有人的目標,忙碌啊,都是為了離開痛苦、得到快樂,那為什麼我們這麼賣力氣地奔忙都沒有得到呢?師父說:「<p> 普通世間所以得不到,因為並不了解苦樂的真正的真相,以及苦樂的原因。<p> 」這兩句話非常非常地震撼!說:「之所以得不到,是因為並不了解苦樂真正的真相」,這已經涉及到什麼是苦、什麼是樂,它的定義發生了改變,因為真相嘛!真相和假相、和相似的東西,就像「涇渭分明」,像涇水和渭水一樣是很清楚的。 [02′42″]</p>
<p>   那麼苦和樂的定義到底是什麼?苦樂參半是不是樂?一會兒苦、一會兒樂,是不是樂?快樂、快樂、快樂到極限的時候就突然掉下來,那是不是樂?那是不是我們要得到的快樂呢?那是不是真正的快樂的真相呢?還有這個苦樂的真相背後的原因,以及之所以沒有達到離苦得樂的那個原因是什麼?師父說:「<p> 那個事情真正的真相都弄不清楚,所以呀怎麼弄就怎麼錯。<p> 」怎麼費力氣想要得到快樂、去掉痛苦都是不行的,因為不了解真相,以及導致那個真相的原因都不了解,所以平常我們是怎麼弄怎麼錯,因為真相弄不清楚。 [03′34″]</p>
<p>   接著師父講的那句話還記得嗎?如果你們有手抄可以看,是哪幾個字啊?師父用了一個「<p> 而<p> 」,轉折了,而只有誰呀?「<p> 只是佛才把那個內涵說得清清楚楚、明明白白。<p> 」師父做了對比,說我們不了解苦樂的真相,所以怎麼努力就是不能徹底地離開痛苦、得到快樂。譬如生死這件事,無論世間多圓滿,最後死亡一來,一切世間的圓滿都會被破壞掉;無論多健康、長得多莊嚴,都會被老死所毀滅。你怎麼樣去把老死毀滅掉呢?不知道該怎麼辦,就只能萬分痛苦地接受。因為無可奈何,在任何一家醫院裡,沒有賣一個藥,說吃了這個藥可以不死的,沒有這樣的藥!也沒有醫生說:「我給你治了之後,你就可以永遠不死。」沒有這樣的東西。所以我們最終極、到了那個頂點,就會被死所摧壞,這個是遍及三界的痛苦,是沒有一個眾生可以躲開的痛苦,所以它是非常酷烈的。 [04′56″]</p>
<p>   那麼到底我們有沒有辦法可以解決?這個真相到底可不可以了解?這些痛苦有沒有原因?為什麼會受這些?如果說從來如此,從過去到現在、到未來完全無法可想,就是永遠是這樣的,那我們得到的一切永遠會失去,聚合的一切永遠會散開,樂的最終會都變成苦的,因為死亡四大分散都是苦的,然後我們的身體也會隨之變成塵埃,和四大一樣就成那樣子了。 [05′29″]</p>
<p>   如果這一切事情無法可想,那真是太悲哀了!可是不是這樣的,是有辦法的!所以師父說:「<p> 而只是佛<p> 」,只有佛陀,「<p> 才把那個內涵說得清清楚楚。<p> 」什麼內涵?苦樂的標準,真正的苦樂的真相,以及苦樂的原因。把這個內涵說得——那八個字——「<p> 清清楚楚、明明白白。<p> 」所以要想在生死輪迴中真正地離開痛苦、得到快樂的話,一定要找到佛陀——示道大師,因為他對一切事物有最正確的、完全周遍的了解。只要是所知,沒有佛陀的心續不了解的,他的心跟所知一樣大,他完全了解為什麼會痛苦,乃至為什麼會得到快樂、什麼是快樂、什麼是痛苦,以及它們的原因。所以這一點是完全沒有含糊,清清楚楚、明明白白地講過了。師父在這麼前邊的〈皈敬頌〉裡,再一次地在我們的痛苦、得不到快樂、怎麼也弄不清楚的這種迷悶的狀態下,好像突然一道光,讓我們看到佛陀。 [06′45″]</p>
<p>   這件事不是怎麼想都沒有辦法,也不是怎麼努力都是絕望的;痛苦不是無限地長,怎麼也切不斷,就像抽刀斷水水還流的憂愁,不是那樣的,它是可以被斬斷的。苦是可以被斷的,樂是可以像我們用手可以拿到一樣把它取來的,我們是有這樣的力量的。佛陀就是這樣的有力士夫,我們一旦皈依佛,跟隨佛為示道大師,我們在後面學,我們最終也將獲得這樣的力量。所以師父又把皈依的內涵再再地在我們面前呈現,讓我們在苦楚中考慮一下:佛法的目的——離苦得樂,到底可不可以達到?為什麼我們達不到?是不是佛陀把這些問題講得清清楚楚、明明白白?佛法的目的是不是這麼單純?我們所有的追求、所有的掙扎、所有的奮鬥,只是為了離開痛苦、得到快樂,是不是這樣?我們可以捫心自問。 [07′48″]</p>
<p>   如果捫心自問個千百回、上萬回,都會得到:其實我做的所有事情都是想要得到快樂、去掉痛苦,也想讓我關愛的那些人、那些生命都去掉痛苦、得到快樂,這個目標是跟佛法討論的目標完全一致的話,那麼接下來就會引生下面的問題。那就是下一段。 [08′13″]
<p>   好!現在我們來聽下一段。<p>   所以,普通人之所以真的不了解,也不想修,是不了解佛法,你究實了解了佛法,可以說沒有一個人例外的。不但是人哪,乃至於三界的一切有情,比如隨便一個小蟲,哦,你跑過去牠馬上躲掉了。為什麼?怕受傷害呀!牠也怕苦的,換句話說,牠也要去掉苦。隨便一個小蟲,有好吃的東西,牠馬上來了,哪怕冒生命的危險,像蚊蟲,明明叮著你啊,一巴掌打死了,牠還要吃你,牠要求快樂嘛!沒有一個例外的。 [00′40″]</p>
<p>   在這一小段裡,師父說:「<p> 普通人之所以真的不了解,也不想修,是不了解佛法,你究實了解了佛法,可以說沒有一個人例外的。<p> 」不但是人,所有的有情,三界的一切有情都會想修行。為什麼呢?前面那一段講,因為佛法的目的就是離開痛苦、得到快樂,那麼所有的生命都是想要這個目標;但是不了解佛法的時候,不知道學佛法要做什麼。 [01′15″]</p>
<p>   這裡邊師父又舉了一個例子:從另一個角度說,真的是所有的有情做的一切事情都是為了離苦得樂嗎?沒有盲無目的的時候嗎?不管是什麼都沒有目標,沒有那種時候嗎?師父就舉了:「<p> 隨便一個小蟲<p> 」,我們跑過去看有小蟲,牠就趕快逃跑了。然後師父會探究小蟲為什麼會逃跑?從小到大我們應該都經歷過吧?一個小生命你突然靠近牠,牠會逃跑。為什麼牠會逃跑呢?答案是:「<p> 怕受傷害。<p> 」因為牠那麼小,我們那麼大,以強淩弱,怕被傷害。說:「<p> 牠也怕苦的<p> 」,包括那麼小一個生命也是怕苦的。「<p> 換句話說,牠也要去掉苦。<p> 」牠去掉痛苦就是從這個這麼大的一個龐然大物面前逃開啊!所以牠要去掉苦。 [02′21″]</p>
<p>   「<p> 隨便一個小蟲<p> 」,比如說果蠅,那麼小,牠有分辨出水果香氣的能力,說:「<p> 有好吃的東西,牠馬上來了,哪怕冒生命的危險<p> 」,師父這裡面就舉了蚊蟲,就叮人啊!普通人不了解佛法的時候,就一巴掌下去把牠打死了,牠只是為了吸我們一小滴血,就付出了生命的代價。為什麼?要快樂!所以師父結論:「<p> 沒有一個例外的。<p> 」所有的有情做所有的事情,都是為了離苦得樂,哪怕是這麼小的生命,隨便一個小蟲都是為了這個。 [03′18″]</p>
<p>   好!那麼我們再聽下一段。<p>   但是儘管沒有一個人例外的都想修行,但是啊想修行是修,能修行的條件不具足,畜生不可能!只有人。就算得到的人哪,他還是不行,還要種種條件,所以得到了人身而能修行的這一個,叫作暇滿的人身。這個好難得、好難得啊!非常難得!所以我們平常常常說,佛法裡面叫人身難得,這是講這個暇滿的人身。現在我們得到了以後啊,哎呀,趕快呀!要想趁這個機會得到真正快樂,去掉真正痛苦的,只有一個辦法,就是這個!所以具足上面這種條件的人哪,他那個時候要想修行,而又有圓滿的修行的教授,那麼那個時候怎麼辦呢?應該要好好地聽。像上面這種人,這是具足善根的人,這好不容易哦!所以真正具足上面這種善根的人哪,你要想修行吧,你又能夠辨別是非、又沒有障礙,那麼那個時候要好好地,這地方聽聞這個最殊勝圓滿的教授啊! [04′51″]</p>
<p>   前面講到佛法的目的,就是要離開痛苦、得到快樂,儘管三藏十二部的教典浩如煙海,但它的目的極為單純,就是離開痛苦、得到快樂。那麼所有眾生做所有的事情,也是為了自己能夠離開痛苦、得到快樂。如果是這樣的話,佛法的目的和我們所有有情做所有事情的目的,都是完全吻合的。那麼就變成沒有一個人不想修行的——如果了解了佛法。如果能夠深入、仔細地探究了佛法的目的是這個,沒有人不想修行! [05′32″]</p>
<p>   接著這一段探討到:「<p> 儘管沒有一個人例外的都想修行,但是啊想修行是修,能修的條件不具足<p> 」,說我們都想要得到快樂、去掉痛苦,但是這是要有條件的。首先,「<p> 畜生不可能!<p> 」海裡的、空中飛的、土裡的那些有情沒有辦法。師父說:「<p> 只有人。就算得到的人哪,他還是不行,還要種種條件,所以得到了人身而能修行的<p> 」,要能得到一個能修行的人身,就叫暇滿的人身,所以這個人身的前面是有條件的,這個條件叫「暇滿」。那麼這個暇滿,師父說:「<p> 好難得、好難得啊!非常難得!<p> 」連著三個。看喔!這個「好難得、好難得啊!」一個感嘆。又接著說:「非常難得!」然後接著:「<p> 所以我們平常常常說,佛法裡面叫人身難得<p> 」,這四個了。四個「難得」喔!「這個好難得、好難得啊!非常難得!」然後,「佛法裡面叫人身難得。」說這是講暇滿人身。 [07′06″]</p>
<p>   能得到一個人身就很困難了,還要得到一個暇滿的人身才能夠修學佛法,能夠具足在得到暇滿的時候離開痛苦、得到快樂的——注意——這個條件。那麼這麼難得的得到了以後,師父就說:「<p> 哎呀,趕快呀!<p> 」接著是這三個字:「趕快呀!」要趁這個機會得到真正的什麼呀?快樂。因為你現在就是非常不容易地具足了離開痛苦、得到快樂的那個條件了,那麼這個時候要趕快喔!去得到真正的快樂、去掉真正的痛苦。因為「<p> 只有一個辦法,就是這個!<p> 」就是修學佛法呀! [07′53″]</p>
<p>   所以具足上面的條件的人,他這個時候想要修行,注意!還得要有圓滿的修行的教授。那麼具足了能夠修行的暇滿人身,要想修行,還要有圓滿修行的教授,那個時候怎麼辦呢?又下一步,「<p> 應該要好好地聽。<p> 」說像上面列舉具足這些條件的人,就是什麼呀?「<p> 具足善根的人,這好不容易哦!<p> 」又來一個,「好不容易喔!」四個難得,接著師父又說:好不容易啊! [08′35″]
<p>   「<p> 所以真正具足上面這種善根的人哪,你要想修行吧!<p> 」下面又有一個:「<p> 又能夠辨別是非、又沒有障礙<p> 」,又多一個。「<p> 那麼那個時候要好好地,這地方聽聞這個最殊勝圓滿的教授!<p> 」想一想,此時此刻的你、我,就在用我們生命中珍貴的時間聽聞,聽聞這個殊勝、圓滿、清淨的教授。所以此刻對我們來說彌足珍貴、千載難逢、萬劫難遇!我們就在聽喔!有沒有具足辨別是非?有具足一點吧!有沒有障礙?是有一些障礙,但是我們穿越,我們都在聽啊!此刻就在聽。 [00′45″]</p>
<p>   所以師父說:那麼這個時候要好好地在這地方聽聞這個最殊勝圓滿的教授!此時此刻我們即是正在做這些事情,所以真的要好好地隨喜。我們現在所做的事情,一定是令師父非常歡喜和欣慰的。他那麼想把《廣論》講給我們,費了那麼多心力,希望我們能夠對這樣殊勝圓滿的離苦得樂之道生起信心、依之而修。費了那麼多的辛苦,就是希望我們達成我們自身的目的——令自他都離苦得樂。 [01′24″]</p>
<p>   想一想,此時此刻我們有多少弟子都在聽,希望我們如理聽聞能夠令師父歡喜,生生世世得到他的攝受。也上供十方佛,令所有的佛陀、祖師、菩薩都能夠歡喜,加持我們,讓我們的聽聞沒有障礙、思惟沒有障礙,乃至修習都沒有障礙,一切都如法如量地能夠生起。 [01′50″]</p>
<p>   想一想,儘管生命中有數不清的煩惱,有那麼多的求不得苦,或者我們現在損失錢財、學業不利、感情不順,甚至是生了大病,但是我們還有信心啊!我們還具足這些能夠聽聞的條件。因為我們知道這是最清淨的離苦得樂之道,我依靠它能夠成辦究竟離苦、究竟得樂這樣的一個目標,而且現在我具有這個條件。所以師父又說:「趕快!」就是不要耽擱啊,不要耽擱!用一切可能運用的時間,要來聽聞離苦得樂之道,並且思惟、修行。 [02′34″]</p>
<p>   所以在這裡,會不會想到在度母救八難那裡邊,她都有說:「趕快呀、趕快呀!要趣向解脫呀!要趣向解脫呀!」很多的咒語裡也有這樣的善知識的催促。所以善知識有一個非常不共的功德,就是鞭策我們、催促我們的心能夠入道。他一直要鞭策我們、一直要催促我們,不然我們走到哪裡就會粘到哪裡,無論是苦、無論是樂,苦也會像進入沼澤一樣出不來,樂也是就粘在那兒走不開。但是三界無安,猶如火宅啊!我們必須利用得到修行條件的這個暇滿人身的機會——遇到殊勝圓滿的教法、又能夠聽聞、又具足辨別善惡、又沒有什麼障礙,或者有遇到障礙但是可以穿越——利用這個時間要趕快、趕快地修行,千萬不要耽擱啊,要把修行排在前面!就比如說每天聽聞你為什麼能堅持?哪怕是幾分鐘,哪怕是十分鐘、二十分鐘、半小時,它將對我們的生命產生不可思議的影響力!所以這時間對我們來說,真的是非常非常地珍貴,真的是很莊嚴、很難得的時光——會遇教法,而且我們有信心。 [03′50″]</p>
<p>   想一想,儘管生命中發生了很多很多的痛苦,但是我們遇到教法了,我們有善知識攝受,而且我有信心,這件事應該永久地、永遠地讓我們想起來就高興吧!就歡喜吧!比如說從一開始全廣講到現在,你都在聽,都沒有間斷,無論家裡有什麼事、工作、學習......,都在聽。還有在學習五大論的過程中,有很多出家人無論遇到多少困難都在堅持,堅持十五年都沒有間斷地學習,這將累積多大的善根,累積多大的善行!所以一定不要去追悔,說:「好像我學這麼多,我沒修行、我沒用,那沒用還不如享樂。」是這樣嗎?無量劫來難可值遇的佛法我們聽聞到了,怎麼可能沒用? [04′42″]</p>
<p>   那麼我們的心續有沒有顯現它磅礡的,比如空性那樣,像一把鋒利的寶劍,碰到煩惱立刻斬斷煩惱,有沒有修鍊出那樣俐落地斬斷煩惱的力量?還沒有。但是有種下種子嗎?有在培植我們的信根嗎?儘管遇到多少困難,我們都不願意放棄、都捨不得放棄,因為宗大師教法實在是太珍貴了,師父這樣善巧的講說,將佛法送進我們的內心,我們就賴以存活。很多人都是這樣,不學《廣論》,不知道要怎麼面對一天大大小小內心的波折和煩惱;離開善知識,我們也不知道如何在佛法上發心、集資糧,都不知道怎麼做。 [05′29″]</p>
<p>   所以遇到了教法,有善知識講說,我又能夠具足善根,千萬不要追悔自己,認為聽聞沒用。大家都知道,如果一座如法的聽聞,會在我們的心續上造成一種饒益,這個力量能夠切斷正在進行的惡行,會變成一個很強的勢力趣向於正法、趣向於三主要道;就像陰天陰了很久突然太陽出現,那世界都是光亮和燦爛的。所以大家一定要好好地隨喜自己在正法上所做的努力,不要因為現在生了一個煩惱,我還切斷不了,就認為佛法沒有切斷煩惱的力量。No!不是這樣的!一旦我們一直練、一直練,一直磨那個抉擇的寶劍,劍鋒就會慢慢地鋒利,有一天它就會劍起劍落,煩惱就斷掉了,抖掉煩惱的速度就像抖落灰塵那麼輕鬆,不會像把一個巨石搬開那麼沉重,因為這個心已經慢慢地熟練了。 [06′35″]</p>
<p>   不要因為現在不得力就認為未來也不會得力,不要認為過去和現在我都沒有得力,就推斷說未來也不會得力,就看我們怎麼做。因為這個教法能夠對我們的痛苦有悲憫,能夠轉化內心、救拔我們的苦,這是它的作用,法的力量就是這樣。那麼法的力量為什麼沒有在我們的相續中顯現它強而有力的力量?就是修力不足,不是佛法不靈。這個概念的承許要有邊界,不是它不靈,而是一把寶劍你給一個小孩他舉不起來,它根本沒有什麼作用;可是你把寶劍給了一個勇士,他就能做太多了——要斷煩惱的勇士砍斷煩惱貪瞋痴,要一個有力的手拿起這個寶劍。那麼這個有力的手,就要天天練、天天練。在對境的時候不要讓心念空過,天天練我們的抉擇慧去抉擇、斷除煩惱,因為煩惱就痛苦的因啊! [07′35″]</p>
<p>   然後不要有事沒事就習慣攪煩惱,一個煩惱攪得非常非常長,像藤蔓一樣沒完沒了的,要知道這對自己並沒有任何好處。還有遇到煩惱,無休止地去跟別人理論,讓別人認錯、讓別人道歉。當然別人道歉我們會覺得心裡會舒服一點,但是也並不能解決真正痛苦的根本,痛苦的根本還必須要修學佛法來把它去掉。別人幾句道歉、幾句服軟,不可能解決我們生命中最深重的痛苦,因為那個太深了,要用那麼深邃的理路去把那個根挖掉才會快樂。大家覺得呢? [08′21″]
<p>   好!那我們來聽下一段。今天想要聽一下師父在新版《廣論》裡講的「欲令暇身」的這一小段。<p>   那現在的欲是什麼呢?「欲令暇身」,我們得到這個難得的有暇之身,這暇身是專門 指如法修行必須的條件。所以我們現在坐在這裡,人家很多在家人,儘管他有很優越的條 件,他羨慕我們,因為他無暇,他沒有時間、沒有機會來修行。這是非常值得珍貴的!那白白地浪費,不讓它白白地浪費,這些「具諸善者」,這些真正具足善根的人。不具足善根的人不一樣,不具足善根的人看我們:哪,你們這些人!坐在這地方,我不會跑出去玩一下的?我不會去做這件事情的!我們絕對不會願意坐在那裡聽、寫、讀、背,所以這個需要的很多條件。那麼專心、努力地「專勵」來聽聞這個教法。 [01′16″]</p>
<p>   師父又一次提到了:「<p> 欲令暇身<p> 」。說:「<p> 我們得到這個難得的有暇之身,這暇身是專門指如法修行必須的條件。<p> 」注意!為什麼要如法修行呢?為了究竟地離苦得樂。那麼就觀察一下我們現在,說:「<p> 我們現在坐在這裡<p> 」,師父就針對僧團在講,很多在家人有很多優越的條件,但是他羨慕我們,因為他沒有時間、沒有機會。譬如說學十五年、二十年的五大論,詳細地聽聞每一部論的解釋,把該背的都背了——五大論的根本頌等等還有很多要背;還有需要辯論的,都拿時間來辯論,生命的主軸和所有的時間都是用來聞思修的。師父說:「<p> 這是非常值得珍貴的!<p> 」讚美這些具足善根的人,不讓它白白地浪費掉這個暇滿。 [02′40″]</p>
<p>   我們在寺院裡面,每天聽聞佛法、早晚課、背書、辯論......。時光荏苒,歲月流逝,我們每一次對佛法的聽聞,在我們心續上產生的信仰的力量;每一次思惟,拿所聞的道理來對治煩惱、結合心續,內心中收穫的那一分感動;那一分覺得值遇了大寶的教法,在這樣一個大寶的僧團中修行的感恩和珍惜,這一切是多麼地來之不易啊!在整個從過去到現在的輪迴中,我到底有幾次能夠得到這樣的機會,穿上袈裟、值遇宗大師教法,又對宗大師教法具有信心,可以經年累月地聽聞、思惟、修行?這樣的時光對我們來說,從過去到現在我們重複幾次了?這時光並非隨處可得。從早晨起來我們就會到大殿,有那麼多尊佛像在殿堂裡;有那麼多經典就在自己的書櫃裡,觸手可及、抬眼可見;又有這麼多的同行善友,修學一樣的教法,持守一樣的律儀。仔細想想,這要累積多少資糧,聚合多少因緣,才能出現這令人羨慕的機遇啊? [04′24″]</p>
<p>   我們寺院的法師們、小沙彌都在努力地背書,正在聞思的路上拚命地戰勝自己。進入僧團之後,要大量地背誦教典。當一個僧人在學習過程中,感覺到辛苦的時候,要不只一次地超越自己。在修行的路上,要麼是從來沒有開始、要麼是半途而廢,而已經踏上這條路的人也必須矢志不移,才能保持初心堅守到底,經年累月地堅持背誦,把這些經典上佛陀的教言裝入自己的心續。許多出家人,在這個過程中修鍊出聞思的毅力。每當到寺院大考的時候,我們總會聽到又有出家人將哪部經典、哪部論著完整地背誦下來了,甚至能一次性地背誦數十萬字。除了背書課堂之外,從寮房到大殿、走在路上背誦、睡前端坐在床上,乃至聽到打板聲睜開眼睛的時候,都有法師趁著這個時間在串背著經文。 [05′39″]</p>
<p>   學習辯論也是,當全心全意地投入其中的時候,有的法師站著也是思考、坐著也是思考,吃飯的時候也會思考,睡夢中也在思考。到全寺院一年一度的大考的時候,每個人也都傾心地準備了題目,同時也非常緊張地準備面對別人的考題。在大考的會上,任何想像不到的事情都會發生,因為你永遠料不到別人會出什麼題,也無法想到自己精心準備的題目別人怎麼回答你呢?一到大考的時候,僧眾們的氣氛真是又緊張、又歡樂,每一次大考,都有最精彩的題目出現,同時也是大家最能相互學習、相互激勵的時候。 [06′32″]</p>
<p>   想一想,這樣的背誦是修行嗎?聽聞佛法是修行嗎?辯論是修行嗎?乃至從寮房走到大殿,每一步路是去朝聖嗎?我們都想千辛萬苦地到聖地去朝聖,那麼佛陀就坐在大殿裡,經典就在經櫃裡面,甚至在我們的書桌上。離苦得樂之道在經典裡寫得清清楚楚,而且有善知識不厭其煩地為我們講一行、一個字、每一部論怎麼解釋、諸家的解釋,還有匯總的解釋是什麼。這個傳承從未間斷,而且是如此清晰,就在我們這個僧團!如果稍加思考這一切所有的聚合,便會感受到教典中所說的暇身難得不可思議啊! [07′30″]</p>
<p>   所以師父接下來又說:有的人看我們——啊,這些人就坐在這個地方!他是不會來做這些事情的,因為他想要到處跑呀!坐不住啊!沒法收攝,不可能收攝在教典上,無法專注於聽、說、讀誦經典、背誦經典、辯論這些事情;也無法對於聽聞、讀寫教典、辯論教典產生殊勝的勝解,認為這就是淬鍊我們內心離開痛苦、得到快樂的唯一方式,也是最佳方式。不會成這種見解,總認為有一些其他的方式可以達到快樂、可以離開痛苦的。一直讓自己的心思留戀、拖延在那些其他方法上,甚至滯留在那些上面,以為那就是離苦得樂之道,因為他的見解是沒有轉過來的。 [08′30″]</p>
<p>   說到轉變見解,就要談到理路。比如說學辯論的第一課——顏色,討論那些辯論題,我們會覺得:討論白法螺是不是白色,對我心續的煩惱有沒有作用呢?眾所周知,白法螺的顏色是白色的,但是賽倉大師說,第一課就是要用這種人人都知曉的事例來建立正理的理路。為什麼要建立正理的理路呢?因為正理的理路,才能破除痛苦的根本。佛陀認為無明是一切痛苦的根本,破除無明最重要的利器就是空性見。可是對於凡夫而言,空性不能用現量證得,一定要用理路,生起比量才能了解,所以建立理路對一個修行者來說至關重要! [09′34″]</p>
<p>   雖然《攝類學》是學習五大論的初級課程,也是五大論必不可少的基礎課程,但它會顛覆我們平常的感覺,還有原有的思路習慣。一切石破天驚的思路,會讓自己和他人從驚嚇到驚豔,讓我們恍然覺悟到平常的生命狀態糊里糊塗、渾渾噩噩。在理路的鏡子中,我們會努力地去辨認真理的模樣,無數次地去辨認、去探尋諸法的實相、心的本來面目!日復一日,精進地學習佛菩薩、祖師的理路,想像他們一樣超越煩惱的大河,到達寂靜、悲智紛呈的彼岸。這樣的奮鬥,是多麼地令人歡喜呀!所以想一想師父對我們具足暇身的讚歎,我們要生起極大的歡喜心! [10′45″]
<p>   現在我們要聽下一段。在聽聞之前,大家還是要策勵一下自己的動機,這件事要常常提醒自己,不要沒有特別策勵發心就聽。養成習慣,當我們開始要聽聞佛法的時候,一定要一個大乘的發心——為利益無窮無盡的如母有情,我必須去證得正等覺的佛果,因為只有那樣我才會有能力去饒益一切如母有情。 [00′36″]</p>
<p>   當這樣造作的大乘發心發下去之後,成為一個強烈的牽引力,也是一個習氣,有一天我們就會對這個目標產生真實的渴仰,會覺得那是我一定要得到、一定要那樣做的一件事,變成自己的生命計畫本身,非常地親切、務實。就好像我們每天做的行程規劃一樣,幾點到幾點做什麼、幾點到幾點做什麼;我的生命一定要走大乘、一定要去證得佛果,用這樣的修心的方式,去得到正遍知這樣的一個果位,來幫助對我有恩的所有如母有情。 [01′23″]</p>
<p>   好!那我們就接著聽舊版的師父講的《廣論》。<p>   聽聞這東西的話,還要一個條件,要怎麼辦?「專、勵」,要專心、要努力。平常的時候我們聽哪,浮浮泛泛的話,這個聽沒有用,種一個善根。就種善根來說,有用的,用在什麼時候呢?等到無量阿僧祇劫以後,轉了一個大圈子,最後還是要等到這個種子起現行的時候成就。所以真正地聽到了,馬上緊跟著一步上去的話,這個浮浮泛泛不行,要專心!專心聽完了以後,還要什麼?努力!一定要這兩個條件。 [02′15″]</p>
<p>   這一小段很短,師父強調了聽聞要有一個條件,就是那兩個字叫「<p> 專、勵<p> 」,說:「具善者專勵聽」,「<p> 要專心、要努力。<p> 」師父說平常我們的聽聞狀態浮浮泛泛,請問浮浮泛泛是一種什麼狀態呢?要自己想一下。應該是沒有全神貫注吧!沒有用自己全部的心去傾聽,也沒有投入情感、投入全部的力量。浮浮泛泛的,應該印象不深刻吧?師父說:「<p> 這個聽沒有用,種一個善根。<p> 」沒有用是就某個角度說的,種善根是有用的,種善根什麼時候有用呢?就是等到特別特別漫長的時間之後,譬如無量阿僧祇劫以後,不知道多久多久的時間,轉了一個大圈子,最後種這個善根的種子起現行的時候就成就了。這是浮浮泛泛聽的一個狀況——他從種下善根的種子到有一天發芽、開花、結果,中間經歷的時間實在是太過漫長!那麼在下一段,師父會分析這漫長的時間我們都在哪裡、都在做什麼,能不能承受?所以這麼漫長的時間才有收穫,就是浮浮泛泛地聽聞感得的結果嗎?大家要思考一下。 [04′04″]</p>
<p>   為什麼不能浮浮泛泛地聽呢?浮浮泛泛就那麼長、那麼長的時間才有收穫嗎?那麼不是浮浮泛泛的狀態是什麼樣呢?師父說:「<p> 真正地聽到了,馬上緊跟著一步上去的話,這個浮浮泛泛不行,要專心!<p> 」專心聽完了之後,還要努力!一定要這兩個條件。說真正聽到了之後,我們的心力就要跟上去,就是馬上要向內調伏。我們的內心會有一種渴望,渴望我的心成為我所聽聞的法,變成那個樣子。所以當自己用全神貫注的注意力在聽聞的時候,有的時候感覺不到時光的流逝,你感覺不到有什麼東西打擾自己,彷彿只有師父的法音,好像自己都不存在了!其實那樣的時光是很澄澈的,有深度的寧靜和投入,我們心裡的諸多牽掛也都放下了。 [05′15″]</p>
<p>   在全神貫注的時候,其實是會有一種愉悅。這種愉悅感只要專心致志聽法就能得到,是非常容易得到的,如果我們真正地按照師父的要求去做的話——永不停息地訓練自己要專心聞法,在聽法的時候要斷除不在意的、散亂的,覺得好像沒有什麼特別珍貴的那些需要被對治的心態;每一次聽聞的時候,要產生極其稀有的、難可值遇的,就像於正法聽聞作五想:光明想、無罪想,還有眼目想......,所以內心裡會產生一個非常非常大的珍惜的感覺;每一秒鐘都不想讓它空過,都不想讓法音空過,都不想讓自己的注意力流散在其他地方,想全部地注意傾聽師父在講什麼、《廣論》在講什麼? [06′20″]</p>
<p>   記得《略論釋》總是有一個譬喻,說全神貫注地聽法的狀態是什麼呢?「猶如野獸乍聞聲」,走在曠野裡的一個小動物,突然聽到一個霹靂,牠整個都全神貫注在聽,什麼其他的注意都沒有,只有聽到那個聲音。所以「專勵」,專心勵力這樣的一個聽聞狀態,就是我們要達到的一個狀態。那麼現在對比那樣的狀態,可能很多時候我們是有參差的,甚至有很大的參差、很大的一個距離。怎麼辦呢?就是不要讓這種不專心的狀態一天比一天嚴重,要去對治! [07′07″]
<p>   為什麼聽法的時候會不專心呢?大家想一想。說:我有事情啊、我身體不舒服啊......,有諸多的理由,但是總歸起來大概就是前行沒做好。那麼前行就要思惟聞法勝利呀!思惟的時候,對一個聽聞者想要得到聽聞勝利的那個要求,比如斷器三過、具六種想,這些雖然我們都聽聞過《廣論》了,但是是否特別特別重視聽聞前行?因為如果在正聽的時候我們無法全神貫注,就會無量阿僧祇劫之後轉了一個大圈才收穫聽聞的結果,那豈不是太冤枉嗎?如果我們用幾分鐘的時間做一做聽聞前行,而使所有的聽聞具有非凡的意義、對我們的生命產生那麼強而有力的饒益的話,我認為這筆時間的投資還是非常划算的! [01′00″]</p>
<p>   所以在每一次、每一次聽佛法之前,做一個心理準備是很必要的!因為做很多事情之前都需要準備,沒有準備、倉促上陣,除非是你已經非常熟練。但是越是熟練的人,有的時候他越會注意準備。因為那個熟練是怎麼來的?就是非常注意聽法前行的準備來的,所以他熟練之後會有這個習慣,就是特別重視聽法之前策勵自己的發心,把自己的狀態——主要是狀態——調整到一個非常虔誠、專注、對法很珍惜的這樣一個狀態。 [01′37″]</p>
<p>   一旦我們浮浮泛泛地聽——跟聽其他事情沒什麼差別,那麼佛法珍貴的意義,我們離苦得樂的唯一的依靠,如眼目、如明燈一樣,這樣的作用,在當下的時候我們的心就會忽略、就會輕視,輕視到眼前的這個聞法的機會;我們不會那樣稀有地珍惜自己善根,珍惜值遇到教法的這個因緣、這種時機啊!不會珍惜!可是稍作策勵的話,我們就會想到暇滿很珍貴,因為難得、易失,無常這麼迅速,剎那不停地向老死奔去。在這個過程中,我居然能夠值遇到如此絢麗的教法,如此清淨的離苦得樂之道,那麼我解決生死痛苦的辦法,下手處就是聽聞,而聽聞要求的條件就是全神貫注。 [02′39″]</p>
<p>   我會全神貫注嗎?從小學、幼兒園的時候,上學就訓練這個——全神貫注。那麼我們平常滑手機的時候全神貫注嗎?通常滑手機走路都撞東西,別人叫你也聽不到,那就是全神貫注。為什麼?我們全被這個目標吸引,被那個全部吸引了!那麼我們的心為什麼不能被清淨的離苦得樂之道吸引呢?因為那就是我全部的身心想要的一切呀!想解脫老死,想能夠自利,也想能夠利人,能夠幫助所有我關注的生命不要受苦。就是我從心髓裡要做的一件事情,那為什麼不能全神貫注呢?難道我忘記了嗎?還是永遠都有其他的事情比聞法更重要?我把我最重要的全神貫注都投注給其他的,而在最該全神貫注的時候卻任精神流散,而且還沒有對治! [03′42″]</p>
<p>   當不如法的聽聞狀態出現的時候,最重要的是要覺察——發現走神了,或者發現自己在昏沉,或者發現自己提不起心力來。注意,前行沒做好!千萬不要忽略前行,就像助跑一樣,像那種跳高、跳遠的運動員都要助跑,沒有助跑的話肯定是跳不高、也跳不遠。所以這個聽聞前行的訓練,是整節的聽聞到底會產生什麼樣的作用非常關鍵的一步!它又像火箭的發射器一樣,非常非常重要! [04′20″]</p>
<p>   希望大家能夠不要忽略聽聞前行,把《廣論》的書打開看一看「斷器三過、具六想」,還有「以五想聽聞正法」。這些要非常非常地熟練,比如說聽聞佛法為什麼是眼目?我們看到那兒可以想一想:是看什麼的眼目?如果一個人看不到路,那該有多痛苦!可是聽聞佛法像眼睛一樣,讓我們能夠抉擇哪裡是苦、哪裡是樂。這樣想一想,它就跟我的內心發生非常直接的關聯。 [05′02″]</p>
<p>   每天生活追著事項跑,我們的心不停地被遇到的事情綁住,一次一次地綁住,綁住的時候就會發生執著、發生痛苦、發生顛倒的認知。當顛倒的認知出現的時候,我們用什麼力量讓我的顛倒再恢復正常,變成是希求三主要道呢?所以每天的聽聞就變得非常必要!因為它會醒覺我們的注意力,讓我們知道在這所有所有的奔忙中,有一件非常非常重要的事情,就是聽聞何種是離苦得樂之道,而且讓我的心沿著那樣的離苦得樂之道去修正我所有的思想和行為。這件事就攸關乎我自己的苦樂,乃至他有情的苦樂,是非常重要的一件事情!大家覺得呢? [05′54″]
<p>   在聽下一段之前,大家想一想,上一段講了:要是浮浮泛泛地聽聞的話,那麼就種一個善根。這善根什麼時候熟啊?就要等到無量阿僧祇劫以後,轉了一個大圈,到最後這個種子起現行的時候成就。下一段師父就再講了一下這個事情,說:浮浮泛泛地聽,到最後還是會成熟啊,只不過是慢了一些吧?聽聽師父對這種想法的看法。 [00′40″]</p>
<p>   那麼這個地方也說一下。說:那麼最後還是成熟嘛,那我就慢慢地好了。記住!始終記住這個話,慢慢地不是說你等它慢慢地種了個種子,到那時候它自己天上掉下來,一口氣讓你成佛了。沒有這件事情!到那時候還是啊仍舊經過如此這般修行,然後成就。而在你沒有經過這個修行成就之間轉個大圈子,在哪裡?都在三惡道當中。記住哦!既然到最後你還是要這樣地修行了再成就,請問你為什麼要讓它受盡了千辛萬苦才成就?所以呀我們瞭解了這個,自然而然必定會專心、努力。反過來說,你之所以能夠這樣做的話,這個是善根哪!<p>   所以這個地方告訴我們,你要聽到這個真不容易呀!你們現在有幸聽見了,這是真正具足善根的人,你現在因為宿生積了這麼多善根,現在眼看著可以上去了,千萬要努力啊!現在怎麼樣努力法?專心、努力!這是他最後又特別地諄諄叮囑,告訴我們。 [02′08″]</p>
<p>   好!師父在這一段裡回答了我們那種想法:最後還是成熟,慢慢地會怎樣呢?師父先說了兩個字:「<p> 記住!始終記住這個話,<p> 」師父要我們記住什麼呢?而且要始終記住這個話,記住什麼呢?說:「<p> 慢慢地不是說你等它慢慢地種了個種子,到那時候它自己天上掉下來,一口氣讓你成佛了。沒有這件事情!到那個時候還是啊仍舊經過如此這般修行,然後成就。<p> 」所以慢慢地那個種子發芽的時候,還是要經歷所有的努力過程。 [03′02″]</p>
<p>   「<p> 而在你沒有經歷這個修行成就之間轉個大圈子,在哪裡?都在三惡道當中。<p> 」師父講完這個之後,又說了一遍:「<p> 記住哦!<p> 」又說了一遍。注意!前一個記住,說:「記住這個話」,什麼話?種子慢慢地成熟的時候,不需要經歷那個過程嗎?不是的,當開始成熟還要經歷那個修行的過程,所以還是要修行,不可能不修行。比如「聽聞軌理」,你不修行的話有沒有可能跨過去呢?是跨越不了的。如果能跨越就不叫次第了,對不對?所以要慢慢地成熟還是要經歷如此這般的修行,然後成就,絕對不會從天上自己掉下來——師父說要記住這個! [03′55″]</p>
<p>   轉了一個大圈子,那麼長的時間在哪裡?都在三惡道中。又說一句:「<p> 記住哦!<p> 」既然到最後還是要修行再成就,為什麼要讓它受盡千辛萬苦才成就?「讓它受盡千辛萬苦」,這個換成自我,為什麼我要讓我自己受盡千辛萬苦、墮惡道等等,經歷那麼多難以忍受的痛苦?我們現在只是說說惡道,惡道的有情過一天、過一秒鐘可能都很痛苦喔!我們現在是推斷挺痛苦的,但是實際去想一下,真的是很難堪忍的喔!因為心續是不會斷滅的,很難堪忍也不會終極斷滅,所以那一切苦都是要硬忍受過來的。那麼為什麼要給自己的未來鑄造一個那麼大的苦,然後再去承受,又無處可逃,沒辦法逃了,一入惡道就沒法修行?那為什麼要變成那樣子呢?這是一個天大的委屈、冤枉的事情呀!所以師父連著說:「要記住啊!要記住啊!」 [05′17″]</p>
<p>   說:為什麼受盡千辛萬苦才去成就?因為不了解。所以我們了解了這個之後,自然必定會專心、努力。那我們可以捫心自問一下:對每一次的浮浮泛泛、不專心聽聞的狀態,我們有沒有認真地考慮如此這般聽聞的後果?當然還是會種善根,比不聽聞好,但是既然聽聞了,為什麼不要最好的、不給自己最輝煌的未來?為什麼要有一個那麼暗淡的、可怕的、令人怖畏的未來? [06′02″]</p>
<p>   聽聞一定是鑄造幸福的,對吧?因為聞思修就可以改變整個輪迴、整個生命現狀的苦狀,我們不需要去打別人、不需要去罵別人、不需要去搶什麼,就是聽聞、受持佛陀的語教,痛苦就可以消滅了。那麼這麼重要的一件事,為什麼用浮浮泛泛的態度去完成呢?時間花下了、精力花下了,目的也是為了聽聞佛法,那為什麼要有浮浮泛泛的狀態呢?這不是很奇怪嗎?這件事對我們那麼重要,為什麼不認真呢?是忘記了嗎? [06′44″]</p>
<p>   所以師父在這裡邊連講了幾個:「記住啊!始終記住啊!記住啊!」連講這個,就是一再地告訴我們,那樣浮浮泛泛地聽聞,它所感得的結果是我們不願意面對、無法面對的,到最後還得要做聽聞前行,把聽聞軌理好好地做好,是不可能跨越這個次第的! [07′11″]
<p>   如果發現等到慢慢地成熟,我們根本也占不到便宜,而且會吃更大的苦頭。比如說有兩條路,一條路是慢慢走的,不要著急;一條路就是要精進,不可以懈怠、不可以遲緩。那說:啊!一邊走著、一邊坐著、一邊喝茶,然後看風景,有的人就願意走這樣的路。但是如果跟你說這個慢慢走的路裡邊有很多猛獸、強盜,還有可能會掉進深淵,那是一條慢路嗎?No!那是一條危險的路,非常非常危險的路!所以慢慢成熟和危險好像劃等號了,有注意到嗎?慢慢成熟,我們的生命就要經歷更深刻的痛苦,更難以面對的那些情景和感受,難以堪忍的痛苦就等在未來。浮浮泛泛地聽聞,就遮除不了惡道的痛苦,因為在一開始我們就沒有認真了,我們怎麼能夠在滅苦的因上全力以赴呢? [01′08″]</p>
<p>   有沒有注意到師父把我們聽聞佛法的一個狀態,跟離苦得樂直接連結起來?為什麼要去聽聞佛法?就是為了離苦得樂呀!如果對離苦得樂這件事本身一點都不在意,怎麼能離苦?怎麼能得樂呢?這個推理是非常通透的呀!大家覺得是不是這樣?平常就覺得我浮浮泛泛地聽聞也不會被罰款呀,也不會被老師叫起來罰站,因為不是小學生啦!小學上學的時候不好好學習,家長開會回來可能還要被罰站,可能應得的一些利益都得不到了,好像有懲罰。那現在浮浮泛泛地聽聞,沒人管、沒人懲罰自己,好像也沒有一個什麼管束自己的。但是修行最重要的就是自律呀!為什麼我們要自律,因為要主動地去離開痛苦、得到快樂。如果自己是一個浮浮泛泛的狀態,不要任由它發展下去,記住——我也說了記住——要起對治啊!要起對治,把這種浮浮泛泛的狀態對治下去!因為照理這樣推下去,浮浮泛泛地聽聞、不認真地聽聞,我們豈能認真地消滅痛苦?豈能認真地得到快樂呢? [02′32″]</p>
<p>   我們好像對自己未來的幸福一點都不關心啊!對自己未來要受的那些危險,沒有一種猛烈地想把它遮除、把它滅掉、不要發生那樣的決斷。好像就任由自己的心這樣向前,像河一樣流去,不管它流在哪裡,反正此處、此時我沒感覺到極端的痛苦就行!這是一種沒有對因果進行觀察,沒有觀察自己生命的現行——其實盡頭還是有個老死的,老死之後到底會在三惡趣還是再得到暇滿人身修行?這個問題完全是我們這一生要決斷的、要做主的! [03′14″]</p>
<p>   所以師父在聽聞狀態這件事,由「專、勵」兩個字,講到了我們必須對我們的後世要負有完全的責任感,要去考慮我要什麼樣的未來我就要有什麼樣的聽聞狀態。有沒有發現這個劃等號是劃得這麼直線的?意思就是:不要認為這樣浮浮泛泛的聽聞狀態不會感得一個結果,是會有那樣一個結果的!那樣的結果是什麼呢?不是要恐嚇我們,而是所有的智者如是說。所以我們要說服我們的心,沿著佛菩薩所說的那樣的安穩道去修鍊自己。不要漫不經心,不要不以為然、以為沒有惡趣、此生的生命沒有盡頭!這些常執是需要被點醒的,需要覺察、對治! [04′16″]</p>
<p>   在講了上一段之後,師父又接著說,如果能夠努力、能夠專心的話,這就是我們的善根啊!所以師父說:「<p> 這個地方告訴我們,你要聽到這個真不容易呀!<p> 」又說一個不容易,前面也有很多不容易呀!然後說:「<p> 現在有幸聽見了<p> 」,現在我們能聽到師父的法音在宣說《廣論》,是多麼大的一個幸運啊!「<p> 這是真正具足善根的人。<p> 」 [04′49″]</p>
<p>   「<p> 現在因為宿生積了這麼多善根,現在眼看著可以上去了<p> 」,注意喔!師父用了「眼看著」,眼看著是什麼速度啊?比如說:「欸!看著、看著、看著,這個人走到眼前了!」「看著、看著、看著,這人爬上山頂了!」它的速度是很快的。因為我們這輩子遇到了教法,而且我們對教法有這樣的一個信心,眼看著可以上去了!接著說:「<p> 千萬要努力呀!<p> 」每次看到這幾個字內心都很感動,好像又看到師父在眼前殷切的那種眼神,還有那種語氣——怕我們受苦啊!現在眼看著可以上去了,為什麼眼看著上去了?因為有幸聽見了,是真正具足善根的人啊!真正具足善根的人!說:「<p> 現在因為宿生積了這麼多善根,現在眼看著可以上去了,千萬要努力呀!<p> 」怎麼努力?「<p> 專心、努力!<p> 」師父這樣說的,宗大師也是這樣說的,佛陀呢?「諦聽、諦聽,善思念之!」都是這樣說的。千古的叮嚀啊!從未改變、從未改變的叮嚀! [06′22″]</p>
<p>   我們的耳畔到底是多少次又響徹這樣的叮嚀?又可以聽到善知識、佛菩薩這樣叮嚀我們了?猶如慈母的叮嚀一般,能否把這種叮嚀放在心上?能否珍惜這種叮嚀?覺得真的是怕我們受苦,全心全意地想著我們、把我們放在心上的人——善知識,具有菩提心的善知識,一剎那的苦都不願意我們受,想要把我們所有的痛苦都拿去他受,那樣的佛菩薩,對我們這樣的叮嚀!所以「諸具善者專勵聽」,師父傳遞了佛菩薩的痛切之心、難忍我們受苦的心。諄諄地叮嚀,你我千萬要放在心上啊! [07′22″]
<p>   又到了我們研討《廣論》的時間了。請大家觀察一下自己的相續,調整好自己為了成就無上菩提而研討《廣論》的動機——是為了利益無窮無盡的有情,我必須去證得佛果;為了這樣一個目標,現在要學習聽聞和研討《菩提道次第廣論》。 [00′31″]</p>
<p>   前兩天收到一個沙彌的信,他在信裡問我說:「師父說聽聞的時候不能浮浮泛泛,聽聞的時候浮浮泛泛就一定會長劫流轉惡趣嗎?在內心裡怎麼能夠產生這樣的決斷的認知呢?怎麼斷除疑惑呢?」我會覺得他就這個問題有非常認真地思考,所以首先他不是浮浮泛泛地聽聞。那麼浮浮泛泛地聽聞,到底為什麼師父會推演出那樣的結果呢?還記得在《廣論》上《事教》中記載:阿難的兩個外甥出家後,親教師教他們讀誦,大概就是背誦經典,結果他們讀了短短的幾天就不肯再讀了。為什麼呢?可能沒興趣啊,或者找理由、懈怠。後來就把他託付給神通第一的目犍連尊者吧!然後阿難的這兩個外甥去跟目犍連尊者學習的時候,居然也還是這樣不肯再讀,依然故我。 [01′53″]</p>
<p>   這個時候阿難就得為他們想辦法,應當讓他們倆心生厭離,一定是被現世的一些快樂綁住了吧?所以就請目犍連尊者帶領他們到白天活動的地方——不知道是不是在那兒玩的地方——然後變化出有情地獄,讓這兩個小沙彌聽到了切割、鋸砍可怕的聲音。他們倆聽到了之後就趕快去看,看到了砍、殺等痛苦。而且看到了這種慘狀之後,還看到了有兩個沸騰的大鐵鍋,於是就問道:「那鐵鍋好像是空的,沒有任何人被扔進這裡面嗎?」就有聲音答道:「阿難有兩個外甥,出家後懶散度日,死後就會投生這裡。」 [03′00″]</p>
<p>   可以想像這兩個沙彌聽到會嚇成什麼樣!所以他倆是極度地驚慌,心裡想:如果被那個聲音知道,現在可能就扔進去了。他們就趕快回到目犍連尊者這裡,把發生的事情跟老師講一遍。尊者就告訴他們說:「兩位沙彌!這些禍害以及其他的災殃都是從懈怠產生的,所以要精進!」他倆因此就發起了精進。精進到什麼程度呢?說如果用餐前想起地獄,就有點沒法吃;如果用餐後想起來就會嘔吐。 [03′45″]</p>
<p>   現在他們開始發起精進來用功了。用功一段時間,又帶他們到一個白天活動的地方,在某個方位就變化出眾多的天人。這兩個沙彌聽到了琵琶等等的音樂聲,想:什麼這麼熱鬧,這麼好看呀?就前去觀看。結果看到了無量宮裡邊充滿了天女,卻沒有天子,就問說:「為什麼沒有天子呢?」就有聲音答道:「阿難的兩個外甥出家後發起精進,因此他們死後會投生在這裡。」兩個沙彌聽起來高興極了,就歡天喜地地跑回來告訴他們的老師目犍連尊者。然後尊者又諄諄教誨他們說:「兩位沙彌!這些利益還有其他利益都是從發起精進產生的,所以要精進!」因而他們也就奮發精進。 [04′41″]</p>
<p>   當他們受學經教時,也看到了《真實相應經》中提到會從善趣投生惡趣。阿難尊者的這兩個外甥就請問目犍連尊者說:「聖者,我們從人天當中死後,也必須投生三惡趣嗎?」請聽尊者的回答!尊者回答說:「二位賢首,只要眾多煩惱的續流還沒有截斷,就必須像水車運轉的道理一般在五道中流轉!」說完之後他倆就心生厭離,然後稟告尊者說:「從此再也不作煩惱行,懇請宣說這樣的正法。」這個時候目犍連尊者為他們說法,他們最終證得了阿羅漢果。 [05′27″]</p>
<p>   回到最開始的問題:浮浮泛泛地聽聞,到底能不能對治我們心中眾多煩惱的續流呢?能不能截斷呢?如果不能截斷的話,像水車運轉的道理一般在五道中輪轉的話,那麼「得人身者如爪上塵」,得暇滿人身就像盲龜遇浮木那樣的可能性,大多數都墮落了。所以當我們遇到正法的時候,浮浮泛泛地聽,絕對是一個懈怠吧?對吧?絕對不是發起精進的狀況!那麼不是發起精進的狀況,怎麼可能截斷墮落惡趣的這些苦因呢?截不斷的話,惡趣的苦因就會生苦果吧? [06′10″]</p>
<p>   所以應該制止懈怠,發起修道的精進,鞭策內心希求解脫並且獲得解脫的根本因素。那麼能夠制止懈怠,發起修道的精進,鞭策內心希求解脫、獲得解脫的根本因素,到底是什麼呢?推崇稱讚的就是要修習「苦」。像剛才那個墮落地獄的苦,還有即使受生為天人,如果那個續流沒斷還是會再墮落。所以一定要用一種厭離輪迴的一個心希求解脫,才把輪迴裡的苦因能夠徹底地斬斷。 [06′53″]</p>
<p>   導師世尊的遺訓就是經典,所以必須閱讀;閱讀經典又必須要善知識。博朵瓦大師就曾說過:「還沒有遇到其他的善知識之前,自己雖然閱讀些許,往往是睜著眼睛卻看不見。」但是樸窮瓦大師置身在典籍當中,說:「現在必須分辨出上、中、下根機,產生符合程度的長進,這些都能對治由於無知而產生的墮罪。應該把這些典籍放在離自己最近的地方,不離開視線的範圍這樣去閱讀。」其實這都是大善知識的教誨。 [07′35″]</p>
<p>   像師父就教誨我們說:「在聽聞的時候千萬不要浮浮泛泛,要全神貫注!」其實這都是一向連貫的傳承,讓我們能夠在聽聞的時候就斷除懈怠。斷除懈怠也就斷除了我們會墮落惡趣、生不起精進所能生起的那些證德,應該斷除這些。所以我會認為師父這樣的說法是有依據的。 [08′07″]</p>
<p>   大家認為怎樣呢?最重要的事情就是:我們對於正在發生的事情是苦因、會結苦果的這個事實往往連接不起來,認為我就只是漫不經心地不太專注,難道由於這個狀態就會墮落惡趣嗎?在因果裡邊通常都是一個小小的因,可能對法呀、對於佛菩薩、對於善知識、對於出家人等等,還有對父母親,對於這些具力業門、殊勝福田,一個很小、很小的惡念會產生一個很大、很大的苦果。這些事情如果佛陀不在經典裡給我們講,我們是連聽都不會聽過;就是佛陀在經典裡給我們講,如果沒有善知識諄諄這樣地叮嚀,我們聽了也就都忘記了。 [09′04″]</p>
<p>   所以能感得善知識常常地在耳邊叮嚀我們注意這個、注意那個,如果能夠體會到善知識呵護我們,希望我們能夠離苦,把相續中的苦因都去掉,不要出生苦果——到時候自己會苦不堪言啊,能夠體會到善知識的慈悲之心,產生在自己的行為上就是如教修行供養,自己不如法的聽聞狀態,要發起精進斷除掉,尤其要斷除懈怠。大家認為呢? [09′41″]
<p>   請把《四家合註入門》翻到 77 頁,看中間的藍字和黑字。<p>   <p> 第三、勸勵具器人應聽聞者:<p> 謂<p> 諸有偏執暗未覆,具辨善惡妙慧力,欲令暇身不唐捐,諸具善者專勵聽。<p>  [00′27″]</p>
<p>   現在我們講到妙音笑大師的第三個科判,從巴梭法王的科判來看它也是第三科,兩個註釋的內涵是一樣的——「勸勵具器人應聽聞」,就是規勸具足這種根器的人要好好地聽聞。那麼接下來有一偈說:「<p> 諸有偏執暗未覆,具辨善惡妙慧力,欲令暇身不唐捐,諸具善者專勵聽。<p> 」請問什麼是「偏執」呢?不了解圓滿教法的扼要,只執持片面的,把這一點比擬為「暗」。 [01′09″]</p>
<p>   如果為這個暗所覆蓋,比如沒有燈,黑暗籠罩了這個房子的話,其實除了黑什麼都看不到了,「偏執」就像黑暗覆蓋一樣。那麼如同這樣,去除黑暗後,就將此道的扼要完全地光顯,就是「暗未覆」。所以「<p> 諸有偏執暗未覆<p> 」,這裡邊解釋了「暗」是什麼,「未覆」又是什麼——去除了那個過失的。 [01′45″]</p>
<p>   那麼「<p> 具辨善惡妙慧力<p> 」,就要具備辨別什麼呀?正確與不正確的清晰慧力。大家有沒有注意到,善惡和正確、不正確連在一塊兒了,為什麼呢?那麼善的是正確的否?惡的是不正確的否?為什麼呢?因為善的會達到快樂,所有的眾生都希望離苦得樂,惡的會讓人痛苦,所以要具備能夠辨別什麼是苦樂的因、苦樂的果,對吧?辨別善惡妙慧力。欲令賢善的所依暇身具義而不唐捐的這些具善緣的人們,對於此論應該專一、勵力地聽聞!這個就是「<p> 勸勵具器人應聽聞<p> 」。後面仁波切講一句:「如果不是器,就不會這樣說。」很顯然是對於具器的人、能聽聞此論的人說的。 [02′59″]</p>
<p>   下面有一個問答,他的問題是說:「具善」就是指具器嗎?然後仁波切說:「是的。『具善』就是指具有修習此論的善緣。」注意!它後兩個字是「善緣」。什麼樣的善緣呢?就是具有修習此論的善緣,也就是此論的具器者、此論的所化機。什麼樣是此論的所化機呢?就是指遠離前面所講述的那個過失的人。什麼過失啊?偏執一方啊!他就會說:「大乘有問題」、「小乘又怎麼怎麼樣」這種偏執。 [03′35″]</p>
<p>   具足沒有被這類黑暗蒙蔽的功德,還要具足什麼呀?分辨善惡妙慧力;還有那個欲令暇身不唐捐的善緣者,擁有上述功德的人才能將法聽進耳朵裡。不是這樣的人,根本聽不進去。雖然不是不能聽,但是不具信心、不具器、有偏執、又不具備分辨善惡慧力的人,即使講給他們聽也聽不進去,無法利益到他們。因此,聽聞《廣論》應該具備這些功德,能具足這些就能有所饒益。為什麼?因為是具器者、具善者,對吧? [04′23″]</p>
<p>   像有的同學學《廣論》都三十年了,我們不是有那個徽章嗎?我給二十年、三十年的都發了那個徽章——還沒有去臺灣發,以後去臺灣發。這麼長時間持續地學習《廣論》,持續地聞、思、修。我們是不是大師在這裡邊指出的所謂具器者呢?能夠聽聞《廣論》的,能夠按照《廣論》聞、思、修的這樣的人呢?具備這些。那麼具備這些就會被《廣論》饒益到,因為是《廣論》的所化機。 [04′58″]</p>
<p>   所以想一想廣論班的那些所有的居士,還有青少年班有在學,園區也在學,大專班這些所有的同學們,能夠具足這樣的善根聽聞道次第,這是一個多麼大的福報!不然的話,是沒法聽的。這件事,沒有善知識這樣認真地告訴我們的話,我們也會覺得好像隨隨便便地就遇到了,有人介紹我就來聽了;一聽很歡喜,就離不開《廣論》了!有的人會相見恨晚,有的人會覺得找到了一生的皈依,簡直是太好了!但這一切,這裡邊說——具器人,遠離了某些過失、具足了這些功德的人,才能夠受用這樣的法,才能夠有善緣聽聞這樣的法。 [05′51″]</p>
<p>   那再想一想:如果善知識不是生生世世地引領我們,還有我們的父母親要不是把我們養大,讓我們擁有很多很多的能力,我們也沒法學習。想一想能夠成熟我具足能夠聽聞《廣論》的善根的所有善知識、父母親,還有我的恩人,也就一併地感恩他們。 [06′12″]</p>
<p>   所以能聽聞《廣論》、能具足聽聞《廣論》的條件、能具有這樣的善根,確實是來之不易的!大家要好好地珍惜、好好地聽聞!所以宗大師才在〈皈敬頌〉裡邊勸勵具器人能夠聽聞,說:「<p> 諸有偏執暗未覆,具辨善惡妙慧力,欲令暇身不唐捐,諸具善者專勵聽。<p> 」這是宗大師對我們的教誨,也是所有的傳承上師對我們的深恩!所以大家好好地珍惜學習《廣論》的機會,一起努力學下去! [06′54″]
<p>   大家好!又到了我們研討《廣論》的時間了。今天有看到師父 1988 年 5 月 7 號的一段日記,想給大家唸一下,我們一起學習一下。說 5 月 7 日有一位法師提示: [00′28″]</p>
<p>   彼云:「你依止力不夠。」一語提醒了自己的大毛病。所言依止力,必先深明四諦,知世間之苦、空、無常,四大、五蘊之虛誑顛倒,識罪福業因,由是一心仰皈三寶,直如死囚求救,庶幾不為妄情俗塵所牽,不為「如似而非」之妄見所惑。能不為惑、不被牽,方能肯心向道,由自淨以化他也。而欲求自淨,必依三寶、上師——三寶之化身,則一心皈投之情自切,由此修習,庶幾真實上道矣!勉之! [01′39″]</p>
<p>   這一小段是寫有一位法師應該是跟師父直接討論問題,說:「<p> 你依止力不夠。<p> 」可以考慮一下,如果有人說我們依止力不夠,我們是會直接反省自己呢?還是會去辯解?師父接著是說:「<p> 一語提醒了自己的大毛病。<p> 」在聽到提醒的時候,師父會立刻反省自己,而且是非常認真地反省。說:「<p> 所言依止力,必先深明四諦<p> 」,佛所說的苦、集、滅、道四諦,然後「<p> 知世間之苦、空、無常,四大、五蘊之虛誑顛倒<p> 」,這一切,如果我們會認為世間是樂的、是久住的,沒有了解它的本性是無自性的;沒有了解到無常——粗無常和細無常,粗無常就是死亡,細無常就是念念的流轉,念念都不會停息、剎那剎那都不會停息;「四大」——地、水、火、風,「五蘊」就是我們這個五蘊之身,它的虛誑顛倒,就是它一段時間就不歸我們了。 [03′24″]</p>
<p>   知道這一切是苦、空、無常,是有它的欺誑性。它的欺誑性是什麼?就是會顯現為樂的、久住的,如果不去觀察的話,我們會產生一個概念上的顛倒、認識上的顛倒。所以師父說:「<p> 識罪福業因<p> 」,就是能夠在當下的觀察中觀察出什麼是罪、什麼是福的因由。因為了解了這些之後,能夠去把苦因斷了、樂因修了,把輪迴的根本截斷。 [04′07″]</p>
<p>   那麼如何去切斷輪迴的根本?還有如何去斷除苦因?「<p> 由是一心仰皈三寶<p> 」,唯有佛陀深刻地講解了業果見和空性見,所以仰皈三寶。到什麼程度呢?「<p> 直如死囚求救<p> 」,記得在《廣論》上說,對三界一剎那的貪戀都不會生起來,就像一個死囚想要馬上出獄一樣,就是一剎那間都不想在這個牢獄裡邊。我們對三界的厭離心應該是修成這樣子!所以師父對自己的生命提出了如經典上那樣的要求,因為他的日記是不給別人看,就是寫給自己看,所以「<p> 直如死囚求救,庶幾不為妄情俗塵所牽,不為『如似而非』的妄見所惑<p> 」。[05′04″]</p>
<p>   接下來說:「<p> 能不為惑、不被牽,方能肯心向道<p> 」,就是死盡偷心了,覺得這個世間真的是苦的。那麼怎麼樣去把這個苦因斷掉?就是一定要修行。然後才能「<p> 自淨以化他也<p> 」,自己要淨化自己的煩惱,然後再幫忙他人淨化。那麼想要求自淨自己的煩惱,「<p> 必依三寶<p> 」,又說了這樣一句,說一定要依靠三寶,不然拿什麼來淨化我們的心續呢?那麼上師就是三寶的總聚體,是三寶的化身,所以一定要一心皈投。這樣的話,「<p> 情自切<p> 」,就是我們去求善知識教、皈依上師的這個信心自然是懇切。「<p> 由此修習<p> 」,如果能夠因為前面上述的原因這樣修習的話,才能夠真實地——師父在這裡邊沒寫「向道」而寫「<p> 上道<p> 」,可能是走上修道的這條路。然後後面兩個字是「<p> 勉之!<p> 」師父的日記裡常常出現「勉之」,就是自己要努力呀! [06′26″]</p>
<p>   寫完這一段之後,師父隔了一行又寫了一段,說:「<p> 眼下第一要務:懺罪積資!殷重祈求上師本尊三寶!研閱無垢經論正法。<p> 」所以「第一要務」,就是最緊要的事情要懺罪集資——懺悔罪障、集聚資糧。這和所有的祖師大德修行的方式和教導他人的方式是一樣的。說:「殷重祈求上師本尊三寶!研閱無垢經論正法。」就是要努力地學教典、學有清淨傳承的教典。 [07′05″]</p>
<p>   師父他自己是這樣要求自己的——自己走這樣的路,也在前面走著,希望我們走這樣的路。所以看一看希求善知識的那個心,是以出離心,還有想要化他的這個菩提心為牽引,以這樣皎潔的目標去希求善知識。因為想要離苦得樂,如果沒有離苦得樂的法,我們縱然有離苦得樂之心也是枉然。那麼離苦得樂的法,只有佛陀會清淨地宣說,所以會一心皈投三寶;而上師是三寶的總聚體,所以皈依上師的心自然就會來得懇切! [07′50″]</p>
<p>   在這樣動機的牽引下,還要注意淨罪集資,然後同時學習經論,都是在這樣的一個發心的攝持下學習經論。所以我們每次研討《廣論》的時候,希望大家能夠提醒自己,要知道這個輪迴世界仔細去觀察的話,是有諸多的苦痛。確切地再去思考「三界如火宅」,我們應該想要從這火宅裡趕快地出來。那麼趕快出來的方法,就必須去聽聞正法,要了解怎麼樣能從火宅裡出來。所以每一次聽法的時候,就不能以浮浮泛泛之心來聽,因為這攸關離苦得樂生死大事!所以要發一個殷重的心,研閱無垢的經論。 [08′48″]
<p>   接下來我們就要來聽師父講的廣論。 [00′08″]</p>
<p>   下面我們就正式開始。現在我們講,那麼下面講些什麼呢?<p> 此中總攝一切佛語扼要。遍攝龍猛無著二大車之道軌。<p>   現在這個裡邊所講的,這是本論所講的,把佛所說的圓滿的教法的綱要,統統包含在裡頭了。而這個圓滿的綱要,下來又分性、相二支,一個是智慧資糧,一個福德資糧。經過彌勒菩薩以及文殊菩薩,向下傳到——無著、世親菩薩,龍樹、聖天菩薩,又分成功這個兩個大軌。那麼現在這裡有圓滿的包容,有了這個東西就可以把你引導到:<p> 往趣一切種智地位勝士法範,三種士夫,一切行持,所有次第,無所缺少。 [01′30″]</p>
<p>   現在看第一句:「<p> 此中總攝一切佛語扼要,遍攝龍猛無著二大車之道軌。<p> 」在這裡邊師父解釋此論就是本論,把佛所說的圓滿的教法的綱要,就是「佛語扼要」,統統包含在裡邊,就是指《廣論》。有了這個圓滿的綱要,接下來就傳承到龍猛、無著二大車之道軌。有了這樣的一個傳承,接著要把我們引導到哪裡呢?就引導到「<p> 往趣一切種智地位勝士法範,三種士夫,一切行持,所有次第,無所缺少。<p> 」請大家往下聽。 [02′11″]</p>
<p>   這是引導我們到佛地。「一切種智」,那就是佛的智慧、佛的智慧。這個裡邊這個道理啊是引導我們圓滿達到佛地,這就是說解決一切痛苦、一切問題,圓滿一切福德。那麼這個最高的目標是如此,上去又分成三個大的段落,每一個段落稱它為一種士夫,所謂下士、中士、上士。這個是上去一步一步的次第,就像我們念書一樣,小學、中學、大學,所有的這個內容,所謂教、理、行、果,圓滿一點都不少。在圓滿的教授當中,如果我們把它的內涵用另外一個方式來說的話,可以分成三個項目:第一個「質」,它的質本身要純正,一點不錯。這個「量」呢?要圓滿,一點無缺。還有呢?還要「次第」本身不可以紊亂。平常我們對於這個質跟量是容易了解,這個次第非常重要卻是往往忽視,我現在這個地方說一個比喻。 [03′46″]</p>
<p>   譬如說我們燒飯,然後呢你要菜啊、飯啊、米啊、樣樣東西。是的,說這個米就是米,平常我們說蒸沙煮飯,如果你用泥沙來,那不行!那時候米嘛、菜嘛這是沒錯啦!然後呢量,說幾個人嘛要吃多少,也沒有錯啦!可是次第同樣地重要。假定你弄錯了次第的話,那個不行。譬如說,你說你拿了菜來嘛,一定先把它整理一下,洗洗好,然後切好,然後放到鍋子裡燒。假定說你這個次第弄不清楚,你說:好!先把那個菜拿過來,燒完了再洗,這個行不行啊?絕對不行!因為菜上面種種的泥巴、種種的農藥,你燒完了能洗嗎?根本不能洗!本來這個菜吃了以後讓你增加營養的,結果你吃進去啊還有泥巴,你怎麼可能吃?這個毒藥不但不增加營養,還把你毒死啊!所以這個裡邊一定要有它的質、量、次第,現在本論這三樣東西一點都不缺少,所以這才圓滿。這個就是,喏,引導我們走上這一條圓滿的覺道的這個圓滿的教法,所以<p> 依菩提道次第門中,<p>   這個,這條門哪引導我們走上菩提大道的。 [05′26″]</p>
<p>   大家看這一段,說:「<p> 往趣一切種智地位勝士法範,三種士夫,一切行持,所有次第,無所缺少。<p> 」師父在這裡面講:「<p> 這是引導我們到佛地。『一切種智』,那就是佛的智慧、佛的智慧。這個裡邊這個道理啊是引導我們圓滿達到佛地,這就是說解決一切痛苦、一切問題,圓滿一切福德。那麼這個最高的目標是如此。<p> 」開宗明義啊,《廣論》!「往趣一切種智地位勝士法範」,就是這本論是教導我們成佛的。那麼生命最高的目標即是如此,成佛的境界是怎樣的呢?解決一切痛苦、一切問題,圓滿一切福德! [06′24″]</p>
<p>   現在看到這段話的時候,觀察一下我們自己,我們會為這個目標振奮嗎?有一天可以解決一切痛苦、一切問題,圓滿一切福德嗎?我們可以為我們的生命安立最高最高的目標嗎?我們常常為一些大大小小的目標奮鬥嘛,也為一些大大小小目標達不到而憂悲苦惱。比如說求別人的理解呀,希望有的時候可以得到幾句溫暖的話;還有的時候希望自己為別人做的事不要被誤會等等,我們生命中充滿大大小小的目標。可以說從早到晚、從小的時候到大,我們已經有多少目標了?很多目標就付之東流了,而且安立了之後,我們每天也為那個目標受苦吧! [07′27″]</p>
<p>   那麼學習《廣論》,是要我們達到什麼樣的目標呢?是要成佛!成佛要解決一切痛苦。誰的一切痛苦呢?發心記得吧?是要解決芸芸眾生的一切痛苦。但是如何解決芸芸眾生的一切痛苦,令他們都離苦得樂?是自己要明瞭這件事情,就是說自利和利他都要圓滿的。那我們有沒有想到——注意哦!我說想到的意思是:在我們的潛意識裡邊,在我們深深的那個心裡邊,是否安立出了這樣最高的生命目標——我是要成佛的? [08′10″]</p>
<p>   跟在師父身邊學習的時候,常常會看到有大大小小不如意的事情出現的時候,師父常常說:「正因為如此,所以我們要希求佛果啊!」在大大小小的痛苦和求不得的這樣一個狀態下,師父常常會這樣講,說:「正因為如此,所以我們要希求成佛啊!」但是相比於我們,就會發現當很多求不得苦出現的時候,我們就會被這個求不得苦所困,就會困在負面的情緒裡,比如說沮喪啊、失望啊,或者抱怨別人,甚至心灰意冷,會被這種負面的情緒籠罩,動彈不得。但是當這些痛苦出現的時候,師父在我們的眼前示現的,就是馬上就去希求佛果了,說:「正因為人生有種種不如意,所以我們才要去成佛呀!」 [09′12″]
<p>   這一段可以考慮一下自己,《廣論》的目標就是這樣——安立生命成佛的目標。但是這種目標是否深刻地安立在我們的生命之中?乃至在大大小小的如意、不如意的事相上,是否都能夠提醒我們去嚮往這樣的目標、憶持這樣的目標,而且踏踏實實地一定要達到這樣的目標?是否從心髓深處真的想要這個?就是自己生命的需要——我想要這個,我全部的生命力就只想要這個! [00′38″]</p>
<p>   如果我們全部的生命想要這個的話,那麼這本論就是要送給我們這樣的一個佛果,就是引導我們到那裡去的!如果全心想要這樣一個目標,而本論正是引領我們達到那樣的目標,那應該欣喜若狂吧!至少聽到這幾句話不會漫不經心,也不會好像覺得跟自己無關,或者沒有任何感動的心來學習。因為這是我最關切的,我生命全部的需要。全部的需要是什麼?引導我們圓滿達到佛地,解決一切痛苦、一切問題。解決一切問題喔!不是解決一點小問題,是解決一切問題喔! [01′28″]</p>
<p>   接下來,師父說會分三種士夫一切行持所有次第無所缺少,再解釋了一下下面的部分。解釋了之後,師父強調說質和量好像是可以理解的,但是次第常常被忽略。師父用煮飯的例子——前面已經講過,又再次地提到——考慮考慮要不要重視次第?如果不重視次第的話,拿煮飯這件事把次第顛倒了來說,我們都會覺得:可能是那個人不太正常,才會把菜煮熟了再去洗!但是我們對於解脫這條路不了解的時候,就是在顛倒行啊! [02′10″]</p>
<p>   比如說《菩提道次第》的次第之中,我們會不會覺得聽聞軌理實際上這樣的次第正是我們凡夫從一開始修行最最需要的?比如不學會聽法的話,那一開始聽就沒有聽對,怎麼思惟、怎麼修行呢?聽法的話,一定跟善知識聽法——親近善士、聽聞正法,如果沒有好好地修信,斷除非理作意和觀過這些習氣的話,影響信心也會影響聽法,也是沒辦法的。所以次第井然,這個次第就是非此不可的!沒有這樣的次第是沒辦法成佛的。所以師父在這裡邊再再地提醒我們,一定要依照次第,就是三士道——「三種士夫一切行持所有次第無所缺少」。 [03′07″]</p>
<p>   接下來說:「<p> 依菩提道次第門中,導具善者趣佛地理,是謂此中所詮諸法。<p> 」聽一下最後一句: [03′19″]</p>
<p> 導具善者趣佛地理,是謂此中所詮諸法。<p>   是引導具足善根的人達到圓滿佛地的這個道理,就是我們裡邊所說的。 [03′36″]</p>
<p>   「<p> 導具善者趣佛地理,是謂此中所詮諸法。<p> 」看到這一行的時候,我知道大家都很熟了,但是你們的注意力會放在哪兒?會注意那個「具善者」嗎?還是注意那個「導」字?還是會注意「趣佛地理」?大家可能注意力都有所不同。還是你們會看到整句的,每一個字都注意?那麼「導具善者」是誰導?是《菩提道次第廣論》,對吧?此論!「引導」,引導誰呢?具善者。誰是「具善者」呢?是不是在聽聞的你自己呢、我自己呢? [04′21″]</p>
<p>   前面都說了,具善者是什麼?「諸有偏執暗未覆,具辨善惡妙慧力,欲令暇身不唐捐」,接著什麼?「諸具善者專勵聽。」所以那個具善者就是《廣論》所化機呀!正所化機,是不是就是正在學習的我們呢?引導我們到哪裡去呀?去佛地喔!去那個最高最高的、最美最美的,斷除了一切痛苦、圓滿了一切快樂的生命的最高理想,去那裡!就是此中所詮的諸法,就是《菩提道次第廣論》裡所說的。 [05′06″]</p>
<p>   拿掉我們所有的苦,讓我們修起所有的樂,就是《廣論》裡所要告訴我們的。會不會覺得是難可值遇呀!會不會覺得內心很開心?遇到可以拔除生命所有的苦,給予我們生命所有快樂這樣稀有的正法,就在耳邊、就在眼前啊!這本論就在諸位的手上!所以為什麼叫《掌中解脫》?我們聽到了這樣的道理,如果能夠依教奉行的話,為什麼不能解脫呢?為什麼不能夠像《廣論》上所說的按照次第修行,像師父希望的質、量,然後按照次第去依次地生起親近善知識,乃至皈依三寶、業果、出離心、菩提心等等,為什麼不行呢?因為我們是《廣論》的所化機,對否?就是引導我們要去佛地的,為什麼我們會不行呢?佛菩薩都說:「具足那樣聽聞條件的人,想要暇身不唐捐的話,就努力地聽!」我們有沒有努力聽呢?「專勵聽」,有認真地聽,那麼為什麼不能夠趣向佛地呢? [06′25″]</p>
<p>   所以我們要打起十二萬分的精神,要斷除懈怠,努力地精進,要讓我們這一次的暇身絕不唐捐!所以就從認真聞法開始,聽到如何是成佛的次第,會不會非常非常地開心呀? [06′49″]
<p>   大家好!又到了我們研討《廣論》的時間了,請大家還是一如既往地觀察一下自己的現行——有沒有做好聽聞前行,尤其是大乘發心的部分?每次在研討之前,都希望我們能夠殷重發心,也希望這樣的提醒大家不要覺得:我都知道了,你不用提醒了!因為發心的練習是要一直練習下去的,直到它成為自己的習慣。就是當做什麼事情的時候,立刻就有一個為成就無上正等菩提這樣的發心,而不是為了此生過得舒服一點啊,或者為名、為利這樣的心,或者想要自己了脫生死,要把這樣的動機去除掉,用完全清淨的動機學習佛法——為了利益無窮無盡的如母有情,必須去希求一切遍智的果位;為了得到一切遍智的果位,我們要按著三士道的次第來聞思修。所以聽聞正法,是趣向於一切智智的一個必要的條件,所以現在大家要打起精神來好好地聽聞。 [01′19″]</p>
<p>   今天想請大家把師父新版的《廣論》這一段再聽一下,就是「<p> 此中總攝一切佛語扼要<p> 」這一小段。因為這一小段是講整本《廣論》到底在講什麼的,師父在舊版《廣論》已經講了,大家再聽一下師父在新版的《廣論》裡講的角度,聽的時候不要散亂、不要昏沉! [01′46″]</p>
<p>   那麼這個就是前面整個的序分當中,序分當中,那個主要的就歸敬。下面繼續地說一下,然後整個開顯。下面要正說正文之前,有一個說法,那個我一個人單單唸一下就可以了。<p> 此中總攝一切佛語扼要,遍攝龍猛無著二大車之道軌,往趣一切種智地位勝士法範,三種士夫,一切行持,所有次第,無所缺少。依菩提道次第門中,導具善者趣佛地理,是謂此中所詮諸法。 [02′38″]</p>
<p>   「此中」就是指這本論,這本論當中整個的說的內涵,是包含了——「總」是包含了一切佛,不僅僅是我們釋迦世尊,所有十方三世一切諸佛,沒有一個例外。所以通常說「佛佛道同」,達到佛的地度,所有十方三世佛所瞭解的正確的內涵,完全一樣,沒有一點缺少。現在這一本論所講的,並不是把佛的所有的話都包含在裡頭,而把佛告訴我們的精要,都含攝在裡頭了。這是第一部分,這個是佛的話。然後這個佛的話,要傳下來的話,又一定有它的這個傳承。所以說「遍攝」,這個裡邊也含攝了分兩部分:一個是廣行,一個是深見,兩個大乘的流派。那麼這個流派,一個是龍樹菩薩的,一個是無著菩薩的,這兩個大車。相當我們現在走這條像道路,那個道路像軌道一樣,所以兩個道軌。這個道軌是幹什麼的呢?透過這個道軌,能夠「往趣一切種智地位」——這個就是佛。能夠達到佛地的「勝士法範」,這種殊勝的士夫,這個勝士就是殊勝的人,如果是儒家來說就是君子,不是一個普通小人哪!就是這樣。那這個方法、軌範都在裡頭。那麼現在把這個方法分三個次第,所以叫「三種士夫」,初級的、中級的、高級的,現在這個地方初級的叫下士、中士、上士。那分著這個次第,我們應該修行的所有的內涵,「一切行持」,要所有修行的,照著次第沒有一點缺少。 [04′43″]</p>
<p>   師父在新版的《廣論》裡解釋了這一段話。你們都有新版那個書吧?「<p> 此中<p> 」就是指本論。然後「<p> 總攝<p> 」是對什麼的總攝呢?是一切佛語扼要的總攝,所以包含了一切佛。師父說:不僅僅是我們釋迦佛,所有十方三世一切諸佛沒有一個例外的,佛佛道同,所有十方三世諸佛所瞭解的正確的內涵,完全是一樣的,沒有一點缺少。而且這個扼要,師父解釋說:「<p> 把佛告訴我們的精要,都含攝在裡邊,這是第一部分。<p> 」就是「<p> 此中總攝一切佛語扼要<p> 」。 [05′40″]</p>
<p>   聽到此處,大家可以想一想:這麼厚的一本《廣論》,這裡邊「總攝一切佛語扼要」,能不能信得過這句話呢?為什麼說這本論它總攝了一切佛語扼要?有那麼精要嗎?如果是那麼精要的話,那我跟遇到寶一樣!因為十方三世一切佛他們所說的佛語扼要都在本論之中,看了這本論如果我瞭解了的話,我不是懂了一切十方三世佛他所說法的扼要了嗎?所以這句話是令人非常驚喜的! [06′17″]
<p>   接下來說:「<p> 遍攝龍猛無著二大車之道軌<p> 」。「<p> 遍攝<p> 」,師父又解釋了就是兩大傳承,深見——龍樹菩薩的,還有無著菩薩的兩大車軌。接著解釋「<p> 道軌<p> 」,像一條路,這個道路像軌道一樣。大家都知道如果火車離開了軌道那就沒法行駛,在這個軌道上行駛它就是安全的,就一定會到達目的地。因為鋪設這個軌道,就是為了此地到彼地這個目的地鋪設的。那麼道軌,師父說:「<p> 透過這個道軌,能夠『往趣一切種智地位』。<p> 」那是什麼呢?就是佛、佛果。 [00′41″]</p>
<p>   而且師父說:這就是殊勝的士夫,這個勝士就是殊勝的人,在儒家來說是一個君子,不是普通的小人。在這裡邊是最圓滿的一切智智的果位。此處尤其標示出它是「<p> 往趣一切種智地位勝士法範<p> 」,可以成佛的。我們沿著二大車的道軌要去哪裡呢?去佛地的。包括什麼?要經過三種士夫的行持、所有次第無所缺少,要經過這樣的道次第。師父說:「<p> 初級的、中級的、高級的。<p> 」所以叫下士、中士、上士,分這個次第。「<p> 一切行持<p> 」,我們所要修行的,照著次第,注意那四個字「<p> 無所缺少<p> 」。「<p> 三種士夫,一切行持,所有次第,無所缺少。<p> 」這幾句話如果大家仔細地把它一個字、一個字地讀過,然後再想一想:「這是什麼意思?」會不會又很驚愕呢?雖然你學了好多次了。 [01′52″]</p>
<p>   總攝一切佛語扼要,趣向一切種智地位,還有三種士夫一切行持哦!所有次第無所缺少,那這是一本什麼論呀?太驚訝了!那麼我能夠學到這一本論,就等於三種士夫一切行持所有的次第都沒缺少地了解到了,如果我們真的學到了的話。所以很高興啊!一開始很驚訝,現在越來越高興! [02′22″]</p>
<p>   接下來就要聽「<p> 依菩提道次第門中,導具善者趣佛地理,是謂此中所詮諸法<p> 」,聽一下師父講的。 [02′31″]</p>
<p>   現在關於這一個部分,它這整個的這個走法,含攝整個的內涵的,這個依照著次第,排出一條路來,這叫「菩提道」,這樣,「菩提道次第門」。然後這個是幹什麼的呢?引導具足善根的人。我們沒有善根在這個時代絕不可能聽到這個法,然後聽到了以後,還要看個人善根的深淺。所以對我來說,我現在談不到在這裡講,我只是願意盡我的一點力量,集一點資糧。所以昨天那個法會上面,我跟大家講的,二十歲的人說老了,二十幾歲說更老了,我今年快七十歲我說年輕了。我不是說笑話,因為我感覺到我條件太差,你們好的人高高在上享受,我小的事情我來做,為什麼?我要集聚資糧。這是真的,你越是到那時候,你越會感覺到我們資糧不夠,盡我們的力量,我能做的地方就我該我做。到底做什麼?我不一定一定是我要做什麼才算,那裡欠缺什麼我就做什麼,這樣。總是對整個的學習、對佛法,能夠產生最有效的這個最好,從這個上面來講。 [04′05″]</p>
<p>   在這一小段,說:「<p> 依菩提道次第門中,導具善者趣佛地理<p> 」,師父解釋了這個「具善者」要去成佛的。說這本論是做什麼的呢?就是引導具有善根的人去成佛的,依著道次第引導。那麼接下來我們就會評估自己:我是不是具善者呢?因為如果是具善者的話,我就被這本論引導去成佛。 [04′38″]</p>
<p>   師父說:「<p> 我們沒有善根在這個時代絕不可能聽到這個法。<p> 」諸位能聽到這麼精彩的《廣論》,一定是宿植德本、很有善根。師父接著說:「<p> 聽到了以後,還要看個人善根的深淺。<p> 」然後師父就馬上結合自己的例子再講一個事情。因為有的時候會聽到二十多歲的人為什麼說老了呢?因為他比十多歲的就老了,然後二十幾歲的比剛二十的就是更老了,所以有的時候年輕人就喜歡這樣比:「我比你更老了!」 [05′19″]</p>
<p>   但是師父說:「<p> 我今年快七十歲我說年輕了!<p> 」為什麼?師父說:「<p> 我不是說笑話,因為我感覺到我條件太差。<p> 」那麼年輕的幹什麼呢?就說:「<p> 好的人高高在上享受,我小的事情我來做。<p> 」七十歲哦!就是用一個來做小事情這樣的標準來衡量自己,就像一個小孩一樣,小孩就忙一些小的事情——照顧人啊、給人家服務啊等等,就做很多這樣的小的事情。為什麼呢?師父說:「<p> 我要集聚資糧!<p> 」我要集聚資糧!然後接著說:「<p> 這是真的,你越是到那時候,你越會感覺到我們資糧不夠,盡我們的力量,我能做的地方就我該我做。<p> 」我能做的地方就該我做,就是我! [06′18″]
<p>   聽到這一小段,大家有沒有反思一下自己的狀況?因為我在拜讀師父的日記,常常跟大家說,在師父的日記裡師父都是寫弟子怎樣怎樣,好像他所有的日記都是寫給上師和本尊的,而且弟子兩個字都寫得很小。在每一件事發生的時候,他都非常非常認真地檢討自己,即使在教鳳山寺的法師、教法人的一些同學做什麼、做什麼的,大大小小的會議、大大小小的提醒,都是在檢查自己是不是有一個清淨的饒益他人的心,還是看對方不對才說對方的? [00′46″]</p>
<p>   所以大事、小事情,他對自我的要求是非常非常認真而又嚴謹的。比如說有的時候,像掃地這種事情是不需要師父做的,像收垃圾這種事情也是不需要師父做的,但是我就看過師父去掃地,七十多歲了去收垃圾。而且師父在大家掃過的地方,還會檢查那個垃圾裡有沒有什麼被無意丟掉的東西。還有像有的時候跟師父去機場,法師們在忙的時候,師父就站在那個地方,會說:「哎呀!那個行李往裡邊拿一拿,不要妨礙走路的人。」他一方面怕妨礙要走路的人,一方面看法師的東西不要丟了、自己忘了沒有拉到,師父還給大家看包——高僧呀! [01′44″]</p>
<p>   大大小小的事情,包括該穿什麼樣的衣服適合外面的天氣,怎麼喝水,吃飯的時候要怎麼樣,師父大大小小的事情都是非常仔細地教導法師們,教導他的弟子們。這些所有的事情,沒有一件事師父會覺得他是不應該做的、他是一個高高在上的人,他什麼小事情都是去關注大家。因為在小事上會看到我們每個人造的那一分業,師父希望透過每一件事情,讓我們能夠淨化我們的業障、能夠集聚到資糧!他是自己這樣做的,他引導弟子們也是這樣做的。 [02′28″]</p>
<p>   所以看到這幾句話的時候我尤為感動,會想念師父啊!想念看到師父的時光。覺得他這裡邊講的,其實把他做到的部分只講了一點點而已,他做的實在是太多、太多了!所以每次拜讀師父的日記的時候都非常非常地感動,在其中看到的就是一個非常非常認真修行的修行者,非常非常地虔誠!他的生命就是用來改變自己、用來奉獻給大眾的,完全沒有一點點享樂的念頭,沒有一點點!所以他說:「<p> 我能做的地方就我該我做。到底做什麼?我不一定一定是要我做什麼才算,那裡欠缺什麼我就做什麼,這樣。總是對整個的學習、對佛法,能夠產生最有效的這個最好。<p> 」 [03′36″]</p>
<p>   這個觀點我也是聽師父講過很多次。比如說大家常常會覺得:「這不是我該負責的,為什麼我要負責這個?應該是你負責。」有的時候大家在一起合作的時候,就會出現這個問題。但是師父會看哪裡欠缺他就去補!說:「哪裡欠缺什麼,我就該做什麼。」沒有一定是我要做什麼的,但是總體是必須對整個學習教法能夠產生最有效的,就做那個事情。那麼對整個的學習最有效的,就是把法留下來,就是如法——說的人如法地說、聽的人如法地聽,能把這個清淨的傳承留下來,師父所有的生命都致力於此。所以既能看到生命中最關鍵的問題是什麼,又在大事、小事中貫徹始終如一的宗旨!這是跟師父學習的時候,感觸最深的地方。 [04′33″]</p>
<p>   比如說以前跟師父討論,就常常會說:「我不一定要去帶僧團呀,這個對我壓力太大了!我可能帶居士們,大家一起研討《廣論》,就覺得已經是很奢侈了,也不能做什麼,當個大班長就不錯了!」師父那時候就像這原話一樣,說:「你一定要做什麼才能修行嗎?佛法需要你做什麼你就做什麼,不一定你一定要做什麼,缺你做什麼就做什麼。」那個時候就是這樣的觀點。所以我在這個新版《廣論》又看到這句話的時候,就好像又聽到師父在我耳邊再重複地講這個他一生奉行的很重要的——說思想也好,說他的行為準則也好,就是需要做什麼就做什麼,什麼對眾生有利、對佛法最有利,就做那件事,哪裡缺什麼,就去做什麼,自己不一定是一定要做哪個。所以每每為師父這樣的心所感動。 [05′36″]</p>
<p>   對我們來說,檢查到自己,平常根據分工不同啊,你負責這個、我們負責那個。我們開會的時候,大家可以想想,法人有會呀、園區有會呀,僧團也有會呀,各個部門都有會。在開會的時候,我們對於那種他在負責他的事情上沒負責好的那個人,我們通常都會不太高興,但是有沒有想:「他沒有負責好,我有沒有給他一定的援助呢?」然後這就又涉及到:各人在各人的本分內負責自己的事情,這不是我的本分,我為什麼要去幫他?好像會跨越某種管理制度一樣。但是我們的發心本身就是跨越一切管理制度,我們的心要遍及一切法界有情,要幫忙一切有情離苦得樂,不能說那塊兒歸文殊菩薩管、這塊兒歸地藏菩薩管、這塊歸觀世音菩薩管,那我們管什麼呢?現在佛菩薩都已經遍及法界有情的發心,那我們什麼都不用管了!所以當我們的發心要遍及一切有情的時候,是不能受限於這些——分工、分工,受限之後就覺得不能去援助那個人,沒有援助他的心。這一點希望在這一段供諸位參考,反思一下自己。 [06′47″]</p>
<p>   因為師父在這一段講的是具足善根的人,說我們善根不具足的狀態下,怎麼樣讓這個淺的善根變得很深呢?就是要培福,要集資、淨懺。所以在一切事情上,能夠低下心來幫忙大家成辦他要成辦的善業,努力地去幫忙別人。做這個是為了什麼?因為資糧不夠啊!就是要積累善根、要積累福報。 [07′20″]</p>
<p>   在這一點上,師父的觀點是非常明確的。所以我會想要請大家聽一下,「導具善者趣佛地理」這具善者,如果感覺到自己善根不夠,應該怎麼做?師父在這裡講的下腳處是非常明晰的! [07′38″]
<p>   我們接著聽師父在新版《廣論》裡的一小段。<p>   所以說這個情況之下,具足善根固然好,然後呢,我們現在聽聞教法大概多少是有一點,然後呢,希望從上面增上,這個大家還要靠自己的努力,這樣。所以但願我們憑藉著已經有的這個善根,繼續地不斷地在上面增長,那麼使得能夠百分之百能夠跟大師引導我們的條件相應,我們就上去了。所以「具善者趣佛地」,能夠一直達到佛這個地位,對這個——就是我們的目標,我們還有滿遙遠的一段距離。但是我們有的是機會,只要我們認識了,我們能不斷地在這個環境之下,好好地淨除罪障、集聚資糧那就對,那就是這個就是現在本論所說的主要的整個的內涵。他那講的時候他有不同的方法,那根據各派不同的傳承。 [01′18″]</p>
<p>   師父說:「<p> 這個情況之下,具足善根固然好,然後呢,我們現在聽聞教法大概多少是有一點,然後呢,希望從上面增上<p> 」,增上要怎麼辦呢?「<p> 大家還要靠自己的努力。<p> 」說現在已經具足善根,可以聽到《菩提道次第廣論》,而且很多、很多人聽了之後非常地歡喜,甚至是欲罷不能!有的居士就一聽,聽了三十年,還在繼續地學。像這次去南北加,就看到有三十多年的居士,真的是非常非常地歡喜。當時給大家發三十年的那個下面有寶石的蓮花徽章的時候,其實我是懷著非常非常尊敬的心獻給他們的,我會覺得真是太有善根了! [02′15″]</p>
<p>   那麼怎麼樣要憑藉自己已經有的善根,繼續不斷地在上面增長?師父為我們提出了目標,就是能夠百分之百跟大師引導我們的條件相應。宗大師把《廣論》講到「三種士夫所有行持一切次第無所缺少」,這樣的一個法在我面前,我們怎樣能夠具足百分之百的善根跟這個相應呢?相應的話,我們就上去了!師父說:所以「具善者趣佛地」,就能夠一直達到佛這樣的一個果位,這就是我們的目標。然後師父說:「<p> 我們還有滿遙遠的一段距離<p> 」,離成佛很遙遠的一段距離,但是師父接著說:「<p> 我們有的是機會<p> 」,什麼機會呀?「<p> 只要我們認識了,我們能不斷地在這個環境之下,好好地淨除罪障、積聚資糧那就對,那就是這個就是現在本論所說的主要的整個的內涵。<p> 」 [03′23″]</p>
<p>   成佛好像離我們非常遙遠,或者確定是很遙遠的距離,我們看到我們想要那個目標。但是我們現在擁有的是什麼?機會!什麼機會?認識了宗大師、認識了《菩提道次第廣論》、這麼多傳承祖師,只要能夠不斷地在這個環境下,環境是指什麼呀?有師、有友、有法,對吧?生活資具都不缺,然後自己又具足暇滿的那些條件嘛!還有這樣的一個僧團,僧團的法師們在前面帶著繼續地修學,然後我們都有廣論班;在家裡聽了聽有點事情可能就中斷了,但是有個班,你不去的話,可能同學就打電話給你。有的時候還有一些同學很進步啦!然後你看著別人,「欸,他進步了,我得考慮考慮我自己呀!我有沒有長進啊?」 [04′21″]</p>
<p>   出家人也是一樣啊!大家都歸屬於各自的學制班,比如說你到底是戒論班的啊?俱舍班的啊?還是現觀班的啊?還是因類學班的?還是攝類學班的?有了一個班之後我們就會有進度,一直沿著那個進度往下走,就會有三十年不會間斷的聞思的這樣的一個事實擺在我們面前。所以這是一個很好的學法的環境啊,對不對?僧俗差不多都有一個這樣的學制。 [04′53″]</p>
<p>   雖然居士的學制還不是特別地完整,我們要一起努力呀!然後把它規劃得特別完整。但是畢竟這是一個非常好的學法環境,所以在這個環境裡,師父勸勉我們要好好地淨除罪障、積聚資糧那就對了!所以當我們心慌的時候想想:我有沒有淨除罪障、集聚資糧?我所做的一切事情有沒有朝著這樣的方向?大乘發心有沒有在策勵、策發自己?如果有朝著這樣的方向,那就是對的。 [05′28″] 
<p>   前幾天在讀《般若經》的時候,在卷第四百四十四〈第二分成辦品第四十八〉中間有一段,我給大家唸一下: [00′15″]</p>
<p>   復次,善現,有菩薩乘諸善男子、善女人等,雖於先世,得聞般若波羅蜜多,亦曾請問甚深義趣,或經一日、二日、三日、四日、五日,而不如說精進修行,今生人中,聞說如是甚深般若波羅蜜多,設經一日、二日、三日、四日、五日,其心堅固,無能壞者,若離所聞甚深般若波羅蜜多,尋便退失、心生猶豫。何以故?善現,是菩薩乘諸善男子、善女人等,由於先世得聞般若波羅蜜多,雖亦請問甚深意趣,而不如說精進修行,故於今生若遇善友慇懃勸勵,便樂聽受甚深般若波羅蜜多,若無善友慇懃勸勵,便於此經不樂聽受。彼於般若波羅蜜多,或時樂聞、或時不樂,或時堅固、或時退失,其心輕動進退非恆,猶如輕毛隨風飄轉。當知如是住菩薩乘諸善男子、善女人等,發趣大乘經時未久,未多親近真善知識,未多供養諸佛世尊,未曾受持讀誦、書寫、思惟、演說甚深般若波羅蜜多。<p>  [02′11″]</p>
<p>   這一小段就是在解釋一種現象,我們只能就這個部分聽一下。說:為什麼聽完了經,書本一放下然後就馬上開始退失、心生疑惑了呢?佛說就是因為先世雖然聽聞般若波羅蜜多,也曾問它的甚深意趣,但是沒有如說精進修行,就是修行不精進哪!所以今生遇到了善友,一勸他,他就開始發力、開始努力聽;如果沒人勸的話,就於此經不樂受持,他就顯示為有時候很願意修行,有時候就不願意修行;有的時候非常非常堅固信心、很勇猛,有的時候就退失了。他的心輕動,進退非恆,是很容易變動的,就像羽毛一樣隨風飄轉。 [03′10″]</p>
<p>   注意哦!這是說住菩薩乘善男子、善女人哦!他剛趣向於大乘,時間不是很久;沒有多親近真善知識,親近善知識力度不夠;沒有多供養,供養佛世尊也不夠;尤其是未曾受持、讀誦、書寫、思惟、演說甚深般若波羅蜜多,這些也沒有精進地修行。 [03′34″]</p>
<p>   這一段,再想一想剛才師父給我們講過的——所謂的「資糧不足」,就是如說修行要集資、淨懺。那麼集資、淨懺的部分,集資——比如說多供養三寶啊、多承事僧眾啊,多孝順父母親啊,這些都是集資糧的。如果沒有如說精進修行的話,我們就會出現在《般若經》裡講的這個症狀,一會兒精進、一會兒又忘了;有人一勸就發心,一會兒不勸就沒了。住菩薩乘善男子、善女人還有那樣的現象呢! [04′10″]</p>
<p>   可見師父在新版的《廣論》給我們講的「具善根」的這個善根,是包含著要精進地積累資糧、淨除業障。這裡邊尤其是說具善者要把那善根培越來越深、越來越深,要怎樣才能夠讓自己的精進恒常,不會沒人勸你就懈怠了、有人勸你就精進。從內心裡真摯地、恒常地變成他自己的一個習慣,就是精進成為一種習慣了。當這種習慣還沒有出現的時候,大家要努力! [04′49″]</p>
<p>   所以師父就是凡事都認真、凡事都努力,不肯放過任何一件事他對自心的觀察和調整,完全顯示了精進的內涵,始終如一這樣的一個內涵。能遇到這樣的善知識實在是太幸運了!能遇到《廣論》。所以大家一定要好好珍惜自己、好好地學習。另外也不要忘了常誦《般若經》,因為師父每日必誦《般若經》,從未間斷過,除非是病在床上起不來了,他一定會誦的!宗大師也是這樣的。所以大家也要堅持讀誦《般若》!堅持書寫、思惟、演說甚深般若波羅蜜多! [05′37″]
<p>   大家好!又到了我們研討《廣論》的時間了。每天都很期待這樣的時光,我們的生命也因聽聞《菩提道次第廣論》而具有非凡的意義,在聞思修中實現自我的生命價值,體驗我們自心對於經論的探索,也可以說心靈旅程的一次冒險,因為對我們內心來說,永遠都有新的、不一樣的發現。 [00′33″]</p>
<p>   今天我們要學《四家合註》第一冊,大家有書的話就翻到 92 頁,「<p> 第四、<p> 辨識名義及所說法者<p> 」,然後下面就是《廣論》原文。「<p> 此中總攝一切佛語扼要,遍攝龍猛無著二大車之道軌,往趣一切種智地位勝士法範,三種士夫一切行持所有次第無所缺少。依菩提道次第門中,導具善者趣佛地理,是謂此中所詮諸法。<p> 」在 93 頁的語譯,說:「<p> 辨識《廣論》的論名涵義以及所說的法:<p> 本論當中統攝了一切佛語的精髓扼要,並且完整地包含龍猛、無著二大車軌師所宣說的道軌,前往一切種智地位的殊勝士夫的法則,三種士夫一切行持的次第,沒有任何遺漏缺少。透過菩提道次第,引導具足善根因緣者修行邁向佛地的道理,這就是本論所詮說的法要。」 [01′55″]</p>
<p>   在這裡邊,註釋的部分大家可以看一下。第二則解釋了一下「一切種智地位」。看第二則裡邊的第四行。前面說了一下佛三智——一切智、道相智和一切種智。然後到第二個註釋的上數第四行,有妙音笑大師在《八事七十義》中的一句解釋。「一切種智」是什麼呢?就是「於一剎那頃無餘現前證知如所有、盡所有相之究竟智,是一切種智的性相。」 [02′35″]</p>
<p>   這個以後我們在講說趣向於一切種智地位,那一切種智地位它的定義,還有那三智的差別,在《現觀》裡都有廣泛的論述。我們再看一下,「於一剎那頃」,一剎那頃哦!接下來是「無餘」,就是用極短的時間,「現前證知如所有、盡所有性之究竟智」,他現前證知不是透過比量、不是透過推理,就是像眼前看到東西一樣。所以他是一下子會證得如所有性和盡所有性的究竟智,就是一切種智的性相。 [03′16″]</p>
<p>   佛陀不是有那樣的功德嗎?就是他在剎那頃可以了知一切眾生的心行,所有的一切都知道。一切所知在佛陀的面前是現量的,不是透過比量或者任何推理,完全是現量的。而且他現量了解是不需要利用任何儀器,完全是透過心!時間用多長呢?就是剎那頃而已。而且看得有多清楚呢?就像看手掌中的菴摩羅果一樣,全部是透明的,沒有什麼看不清楚的!所以對於一切所知全部都了解。 [03′58″]</p>
<p>   現在再換到下一本,大家可以看《四家合註入門》的 79 頁。仁波切說:「第三科已經結束了,現在是第四科。這一段裡仍有不同的段落,可以細分,但此處沒有再各別分段。本論到底依循何種講說傳規,下面還有說明。就是辨識所說法後,用哪一種解釋、講說的方式,有吉祥那蘭陀寺和止迦摩囉寺兩種傳規,本論將要依循哪一派的作法。從『<p> 此中<p> 』至『<p> 所詮諸法<p> 』中間沒有箋註。『<p> 此中總攝一切佛語扼要<p> 』」,在這裡仁波切有解釋「佛語」,所謂「佛語」是指什麼呢?是「指勝者言教,佛薄伽梵所說的法,全部即八萬四千法蘊。以有情的三毒煩惱為本的九品八萬四千煩惱,佛薄伽梵針對這些煩惱宣說了各自的對治法,就是八萬四千法蘊,也就是『佛語』。」 [05′11″]</p>
<p>   為什麼會有這麼多法呢?因為我們有這麼多煩惱,每一個煩惱都要有一個法來對治,所以有這麼多法蘊。這些佛語「將這其中一切的扼要攝集在一起,就是總攝扼要。」《廣論》文上不是說:「<p> 此中總攝一切佛語扼要<p> 」嗎?就是把一切的扼要攝集在一起。然後「如果將八萬四千法蘊收攝在一起,可以歸納成甚深及廣行二種道,這就是收攝扼要的方式。」 [05′46″]</p>
<p>   「『<p> 遍攝龍猛無著二大車之道軌<p> 』,所謂的『大車』,比如說,本來只有窄小的道路,後來整治成大路,使所有的車輛都能行駛,能這樣去拓寬道路的人,就被稱為『大車』。」在龍猛菩薩及無著菩薩之前,有沒有佛陀的教法?有的,不是沒有佛陀的教法,「但是大乘教法非常地式微,傳持的人很稀少,而小乘部派則廣泛地弘傳。由於龍猛、無著二位菩薩廣開大乘之門,令大乘的教法長久流傳光顯宏揚,所以被尊稱為『大車』。」 [06′36″]</p>
<p>   那麼大乘教法中最主要的是哪兩派的傳承呀?知道吧?深見、廣行二派傳承,這是龍猛、無著菩薩得到文殊和慈氏二位菩薩的傳承。而龍猛、無著二位菩薩,大家可以想一想:那是不是龍猛菩薩的法,無著菩薩不知道?無著菩薩會的法,龍樹菩薩不知道,所以他們分兩派呢?仁波切說:「龍猛、無著二位菩薩並非在各自的教法中沒有對方的教法。以具德怙主聖者龍猛來說,無論深見、廣行的教法都全部了然;聖者無著菩薩也是一樣,並非不了解對方的教法」,那為什麼叫這兩派呢?「只是各自開啟事業大門的方式不同。」為什麼會有開啟事業的方式不同呢?「因為各自所化機不同,而形成不同的事業門,不是只有自己的教法而沒有對方的教法」,或者說龍樹菩薩不了解無著菩薩的法,不是這樣的。 [07′46″]</p>
<p>   舉個非常簡單的例子,比如說大家進入學習《廣論》的方法就是不一樣的,有的人可能從園區的那方面得到了《廣論》的消息,開始進《廣論》班的;還有的人去聽讚頌,聽到了《廣論》的消息;還有的人種有機;還有的人從教師營啊、校長營啊,很多不同的門徑瞭解到了這一個。我剛才講的是入門方式。 [08′14″]</p>
<p>   所以,「在以前佛薄伽梵就已經授記龍猛、無著二位菩薩將光顯大乘之門。本論將要闡述的就是二位大車的道軌。」這兩位菩薩因為他們事業不同所以就分為兩大道軌,是佛陀在經典中有明顯授記,是有經論依據的、佛金口宣說的。 [08′39″]
<p>   那麼接著呢,大家看《四家合註入門》80 頁的第二段。說:「接著,是一切具有善緣的所化機,『<p> 往趣一切種智地位勝士法範,三種士夫一切行持所有次第無所缺少<p> 』」就所謂呢「所化機有上、中、下三類,將三種士夫各自修持方式的所有次第,無所缺少攝集一處的,就是本論。」那麼「三種士夫」是什麼呢?注意聽!注意聽!不要說:「三種士夫我已經非常熟練了」,所以心就馬虎了。要注意聽!「以自利為主,並且因為怖畏三惡趣,希望自己不要墮入三惡趣,而且能獲得人天果位,為此努力的就成為下士夫。」 [00′55″]</p>
<p>   可以看清楚,下士夫的主要目標是為了誰呀?是為了自己不要墮入三惡趣,希望能獲得人天的果位,將為這樣的幸福,就是來世的人身——暇滿人身而努力的,就成為下士夫。能把自己管好了,也省得佛菩薩操心,對吧?但是,對所有下士夫的想法,佛菩薩們應該是希望能夠是透過共下士道,以後進入上士。那麼這是下士夫。 [01′36″]</p>
<p>   然後中士夫呢,「為了自我能夠從六道的輪迴大海中解脫而精勤奮鬥的,就稱為中士夫。」所以他並不滿足於不墮落三惡趣,認為整個輪迴也是非常令人怖畏的甚深可畏的苦海,想要從這個輪迴的海裡面解脫出來,為此精勤奮鬥,就成為中士夫。那麼「不同於前者」,注意!哪一點不同於前者呢?「為了一切有情的利益,為了一切有情的利益,自己精勤於獲得佛陀果位的,是上士夫。」這是對於三士夫最簡略的介紹。大家可以看清楚、聽清楚這三士夫的根本差別在於什麼?在於他們是為自己——正下士和正中士都是為了自己不要墮入惡趣、不要輪迴,然後發心精進修行。而上士夫呢,是為了一切有情的利益,然後精勤;他的目標不是為了解脫輪迴和不墮三惡趣,他的目標是為了成佛! [02′56″]</p>
<p>   其中的重點到底是什麼呢?三種士夫是依靠著什麼來安立的?大家可以想想,是依靠什麼安立的三種士夫呢?是不是依照各自的等起、思想方向來安立的?就是自己的動機呀!你想要什麼,你的目的,對吧?所達到的目的安立的。所以結合我們的經驗來看也是如此,主要是自己的動機。如果好的話,就可以說是清淨的正法;動機不好,就很難說是清淨的正法。 [03′33″]</p>
<p>   現在看《四家合註入門》第 81 頁。「我們禮佛一拜,或唸一句『嘛呢』,如果能懷著為了來世人天增上生的動機,那就屬於下士、下士道、下士夫。《道炬論》當中直接顯示的下士夫,最基本必須是希求來世人天增上生的士夫。」如果只希求今生,是不是《道炬論》裡直接顯示的下士夫呢?有的時候去寺院裡求佛菩薩的,求升官、發財呀、兒子上大學呀,還有很多不能列入《道炬論》裡直接顯示的下士夫!因為還沒有希求來世。「如果只希求今生,就不是《道炬論》裡直接顯示的下士夫。」在這裡邊仁波切是這樣講的。 [04′26″]</p>
<p>   所以「如上所說,無論現在我們作課誦也好,或作任何的修持,為了獲得人天增上生,就屬於下士夫。為了自利而希求從輪迴中解脫,無論作任何淨罪的行為,都會成為中士夫的道。內心想著一切有情的利益,即使我只作一個禮拜,那也將成為上士夫的道。所謂的法,非常非常地甚深、非常非常地細微,僅就相續中內心執持境的方式那一點來安立的,本來可能是不可思議的功德勝利,如果心被煩惱染雜,就會丟失這樣的功德。所以內心中意樂的差別,存在著巨大的差異!」 [05′16″]</p>
<p>   在這一小段裡,仁波切就在具體的例子上告訴我們,我們是用什麼樣的心禮佛,什麼樣的心念咒,我們就會進入什麼樣士夫的道,對不對?譬如現在大家都作課誦,有些人念《密集嘛》、有人念「嗡嘛呢唄咪吽」,有人念「嗡阿惹巴扎那帝」,還有人念「南無觀世音菩薩」。如果我們一害怕、一痛苦,想要馬上脫離痛苦的時候,好像那也只是為了眼前對不對?為了眼前的苦、眼前的怖畏,然後「南無大悲觀世音菩薩、南無大悲觀世音菩薩......」這樣去稱念佛菩薩的名號,到底有多少念頭是因為害怕來世墮落惡趣,而祈求佛菩薩救護的呢?我們可以觀察一下自己。 [06′08″]</p>
<p>   那為什麼我作課誦的時候,或者我祈求佛菩薩的時候,這個下士夫的心的安立好像都常常不現前呢?是不是我們無限生命的概念還沒有確立?就是我這一個心續是不會消失的,是會從現在開始,從無始的過去到無限的未來,在這中間如果我們沒有了脫生死的話,就一直在生死中。如果在生死中墮落惡趣的話,那就會失去所有學習佛法的機會,對一個凡夫來說是很可怕的,就墮落了!所以來世有一個暇滿人身,應該是作為我們學習菩提道次第人、想要修行的人吧,最起始的一個追求啊!因為這一生已經過了這麼多了,如果一進入惡道的話,來世就會太長了,那不是幾萬年、幾萬年算的,因為惡道很難出啊! [07′09″]</p>
<p>   所以希求來世的心是非常必要的。那麼觀察一下我們自己,比如說,上《廣論》研討、或者去作善行、去護持、去當義工,我們有沒有特別注意策動自己動機的部分?我是懷著一個共下士的心?還是共中士的心?還是一個為利一切有情,希求一切智智的心,去做這些善行的?因為懷著什麼樣的動機,我們所作的善行就會被攝入什麼樣的道。很顯然,上士道像一個汪洋大海一樣,它所匯集的一切資糧都會成為一切智智的果位。如果能有這樣的一個發心的話,那麼我們所修行的一切都會成為大乘的加行吧!就是前面的準備吧! [07′57″]</p>
<p>   所以如果不認真地策動動機去做各種修行,實在是很虧的!這就是為什麼每次聽聞的時候,都希望大家能夠認真地策動一下自己的內心,哪怕是相似的安立,哪怕是現在就想幾個念頭。我們平常的相續一直淹沒在眼前的芝麻綠豆這些事情上,只有確立一個生命最究竟的目標,一個高遠、終極的目標。看到了那個高遠、終極的目標,其實眼前的困境有的時候我們就會有勇氣穿越,因為終究這一切煩惱將被解決,因為我們已經找到了離苦得樂之道。對於眼下的這一步,是造惡業過去,還是造善業過去,我們就會很清晰地抉擇清楚。而且眼下我們得到人身,是我們修學佛法的最佳機會,這裡邊的三乘士夫,可以說任我們選擇,一入惡道就沒有這樣的機會,所以這是千載難逢的大好時機! [08′58″]</p>
<p>   在這一段裡,仁波切特別特別強調內心的安立——你是什麼樣的發心。在這一小段裡邊說:「內心中意樂的差別,存在著巨大的差異!」修行者的差異性是從內心的安立、意樂的差別而導致的。誰最後能夠成佛,誰最後能走怎樣怎樣的路,從你的動機上就區分開了。 [09′30″]</p>
<p>   「菩提道次第就完全收攝在《道炬論》裡面。」所以「<p> 依菩提道次第門中,導具善者趣佛地理,是謂此中所詮諸法<p> 」,這就是在辨識所要講說的法。 [09′48″]<p> Copied to clipboard!
<p>   在阿喀慧海大師《廣論講說誦授傳承筆記》中,有這樣一段,說:「『<p> 此中總攝一切佛語扼要<p> 』這句話,是指一切佛陀成佛的密意扼要,用世間的話來講,這些內涵的關鍵就是令有情解脫。最初止息惡趣,安置於善趣;安置於善趣後,以四攝法依次引導於六度等;最後安置於無住涅槃的事業,即是佛陀的密意關鍵,以及事業的關鍵。這一切,《廣論》都收攝其中。」 [00′40″]</p>
<p>   這裡邊也再度講了一下:「『<p> 二大車之道軌<p> 』,並不是他們互相不了解」——深見派不了解廣行派,不是這樣的,「而是就開啟事業之門而分的。」「『<p> 往趣一切種智地位勝士法範<p> 』,這邊暫且不說不想趣往佛地的人,如果是決定欲往佛地者」,就是決定要成佛的。那麼請問:趣往佛地的方法在哪兒呢?你們現在的答案是什麼?本論都有,對吧!「趣往成佛的辦法本論都有。即便是下士夫,趣行於彼道的方法」,下士夫的,就是想要不墮落惡趣的,想要來世得人天身的,比如說想要長相莊嚴、財富豐饒、有廣大的眷屬和朋翼等等,還有廣大的智慧、廣大的辯才,這些本論有嗎?能讓你成為這樣的人的方法,本論有嗎?「本論是有的。」對不對?「若是中、上士夫的趣行道理,本論也無不攝集。如果不是這三種士夫,那就不能算入希求一切智智者的行列了。」然後這位善知識這樣講,說:「傑仁波切在此處只是溫和的講法,其實這一句話是將重大關鍵講得很清楚的。」 [02′04″]</p>
<p>   問大家一個問題:說《廣論》所有的次第都有,那麼比如說經懺呀,還有什麼除天災呀、降雨什麼,這個法有沒有?消除大火的祈雨的方法,《廣論》有沒有?不是所有次第都有嗎?那你們認為有沒有呢? [02′25″]</p>
<p>   聽一聽大善知識的回答,說:「大部分人會認為《廣論》不具備經懺、除天災等許多儀軌修法。其實並非不具備,因為這一切的根本都依賴於心,而心又依賴於悲智力,所以那些法出生的方便在本論都是有的。」祈雨的儀軌是有,但是如果沒有修行的話,祈雨會靈驗嗎?那他的修行是靠什麼修來的?還是靠修行本論的內涵,對不對?很多很多功德,是要靠修習菩提道次第然後才能夠成就的,因為這是一切佛語扼要的修持,可以令我們成佛的法在這裡都有。成佛應該是最難的吧!最遠的都有了。 [03′15″]</p>
<p>   那麼,我問大家一個問題:讓你免除心煩意亂的法,《廣論》有嗎?止息你的悲痛的法,《廣論》有嗎?讓你不再沮喪的法,《廣論》有嗎?不再沮喪、不再悲哀,能夠對生命正向作意,能夠有希望,這是屬於此世的快樂還是來世的快樂呢?好像被攝入此世的快樂,對不對?那麼此世的快樂更容易得到,還是來生的快樂更容易得到呢?此世已經有人身了,而且還是個不錯的人身,具有善根,對佛法具有信心,能夠長年累月地堅持聽聞道次第的法,聽聞很多佛法,這是非常有善根的一個人。那麼達到此世的平靜容易呢?還是得到來世的人身容易呢? [04′13″]</p>
<p>   當我們心裡邊有煩惱,或者有各種問題的時候,我們是會向《菩提道次第廣論》去求解決的方法呢?還是去到其他地方找解決的方法呢?因為宗大師說一切佛語的扼要都在這裡邊,三種士夫一切行持所有次第都在這裡邊。如果我們要希求來世暇滿人身的那個法,會不會在《廣論》裡呢?那麼在《廣論》裡邊,是怎麼樣的法呢?從發心到加行要怎麼修?親近善知識的第一個法類,是不是可以不墮落惡趣?對吧!皈依三寶也可以不墮落惡趣,出離生死那個出離心更可以,菩提心更可以。所有的法修成的最低起點,都一定是來生不墮落惡趣——最起碼的利益就是不墮落惡趣。 [05′10″]
<p>   我們現在已經遇到了這麼完美的教法,觀察一下自己的心,能不能信得過呢?會不會覺得除苦引樂的方法就在本論裡邊?注意哦!滅除一切的苦、圓滿一切功德的法,《廣論》裡都有。那麼我們滅除當下痛苦的方法,《廣論》裡會有嗎?在我們當下痛苦的時候,我們是更重視馬上解決眼前的痛苦,還是想要種一個樂因、種一個善因呢?還是已經學會了把當下的痛苦轉為道用,哪裡有痛苦、哪裡有煩惱立刻就起修?痛苦逼迫得越猛,道心越堅固,希求一切眾生離苦得樂的心會越強,因為我都這麼苦了,還有很多眾生比我還苦,那麼就讓我所受的苦能消除他們的苦。這也是痛苦的時候一個修法。 [00′54″]</p>
<p>   眼前的苦楚能不能變成是鞭策我們去修道的,還是變成了拖累我們修行不了的?這我們的心要想清楚。比如說要參加廣論班,會不會有大大小小的障礙?會有的!但是那些障礙是讓你更加地積資淨懺,想要突破這些障礙,還是那些障礙就戰勝自己了,自己被障礙打敗就學不了了?這也是兩條抉擇的路。那看看來生,如果不學,用什麼方法得到暇滿人身呢?沒有其他的方法呀!因為這裡邊會給我們共下士夫的利益呀!如果認真照著修行的話,是一定會得到下士夫的利益! [01′38″]</p>
<p>   雖然是一小段,每一句、每一句都在提醒我們離苦得樂的辦法。我們到底對於佛說的離苦得樂的辦法,心裡能不能信得過?能不能死盡偷心地去造善業?因為善業會出生快樂,然後會去淨除惡業,惡業是由煩惱引生的,所以去淨化它。淨化它一定是從動機上開始的,就是我為什麼要做這些事?如果是為名、為利,甚至是為了一己之私去傷害別人,那就是純粹的惡業了。所以這些點就要在二六時中自己觀察自己的相續,要認認真真地把雜質去掉、把黑業去掉,造集白淨的善業。因為佛說善業才會出生樂,惡業只會出生苦。 [02′28″]</p>
<p>   所以對於我們來說,如果我說現世的苦樂不重要,可能大家會說:「怎麼不重要?我們的心被現世的苦樂綁得死死的!當有樂來的時候,大家便不想離開;當有苦來的時候,就一刻都不願意停。」但是注意力如果轉成來世的苦樂的話,我們就會注意:我當前的心念是否是來世暇滿人身的正因呢?我們就會想要在苦樂臨頭的時候,最重要的是護戒,對不對?增上生的因,除了戒定非餘呀,這後面有講。所以什麼樣的發心,就是我們作為修行人我們的目標是什麼,就決定我們會為那個目標努力。 [03′10″]</p>
<p>   心理學家也有這樣研究,說當一個人的大腦不去告訴他的身體要放棄什麼的時候,其實他的身體也不會放棄的,就是說其實大腦是指揮這一切的。那麼那裡邊所謂的大腦,可以理解為我們的心的作用嗎?當你的心想要那個時候,你的心不想要因為挫折而放棄,不想要因為沮喪而不去希求三士夫的果利,甚至一切智智的果位的話,我們是否可以穿越挫折,穿越此生的種種障礙,然後去希求那個結果?因為就像師父講的,有機會呀!我們是具善根者,能夠聽聞道次第,具足這樣的善根人是不是《廣論》的所化機?那我的善根深淺還是我自己可以培植的! [03′59″]</p>
<p>   有的人樂的時候造惡業,有的人苦的時候造惡業,所以並不一定樂的時候我們就會佔到便宜,不一定現在很快樂就對來世很好,也不一定現在很苦就對來世不好,關鍵是在苦和樂的時候,我們選擇是不是希求來世,是不是希求脫離輪迴,是不是希求饒益一切有情去成佛?那個關鍵是《廣論》要教我們的,對不對? [04′26″]</p>
<p>   想一想,會不會很感恩這一生生命的際遇?我們居然遇到了可以成佛的法、可以當菩薩的法、可以脫離輪迴的法、可以免除墮落惡趣的法,《廣論》裡都有!還有什麼樣的武功秘笈,從苦的地方趣樂的地方,有這樣一個大全的武功秘笈?所以我們真的是遇到寶了!為什麼這個寶藏會落入到你的家門呢?會落入到你的心中呢?我們是有福報的人嗎?如果有福報的人,就不要忘了繼續積福啊!繼續好好地珍惜現有的一切。不要因為自己的非理作意、自己的妄念等等,就無視這樣的因緣,或者慢慢就麻木了,認為這一切都是好像永遠不會消失,一切就是這麼自然的。不是的!這是往昔我們費了很多勤苦的修行才換來的結果,也是我們的善知識不知道用了多少生的努力,才把我們喚回到覺醒能夠持戒,然後得到這樣的人身修行啊!所以千萬不要對此生能夠具足聽聞《廣論》的善根自己不珍惜呀!自己覺得無所謂,甚至讓它付諸東流,這些就太可惜了! [05′51″]</p>
<p>   所以希望大家能夠將宗大師的叮嚀、佛陀的叮嚀放在心上,想一想:是不是離苦得樂的法《廣論》裡都有?那麼當我感到痛苦的時候,我是到這裡面去找快樂的辦法嗎?去替掉我那些根本不清淨的,甚至是背道而馳地尋找快樂的方法,我們能不能有這樣的信任? [06′20″]</p>
<p>   在這一小段裡,我們可以捫心自問——在每一個清晨、每一個夜晚、每一次對境的時候,可以捫心自問無數遍! [06′33″] 
<p>   大家好!又到了我們研討《廣論》的時間了。在每次研討之前,希望我們能夠好好地調整自己的動機,因為我很多的善知識都非常非常強調發心及迴向。如果我們所造作的業沒有一個正確的發心引導,比如說如果是以希求此世安樂的心來聽聞的話,未必是一個清淨的正法。所以我們動機每次都要調整。 [00′38″]</p>
<p>   我常常在研討《廣論》之前自己調整一下,也請大家調整一下,不知道你們會不會聽煩了?但是有的時候我想:就這樣很短的時間,大家跟著我調整一下,是否能夠真實地策動起趣向於大乘的發心呢?哪怕是相似的,所以我有的時候想把調整動機的時間拉長。但是要追進度,所以就會變短。今天因為〈皈敬頌〉講完了,開始要進入《廣論》的正文的部分,所以希望我們能夠認真地策動我們來聽聞、學習《廣論》的動機。 [01′26″]</p>
<p>   有一位大善知識開示聽法前的動機,我每次看了都很感動,所以在這裡跟大家一起學習一下。在《入行論.第一品菩提心利益品》中,第四偈提到:「<p> 暇滿人身極難得,既得能辦人身利,倘若今生利未辦,後世怎得此圓滿?<p> 」說在今生我們有機會能夠獲得八種閒暇以及十種圓滿的人身,這樣的人身是相當難得的;不僅難得,而且它這個暇滿人身能夠成辦我們很多有意義的事情。 [02′10″]</p>
<p>   在偈頌的第二句話:「<p> 既得能辦人身利<p> 」當中的「利」,最主要的是指士夫的利益。所謂「士夫」,以廣義的方式來說的話,就是一切的補特伽羅都能夠稱為「士夫」。在梵文當中,「士夫」這個詞所代表的意思是具有能力、有作用,稱之為「士夫」。比方說補特伽羅,他們不管身體或是心靈,在面對外境的同時,都會有種種的感受,他是有某種反應的能力,所以我們稱一切的補特伽羅為「士夫」,這是廣義的士夫意思。 [02′49″]</p>
<p>   但是在《入行論》中特別提到的士夫的利益,這當中的士夫,並不是以今生的安樂為主的士夫,也就是他跟一般的是不同的。這當中的士夫他的眼光必須要放得長遠,他所希求的一定是來生的利益,所以他的出發點也是以希求後世安樂為主的,這樣才稱為「士夫」。 [03′15″]</p>
<p>   如果我們現在做一切事情,所緣的都是為今生的安樂打算的話,貪著此生的樂而行善,其實所造作的善業不能夠成為真正的正法。更進一步,如果我們想要將所造的善業提升為正法,這時候我們的眼光真的要放得長遠,就是不要以今生的安樂為希願,要以後世的安樂為我們的希願,就是以來生為主。以來世為主的話,比如從早晨開始我們就可以觀察:我吃飯的時候只不過是為了解決現在的饑餓罷了,我是為希求來世的安樂而用餐的嗎?乃至衣、食、住、行所做的一切,甚至是聞法,到底希求後世安樂這個念頭,會不會在我們的心裡邊現行呢?我們到底是著重在此世的安樂,還是後世的安樂呢?每天觀察自己就一定會見分曉的,非常清楚! [04′29″]</p>
<p>   如果是以希求後世安樂為前提的話,那後世的安樂包括什麼呢?簡單就說「現前」以及「究竟」兩個部分。現前是什麼?我們在輪迴之中獲得人天道——人天的果位啊!就是指人天的增上生果。如果沒有人天的增上生果,我們想修學佛法是很困難、不太可能的事情。但是在獲得了人天增上生的果位之後,更進一步我們要成辦的究竟利益,也就是解脫、一切智,以及一切遍智。 [05′04″]</p>
<p>   我們現在所獲得的這個暇滿人身,它最大的利益是能夠成辦現前增上生,以及究竟決定勝種種利益。所以我們現在所獲得的人身,是否在今生當中能夠成辦種種利益?最殊勝的,當然就希望得到人身的時候成就佛果;退而求其次的話,沒有成辦佛果,也希望能夠希求一己的解脫;如果沒有辦法獲得一己的解脫,也希望來生能夠不墮惡趣,或者不墮在非閒暇處。這是我們現在憑藉這個暇滿人身可以拿到的利益。 [05′52″]</p>
<p>   我很想知道現在大家在想什麼?比如說每天出門的時候都要照鏡子,照鏡子的時候就照到自己。我們照鏡子的時候,是看看自己的衣服或者臉有沒有洗乾淨,但是我們就會照到一個人啊!說:「那個人就是我自己。」在照鏡子看到一個人身一個人的形狀的時候,會不會憶念到暇滿人身的利益呢?當我們照鏡子看自己的時候,是只看美醜、衣裝整不整潔,還是會看到這是一個暇身啊?雖然十圓滿未必都具足,但是一定還是有閒暇聽聞佛法,還是有信、有很多條件的。所以會不會對我們經過了持戒和很多修行得到的人身,內心裡很珍惜呢?因為如果我只看形貌的話,是不是就辜負了這個暇滿它能帶給我們的巨大的利益、難以想像的利益?祖師、佛菩薩在教典裡都諄諄教誨我們,是可以透過這個暇滿人身拿到增上生乃至決定勝的。最下的來世不墮落惡趣,就是《菩提道次第廣論》會給我們的下士夫的利益,或者是共下士道的利益。 [07′23″]
<p>   過去很多上師有提到:獲得了增上生,尤其是獲得暇滿人身之後,我們必須要能夠生生增上。就是這一生得到了這個暇滿人身,不夠的!還要一生比一生增上,希望一生比一生更進步。由於這樣的方式,讓我們能夠徹底地脫離輪迴的痛苦,獲得解脫,乃至究竟地成辦一切智智的圓滿佛果。所以,如果我們沒有辦法生生增上,縱使在今生能夠得到這樣的暇滿人身,但實際上到底能具有多大的意義呢?因此,在偈頌的最後兩句話有特別地強調:「倘若今生利未辦,後世怎得此圓滿?」如果在獲得人身的同時,種種的利益無法去成辦的話,而在將來想要再一次獲得暇滿人身,《入行論》的原話是什麼?「後世怎得此圓滿?」得不到的意思,對不對?至少說這是不太可能的一件事。注意哦!注意!寂天菩薩講這句話的重量啊!如果沒有辦法增上、沒有得到利益的話,想要再一次獲得這樣的人身是不太可能的事,後世怎得此暇滿? [01′31″]</p>
<p>   所以在照鏡子的時候、在想自己的時候,我們要想到:今生我雖然獲得了能夠修學佛法的人身,遇到了善知識,遇到了宗大師清淨圓滿的教法,還有這麼多的善友在周圍,但我所獲得的人身,有沒有辦法長久地安住在世間呢?或者說有沒有辦法不死呢?一定要去思惟念死的這個內涵。 [02′07″]</p>
<p>   人活在世上都不願意去想死亡,想死亡我們會悶悶不樂,感到悲哀、恐懼。那麼為什麼在《廣論》裡還要念死呢?因為當我們念死之後,沒錯,會產生痛苦、產生怖畏,但是同時我們也會有一種力量產生,就是我如何擺脫這種痛苦呢?它會有一種推動的能力。 [02′37″]</p>
<p>   想到如何擺脫這種生死痛苦的時候,我們自然就會想:誰能幫我擺脫生死的痛苦?眼前的這些,靠人際關係、靠美食、靠衣服、靠房子、靠車,甚至靠自己的容貌,都不能讓我們擺脫生死的痛苦。唯有什麼?修學正法,跟著佛陀修學正法,才能夠對治生死痛苦。 [03′17″]</p>
<p>   在活著的時候很多人不願意去想死亡,絕大部分沒有念死無常,對不對?但實際上如果認真地去想一想,我們都知道有一天一定會死的!那麼在什麼樣的情況下、在什麼樣的時間點,這是我們沒辦法預測的,像有的時候身體非常健康的一個人,很快地他就不見了。所以年齡大的、年齡中等的和年齡小的,誰先走也是不一定的。 [03′56″]</p>
<p>   我們在死的當下,除了所學的正法以外,周遭的一切到底對我們會不會有很大的幫助呢?我們就想一想:到死的時候什麼能幫助我們?親友當然可以幫我們在之前照顧身體,但是我們心念的部分,什麼東西能夠帶往來世?一定是正法,對不對?所以進一步要修學正法。相反地,如果沒有辦法念死,這一天早晨我們不念死,所追求的一切都是以今生的安樂為主的話,我們的所作所為都沒有辦法稱之為修行正法吧? [04′42″]</p>
<p>   所以必須透過念死,讓我們知道此生得到了這個暇滿人身,實際上它是有一個盡頭。死之後,不是一切都停止了,我們化為微塵,甚至成為沒有;我們的心續還會繼續向前。心續繼續剎那剎那向前流動的時候有滾動的業力,在這個業力剎那剎那成熟的時候,我們最怕的是帶惡業到後世,最高興的是帶善業到後世,因為會快樂啊!那麼能夠鞭策我們的內心、警醒我們的三業時時刻刻要造善業的,就是唯有修學正法、持戒!對不對?所以雖然念死法門像凜冽的飲料一樣,喝了之後會覺得很冰,但是會頭腦清醒,會讓我們能夠明辨取捨,至少對這一天的生活、這一天的人生,我應該捨什麼、取什麼,不會陷入深度迷亂,甚至會極度清晰和準確地選出對來生有益的那件事要最先完成。 [06′06″]
<p>   以前在討論到念死的時候,記得有一個廣論班的同學說:「啊!既然大家都會死,現在活著好像都沒什麼意思了!天天想死亡的話,那該多憂愁呀!」你們也有這種感覺吧?覺得心裡像壓了一塊石頭一樣。但這是念死嗎?這不是《廣論》上所說的念死吧!這是想到此生會死的時候,心裡跌入的一種迷悶、憂愁吧!那麼《廣論》上讓我們念死,到底是為什麼?是要我們在內心中產生去行持正法的一股力量,去對治苦的一種力量,而不是想到死亡之後,自己心就跌在那種黑暗黑暗的孤獨憂傷中,然後感到絕望。不是這種東西。 [00′58″]</p>
<p>   所以念死法門,是讓我們感覺到這個人身的珍貴和易失。那麼想到死之後接著要想什麼?要想業。想業的話,你就得想到善業和惡業兩股,對不對?那麼想善業和惡業,想誰呢?一定要想自己,想我們的心續當中有許多善業。有吧?我們很多人都覺得自己還滿善良的,對吧?那請問:善良的人心中有沒有許多的惡業呢?自己問自己哦!不要去問別人:「你有很多惡業嗎?」問自己:那我心中有沒有很多惡業呢? [01′40″]</p>
<p>   那麼在善惡業兩者的相較之下,請問:我自己可以分判出我心續裡的善業是多的,還是惡業是多的呢?因為我們沒辦法把往昔劫所造的業,像拿一個秤把它秤量一下,我們拿不出來,都忘記了!沒辦法!但是大善知識們都這樣告誡我們,說:「善惡兩者的業力相較的話,惡業它的數量是遠超過善業的;不僅數量超過善業,而且它的力量也遠大於善業。」所以我們的心續中雖然有善,但是不管從數量的角度,還是力量的角度,它都沒有辦法跟惡業相比較。 [02′38″]</p>
<p>   注意!如果看到這種狀況還保持現狀的話,那接著又想到念死了。等到死亡到來的那一天,因為惡業的數量又多、力量又大,那除了惡趣之外,我們沒有另外一個地方可以去,對不對?一定會推出這樣的!並且由於我們沒有辦法透過這一生所獲得的人身——注意下面我說的幾個字——如實、真實地修學正法,這些能夠真正幫助我們淨化惡業、培植善業的法,我們如果沒有認真修的話,請問在臨命終的時候,怎麼會出現強大緣念正法的力量,或者強大的善業的力量?所以是很危險的! [03′36″]</p>
<p>   所以念死的時候,不是想到死就跌入那種痛苦,而是要往後想。死的時候什麼是最必要、最需要的?就是正法!也就是善業。那就觀察一下有多少善業、有多少惡業?如果惡業的力量徹底地大於了善業的力量的話,那就只有一個地方去——就墮入惡趣了!一旦墮入惡趣,就不是今生的這些愛別離苦、怨憎會苦,或者人生慘痛的遭遇所能比擬的惡趣苦!我們沒法想像地獄道的苦吧?想都想不出來,因為完全是不現前的。 [04′20″]</p>
<p>   餓鬼的苦,也是想不出來的。但是我們修過斷食的人,比如說有人是修水斷,就是只喝水;還有我們修法的話,兩天吃一餐,有的人飢渴到外面下雨的時候都想把嘴張開!但是不能那樣張開,張開你就喝水了,所以要克制。然後有的人假裝在雨裡走過,讓雨淋一淋自己,嘴也不張開,因為那時候全身已經燃燒得像一個火炭一樣,饑餓!還有的人餓一兩天之後就產生種種幻覺,還有的人可能想去捶牆等等。就餓一兩天哦!而且你還是非常清楚是為了修法、為了持戒。所以我們無法想像餓鬼道的生存狀態到底是慘成什麼樣子! [05′12″]
<p>   我們仔細地看一看畜生道的苦,比如說生為一條狗,或者一隻螃蟹,或者生為牛,這輩子只吃草,還要被殺,有地方去投訴嗎?有誰為牛打官司?當然是有一些動物愛好者,還有一些善心人士放生啊!像我們就放生牛,但是還是有那麼多的牛被殺呀!還有那些剛出生的小羊,誰覺得牠們也是羊媽媽的嬰兒?像人類一個嬰兒出生了,大家都去祝賀呀!然後會給他好吃、好喝的,想將來給他怎麼養大、上什麼學?一隻羊的羊羔出生了之後,有的就直接送進屠宰場了!為什麼?因為牠的小羊皮非常地柔軟,有些人是不在乎那是一隻羊的嬰兒!所以一旦進入到那種狀況,剛出生可能就被殺,或者你正少年就被殺,你是沒法講清楚的,不會說話就只會鳴叫,有的時候叫也叫不出來!所以很難想像在那樣的惡趣活一天,一旦進入惡道,沒有尊嚴、沒有語言,有誰同情我們的命運嗎? [01′28″]</p>
<p>   比如說有一次,我在哪個城市我忘記了,看到一頭小毛驢,牠被一個男孩趕著,牠拉了一個車,車上放了一堆鋼管,應該是很重吧!那個繩子好像不是一個麻繩,我不知道是一個什麼樣的繩子,把牠的後背勒出了非常深的一道傷痕,牠露出的肉是粉的唷!那個繩子還在上面。路過的時候因為我走得特別快,我當時很想把那頭驢買下來,但是也沒處放。後來我就跟那個男孩說:「這個繩子弄在牠身上,多疼啊!」我就把我的手帕拿出來說:「你可不可以給那個驢墊著?或者你給牠治傷,或者放一個皮在下面。」我說:「這頭驢是很痛的!」我後來也就只能這樣子,然後就會好幾天心情不好。但是光心情不好有什麼用?要不去淨化惡趣的因,我的來生可能還不如一頭小毛驢那樣的處境呢! [02′32″]</p>
<p>   所以想一想,真正墮入惡趣我們是無法忍受的!現在還沒有說地獄道的苦、餓鬼道的苦,只是畜生道的苦就是無法忍受的。地獄道的苦到底比畜生道的苦大多少倍,能算出來嗎?那強烈的程度!苦的意思就是它強烈的程度、刺激身心的程度,是無法想像的!所以這個時候我們去思惟三惡趣苦的話,大家就會覺得非常緊張,內心也會生起恐懼,會感覺到不快樂。但是這樣的思考會讓我們覺得:來生我絕對不要投生在這樣一個惡劣的環境,因為有很難想像的痛苦。所以,我怎樣才能不投進這樣的惡趣呢?有誰能成為我的皈依和救處呢?那麼我們就要生起正念而皈依三寶,這就是皈依三寶的一個因——怖畏惡趣。注意!惡趣前面有兩個字叫「怖畏」。誰的心怖畏?是我們的心怖畏。我們的心為什麼而生起怖畏了?就是念死啊! [03′41″]</p>
<p>   所以當我們念死的時候,一定要跨越過那種憂悲苦惱的愛別離。有的人一念死就陷入愛別離苦了——哎呀!跟誰要分開啦!就開始痛苦。實際上善知識讓我們生起的是——要注意到業!要想怎麼樣去解決墮落惡趣的這個苦。所以我們要拉著我們的心,沿著祖師、佛菩薩許給我們的那個理路的路徑走過去,而不要沿著自己思惟的那一條小路。那個是除了愛別離苦、除了恐怖,我們也得不到什麼——絕望!但是皈依三寶,由於怖畏惡趣,注意!它不是用害怕,是怖畏,深深地恐懼——由於怖畏惡趣而相信三寶能救、皈依三寶。 [04′25″]</p>
<p>   在皈依三寶之後,應該怎麼樣救拔惡趣呢?就是要學習皈依的學處。那麼在皈依三寶當中,佛是我們皈依的導師,法是我們的正皈依,而僧是我們修學正法的助伴。所以在皈依的同時,我們必須從內心深處非常虔誠地皈依三寶,因為我們知道唯有三寶才能夠救我們。救我們什麼呀?墮落惡趣的這種怖畏。有沒有發現《菩提道次第》讓我們思考的角度,有的時候是讓我們的心裡產生一種極度的恐懼?然後這種極度的恐懼讓我們就去找辦法擺脫這種恐懼,然後就去尋找皈依呀!那麼天上、地下去尋找的話,能讓我們不墮落的法,能幫我們不墮落的導師——就是佛陀!所以要用這樣的心去皈依三寶。 [05′33″]
<p>   從我們的心續來看,僅僅生起皈依三寶的這樣的念頭,說:「我要皈依三寶!」這樣還是不夠的;在皈依三寶之後,我們還應該做些什麼呢?必須要如實地修學業果的道理。盡可能地行善、斷惡。如果我們能夠努力地行善、斷惡的話,來生才有可能獲得增上生的機會。為什麼?因為心續裡惡太多了,對不對?你要用很大的力量去造善業。 [00′40″]</p>
<p>   上述講的就是以下士道的角度,來調整我們聞法的動機。總攝來說,一開始我們一定要思惟念死無常;透過思惟念死無常想到此生不能久住,而且生命不是斷滅的,它是無限的生命,所以一定會有來生。那麼來生決定我得一個什麼樣的身體的決定因素,到底是什麼?是善業和惡業,對不對?決定去惡趣的就是惡業。如果不想要墮落惡趣受苦,我們就必須要提起皈依三寶的正念。而且在皈依三寶之後,內心要生起強烈的定解——我要按照三寶所告誡我的方式,如實地去修行。 [01′41″]</p>
<p>   什麼叫如實地修行呢?有人說:「你修行這麼多年,你有神通嗎?你沒有神通的話,你就沒有修行。」是這樣嗎?還有人說:「你有見到什麼嗎?」有人是這樣看有沒有修行的。但是真實開始修行是什麼?對於過去所造的惡業心生懺悔!因為修行是要救拔惡趣的,救拔我們來世墮落惡趣苦的這種修行哦!所以對過去所造的惡業心生懺悔——這是對過去的;對於將來三門有可能造作的惡行,內心當中要生起什麼?那兩個字——防護。這是對惡業,對不對?對過去已經造的一定要去懺悔,讓它不要感果!就像種一個什麼東西,我們中間要去干涉它,讓它不要結出果實。所以不知道諸位有沒有常常地憶念三十五佛,或者禮拜三十五佛懺悔? [02′44″]</p>
<p>   那麼對於將來三門有可能造作的惡行,內心怎麼樣能夠生起防護呢?這個其實還是要念死的。因為不念死的話,我們就會覺得:我本善良!在很多人中都是善人,我心中怎麼會有很多惡行,會造作很多惡業呢?我們會對於惡業的觀察太過粗糙,無法判別自己可能像牛毛、像雨絲那樣細的惡業的念頭,或者還有一種等起等等。這個要不是念死、不是怖畏惡趣的話,我們無法提起強猛的心力防護自己,就會心處在一種浮浮泛泛的狀態,像師父說的。為什麼那樣聽法會墮落惡趣?今天也有一個理由,對不對?因為聽法就是要截斷那個惡趣的,但是如果浮浮泛泛,根本提不起強猛的心力和正念來對治的話,那惡業的續流是遮擋不了的。 [03′49″]</p>
<p>   所以早晨聽聞正法,一天頭腦都相對清醒很多。在貪瞋痴的境界面前,我們就會止足,知道此處危險,不可以再往前跨越;一旦跨越,就會造作像掉進深淵那樣的惡業,所以會對我們的內心有相當的防護力。 [04′12″]</p>
<p>   如果我們能這樣努力地去對過去的惡業進行猛利地懺悔,對將來要造作的惡業進行防護的話,我們是不是來生有機會再一次獲得增上生呢?絕對是有機會的!為什麼?因為我們得到這個暇滿人身,它能得到的最下的利益就是來世不墮落惡趣。我們遇到善知識了、遇到正法了,那麼還差什麼?就差我斷惡修善的力量。如果我這個力量跟上,那麼這個暇滿人身直接給我的一個非常大的助力,就是我完全可以截斷三惡趣,我不墮落三惡趣!這就是作為人、得到這個暇滿人身,我們能夠得到的最初的利益。 [04′56″]</p>
<p>   想一想,我們常常會因為人際關係、因為錢、因為什麼什麼,開始心情非常非常不好,覺得非常非常地沮喪、非常非常地失敗。那個時候是不是也沒有想起暇滿義大呀?儘管說這一生我好像很多事情都不成功,但是我成功地得到了暇滿人身,對吧!成功地值遇了宗大師教法,也成功對三寶生起了信心。就算人際關係不好,或者事業失敗,或者身體有病了,或者遇到親人離開了。但是我能夠截斷三惡趣的這種機會有沒有因為這些失去呢?是沒有的!能感覺到我們得到這樣一個人身,它所擁有的強大的力量嗎?這個力量足以阻斷三惡趣哦!如果我們好好修行的話。 [05′55″]</p>
<p>   那這到底是一個什麼寶物啊?你在世間可不可以找到一個寶物,拿到這個寶物之後就可以不墮落三惡趣?那個寶物在哪裡呢?不是說萬兩黃金、不是說多少豪宅,而就是什麼?暇滿人身它所具有的能力。而這個能力就是我們現在具有的,如果我們不用它,不把這個能力發揮到阻斷惡趣的這個最關鍵的幸福上,讓它白白地消失,有什麼事比這更愚蠢、更瘋狂嗎?我們常常覺得:我是瘋子!我說了什麼話、我做了什麼事......,但是在可以截斷惡趣的機會面前,我們卻如聾如盲,把大把的機會都流失掉,好像覺得人生沒有意義,一點也不珍惜這個人身,當一些現實的安樂遭到阻撓之後,我們就陷入憂悲苦惱,然後一蹶不振。想一想:即使現世很不順,我們依然能夠為來世阻斷惡趣,這個人身會發揮極大的效用,所以它真的是個寶! [07′06″]</p>
<p>   照鏡子的時候能想到人身寶嗎?能想到這個鏡子裡的人,我看他有時候生氣、有時候沮喪、有時候覺得驕傲等等,各種複雜的想法雲集起來的這個暇滿人身的隨順人身,可以具有阻斷惡趣的力量!想一想會不會欣喜若狂呢?會不會在地上跳起來呢?你會不會兩眼發光呢?你會不會覺得人生希望無窮?我居然手中攥有阻斷惡趣的力量,真的、假的?不管我此生多麼失敗,我還是擁有這種機會!我活著一天努力修行,比如說念一句三十五佛、念一句佛名,就可以淨化那麼多的惡業。這個心、這個人身到底具有怎樣非凡的力量,可以為我的來生創造無窮無盡的幸福,我們有探索清楚嗎?我們對此有好奇嗎?我們對此有熱忱嗎?我們對此有真誠嗎?我們對此有毅力嗎? [08′09″]</p>
<p>   想一想,這是何等振奮人心的消息,就在經典裡佛陀會一再地提醒我們,善知識會一再地提醒我們:我們手中握有這樣的良機,如果用心成辦的話,完全可以阻斷地獄道、餓鬼道、畜生道的苦,這個機會就在掌中!就在你、我的手中!就在每天流逝的這些憂悲苦惱、芝麻綠豆的煩惱,把我們自己攪得天翻地覆、烏煙瘴氣的這種當中哦!就埋藏著這樣的機會。 [08′46″]
<p>   每次當我們照鏡子的時候,都比較關注今天有沒有整潔、有沒有莊嚴,好像並不在意來世是一張什麼樣的臉。如果發生希求後世之心的話,每次照鏡子的時候要想一想:來生我長什麼樣的臉?進一步再作思惟的話,如果只是投生在善趣,這樣是不是就足夠了呢?其實還是不足夠。為什麼?因為現在我們就在善趣呀!我們現今的狀況就是在善趣,而且獲得了暇滿的人身,在獲得了人身的同時,能夠值遇到善知識還有佛陀的教法。雖然這一生我們投生在善趣,能夠暫時地脫離了惡趣的痛苦,但現今我們還是要面對輪迴當中的生、老、病、死種種痛苦。還有更可怕的,如果今生沒有好好修學的話,遇到惡緣,來生我們還必須要墮入惡趣。所以現今暫時獲得的人身,沒有辦法保證來生不墮落惡趣。 [01′20″]</p>
<p>   所以當我們發生希求後世之心之後,我們想希求來世得一個人身,還是就像現在一樣,我們前世可能就發心了,然後得到這樣一個人身寶,但這個人身寶並不能保證我們後世不墮落惡趣,而且也不能得到這個寶的同時就斷除了生老病死,還沒有啊!所以要更想辦法去達到一個把生老病死都去除的狀態,把那種所有的不安全都去掉的狀態,我們才會覺得如釋重負啊! [01′56″]</p>
<p>   所以我們想要提升,必須費盡所有的心力才有辦法提升,對吧?我們現在的狀況。但是如果想要墮落的話,只要一瞬間就能夠墮落了。就像爬絕壁,向上爬一點點都很困難,但是你只要一鬆手,就可以跌入萬丈深淵了。所以在今生修學佛法的同時,如果我們遇到的是惡知識或惡友,在他們的帶領下想要墮落實在並不是太困難的一件事情。所以我們目前的現狀,只是讓我們暫時地跳脫了惡趣的痛苦,得到些許的什麼呀?喘息空間啊!就是喘口氣。像在一股急流之中,你突然到了一個急流中的沙地,站在那沙子上喘口氣。但實際上我們目前的現狀危不危險啊?還是很危險的!因為不小心、不努力,就會再次地墮落。 [03′07″]</p>
<p>   那麼進一步我們還得去探索:是否能夠透過修學佛法的內涵,讓我們脫離業以及煩惱束縛的這種狀態呢?那業以及煩惱束縛的狀態是什麼?就是輪迴呀!那麼到底什麼樣的方式,能夠讓我們擺脫生老病死充滿的輪迴世界呢?就是快樂也不能快樂多久就消失了,痛苦是那麼地長,不管得到什麼樣的殊勝的所依身,最終都會被生老病死所摧毀。什麼方式才能夠脫離輪迴?就必須要去思考:輪迴是由什麼因成辦的?這輪迴的苦是有因的,然後去找到那個因。那麼這個因可不可以滅除?如果這個因可以滅除的話,用什麼方式滅除?修道啊!用修道滅除這個苦因,輪迴就滅除了,所以一定要修學戒定慧三學。 [04′16″]</p>
<p>   那麼當我們開始修行戒定慧三學的時候,有一個部分是與聲聞、緣覺共通的,這也是我們所謂的中士道的調心方式。透過中士道的調心方式,能夠讓小乘的行者——不管是聲聞或者緣覺——獲得阿羅漢的果位,斷除輪迴當中的生老病死種種痛苦。注意!在這裡邊就出現了大、小乘怎麼樣地去擺脫生老病死。 [04′47″]</p>
<p>   所以我們不應該以現前獲得增上生的果位為滿足,我們應該更進一步地了解到:獲得解脫對我而言才是比較踏實的、究竟的快樂,所以我們必須要全心全意地以全部的熱情,來修學戒定慧三學的內涵。我們發起修學戒定慧三學的內涵,就要像你發狂想要賺錢,你發狂想擁有什麼東西那樣的一個熱情,因為它們才能斷除生老病死這些痛苦。 [05′28″]
<p>   剛才講到我們想要對這個輪迴斷除的話,就要生起厭離輪迴的心;生起厭離輪迴的心進而想修學戒定慧三學,就是一個出離心。那想一想:我們二六時中所造作的很多很多的——就只說善業吧,有沒有被出離的這個意樂所攝持呢?還是充滿了八風的擾動?自己可以觀察一下。但是這樣的一個出離,是可以透過這樣的思惟策勵出來的。 [00′34″]</p>
<p>   所以依著道次第生起了中士道的法類,依著道次第生起戒定慧的功德之後,如果我們能夠再現證無我的內涵,透過現證無我在心中生起見道的功德,並且透過不斷地修學以及串習,最後斷除煩惱障,接著什麼?就獲得解脫了!對不對?但是這是不是最究竟的目標呢?為什麼並不是最究竟的目標呢?這不是最究竟的目標嗎?解脫生老病死。 [01′10″]</p>
<p>   雖然能夠透過中士道的法類獲得阿羅漢的果位,安住在一個寂靜的狀態之中。請問寂靜的狀態是什麼狀態呢?是完全斷除了煩惱,能夠享受究竟快樂的一種狀態嗎?雖然小乘的阿羅漢們能夠安住在寂靜的狀態當中,但是他們有沒有斷除一切的所斷呢?沒有!如果沒有辦法斷除一切的所斷,就沒有辦法成辦一切的利他。為什麼?因為在所斷當中,簡單地可以分為煩惱障以及所知障。小乘的阿羅漢們雖然能夠斷除煩惱障,但沒有辦法斷除所知障,所以他並沒有辦法了解世間當中的一切所知。所以以自利的角度而言,自利有沒有圓滿?沒有!因為沒有了知一切所知啊!而且所知障沒有全斷啊!在自利沒有圓滿,而又沒有辦法了知一切所知的情況下,能有辦法圓滿利他嗎?也是沒有辦法的!所以我們最初追求寂滅生老病死的痛苦,想要自利達到一個非常圓滿的狀態,也是沒有實現的。 [02′34″]</p>
<p>   這一點從過去七代付法藏師的公案當中,我們就可以了解到小乘的阿羅漢們雖然能夠利他,但是利他的層面是沒有辦法跟大乘的菩薩相比,跟佛更沒有辦法相比!但是跟我們一般凡夫來比較的話,那已經是天壤之別了!過去佛陀的弟子,七代付法藏師中,有一位大羅漢近隱尊者,也就是優婆毱多,或優婆毱提。尊者成道之後度化眾生,當有一個人獲得了四果,尊者就放一根四吋長的籌木,最後這樣的籌木堆滿了高六丈、長寬各六丈的一間房間。不知道有多少弟子都證了阿羅漢果,是非常了不起的! [03′30″]</p>
<p>   提到了近隱尊者這位阿羅漢的時候,在過去曾經有過這樣一個公案:因為他獲得了阿羅漢道,具足了三明、六通,言辭非常地巧妙,能演說無盡的法要,所以集合眾人想為他們說法。那個時候魔王波旬知道了,開始想要來破壞說法的會場。破壞的方式就是來會場撒錢,一看錢灑下來了,大家就會去撿錢,因此就不聽法。第二天,又集合大眾說法的時候,魔王波旬又想辦法來搗亂了——今天不撒錢,來撒下花鬘擾亂眾生。所以想一想,喜歡花的,如果魔王來撒花的話,是不是就不能專心聽法了? [04′35″]</p>
<p>   第三天,又集合大眾說法的時候,魔王變成一頭紺琉璃色的六牙大象,一個象牙上具有七座浴池,每座池中就會有七朵蓮花,蓮花上有七位玉女,每個玉女都演奏著音樂。然後那頭大象悠遊步行在會場的周圍,引著大家左顧右盼,根本沒有辦法專心聽法。現在已經是連著三天了都沒辦法專心。 [05′11″]</p>
<p>   第四天,又集合大眾說法的時候,魔王又變成一個女人,端正美妙,就站在尊者的後面。大眾一看尊者就看到這個女人,都注視著那個女人忘了聽法。這個時候,尊者就把那個女人變成了白骨,大眾見到了這種狀況才專心聽法,然後也有很多人得道。 [05′44″]</p>
<p>   這位阿羅漢原本有一條狗,尊者每天都在牠耳邊為牠說法——看來是一條非常非常有福報的狗。那條狗命終之後,就投生在欲界的第六重天——他化自在天,和魔王波旬坐在同一個座位上。魔王就想:這個天人一定是很有德行才能與我同等,他到底是從哪兒投生到此處呢?然後他就開始觀察。經過觀察,哇!才知道他前世是一條狗。然後魔王心想:這個沙門竟然如此地侮辱我!所以這個時候魔王就又想主意了,等到這位阿羅漢入定的時候,他就拿了一頂寶冠戴在尊者頭上。尊者出定後感覺頭頂有寶冠,經過觀察之後知道是魔王所做,就施展了神力把魔王召喚來,然後就對魔王說:「你贈我寶冠,我深表謝意,我現在就以莊嚴的飾品回贈你!」就把一條花鬘戴在了魔王的頸部! [07′11″]</p>
<p>   魔王接受之後就回到天上,回到天上之後發現:哇!所佩戴的莊嚴裝飾變成了一條死狗!大家知道那個死狗是哪來的吧?就是阿羅漢把那個狗的狗屍變成了一個莊嚴的飾品,在魔王來前把它變了,然後就送給魔王了。 [07′37″]</p>
<p>   魔王剛戴上的時候覺得是莊嚴的飾品,回到天上之後,突然脖子上掛一個狗屍,心中非常地厭惡,他就用盡他所有的神力,想要把這個狗屍拿下來。怎麼也拿不下來!於是只好請求帝釋天幫忙,帝釋天看了看,說:「只有給你的人才能拿下來,這不是我的能力所及的!」然後魔王又趕快去求諸天哪,一個一個天去求,最後一直求到梵天,請求他們幫忙把這個狗屍從脖子上拿下來。可是每一天的天王都同樣地答覆,說:「這不是我的能力所能及的!」 [08′24″]</p>
<p>   這下魔王就無計可施了,想一想:總不能帶著一個狗屍這樣天天在天上飛來飛去吧!然後覺得還得來求阿羅漢吧!所以魔王最後就來請求尊者,說:「佛陀真的是至德無上、慈心無邊,聲聞卻真的很兇殘!怎麼證明呢?我過去曾經領十八億的魔軍圍攻菩薩,想要敗壞他的道行,但菩薩仍然心懷慈悲,都不記恨我。我今天才稍微觸犯你一下,你就把我為難成這個樣子!」然後尊者就回答他說:「道理確實如此!佛陀高出我百千萬倍,無法比喻,就像須彌山與芥子相比,又像大海與牛跡之水相比,又像獅子王和狐狸相比,他們的大小確實是無法相比的!」 [09′25″]</p>
<p>   然後尊者就對魔王說:「我出生在末世,不能見到如來。聽說你的神力能變現佛身,現在你試著變現,我想看看。」魔王答道:「我現在化現,但您千萬不要作禮!」尊者說:「我不禮拜。」魔王就化作了佛身——身體一丈六尺,紫磨金色,具足三十二相、八十隨形好,璀璨奪目,超過日月。尊者非常歡喜,便向前禮拜。一拜之下,魔王立刻恢復原形,對尊者說:「剛才您說過不作禮,為何現在又作禮?」尊者說:「我是禮佛,不是頂禮你!」然後魔王請求說:「希望尊者能夠悲憫我,幫我拿下這具狗屍吧!」 [10′30″]</p>
<p>   大家想想阿羅漢會說什麼呢?尊者說:「你如果發起慈心保護眾生,這具狗屍就會變成寶飾;如果心懷惡念,就會再度變成狗屍!」大家想一想,從此這個魔王就像戴一個緊箍咒一樣吧!所以,他由於天天害怕他脖子上掛一個狗屍,就一直心懷善念。這就是那位非常了不起的大阿羅漢調伏魔王的故事。 [11′07″]</p>
<p>   想一想有一些剛強難調的,好像得用這種辦法調——給他戴個什麼東西,讓他不敢生惡念。不知道以後高科技會不會發明一種東西——一生惡念,然後那個東西就大聲地叫,說:「你生惡念了,你是壞蛋!」如果生善念的話,它就會變成一個很璀璨的裝飾?但是科技永遠都比不上真修實證的功德,所以大家還是好好努力地心懷善念吧!不知道你們聽了之後,會不會也想被戴個什麼東西?還是你們不敢? [11′46″]
<p>   從前面那個公案中,我們可以知道小乘的阿羅漢能夠行廣大的利生事業,但是由於沒有辦法斷除所知障、沒有辦法了知一切的所知,因此他利眾的程度跟佛是沒有辦法相比的。不要說是小乘的阿羅漢,就連十地的菩薩利益眾生的程度跟佛也都是沒辦法相提並論的。所以在經論當中,時常用大海以及水滴的譬喻來譬喻佛利眾生的程度就像大海一樣,而十地菩薩以下的菩薩,甚至是最後的聲聞、緣覺阿羅漢們,他們利眾的程度就如同水滴般,跟佛是沒有辦法比的。 [00′54″]</p>
<p>   所以我們必須要了解:如果我們透過人身修學中士道的法,然後獲得了解脫,這到底是不是究竟的解脫呢?這是不究竟、不圓滿的。因為縱使能夠獲得解脫,得到阿羅漢的果位,而實際上到最後我們還是必須要進入大乘的法脈裡邊。如果我們在開始學《廣論》的時候,就了解到這一點的重要性,那真是一件非常、非常幸運的事情! [01′26″]</p>
<p>   我們很多人在修學佛法的時候,可能會覺得三惡趣的苦或者輪迴的苦真的是我們很難接受的、很難忍受的,所以我們要想盡千方百計跳脫惡趣以及輪迴的痛苦,獲得一己的解脫。因為了知了惡趣的苦,而且生生相繼、生命不死,這個相續不可能斷掉,所以就會有三世因果;我們心續裡沒有成熟的那些惡因,會在成熟於惡趣果的時候讓我們墮入惡趣,所以我們所有的力量就用來從惡趣中跳脫出來。從惡趣跳脫出來了,輪迴還有生、老、病、死,實在是令人恐怖!跟親人別離的淚水可能流成了四大海水,捨棄的身體的骨頭可能堆得比須彌山還高,就成這種慘狀!所以想要從惡趣和輪迴裡跳脫出來這個心意非常、非常地堅決! [02′32″]</p>
<p>   但是我們有沒有注意到要走大乘這個問題呢?可能看到惡趣的苦和輪迴的苦之後,我們就非常迫切地想要得到一己的解脫,覺得我得到一己的解脫之後,再慢慢地修學大乘法也可以吧?可能很多修行人都想過這個問題。因為有一個非常簡單的想法:「自己都沒有從惡趣裡出來,也沒有從輪迴裡出來,我拿什麼利眾生?所以我還是先自己了脫了,然後再利眾生。」大家可以想一想:如果我們想先自己了脫了再利眾生的話,這個觀念到底對不對呢? [03′19″]</p>
<p>   雖然跳脫輪迴能夠讓我們得到解脫,能夠去除掉苦苦、壞苦以及種種的痛苦,安住在一種寂靜樂的狀態之中,但是在這樣的一個狀態之中,想要進入大乘法裡邊,是非常困難的。因為當我們在寂靜樂的時候,在入定這樣一種安樂的狀態下,如果想要行布施、持戒、忍辱等等的六度,也是相當困難的。 [03′50″]</p>
<p>   所以善知識會規勸我們千萬不要有這樣的想法!什麼樣的想法呢?就是我把惡趣苦都解決了、把輪迴苦都解決了,然後我再慢慢地去學大乘。那麼為什麼我們不能有這樣的想法?既然佛菩薩告訴我們說苦是如此地劇烈,我跳脫了痛苦不是佛菩薩也省心?不用一生一生在六道裡追著我、度我,我至少可以解決自己的問題!但是佛菩薩好像不同意這樣的想法——如果我們能聽他們的勸告的話,他們是不同意的。為什麼呢?因為有更高明的辦法!更高明的辦法到底是什麼呢?就是如果一開始我們能夠進入大乘門、修學大乘法的話,對我們來說這樣的時間才是比較迅速的。 [04′38″]</p>
<p>   過去很多善知識也都提到:如果有一個人透過修學佛法而證得阿羅漢的果位,並且在之後獲得佛果——注意!先證阿羅漢果,然後他獲得佛果。這段時間多長呢?是相當漫長的!漫長到什麼程度呢?它比一個具有大乘種姓的人在墮入惡趣承受多生多劫的惡趣苦之後,從惡趣的狀態中跳脫,遇到大乘的善知識、修學大乘法來成佛的速度,跟前者相較之下,後者還比較快!前者沒有辦法跟後者相比;前者透過獲得阿羅漢,更進一步地想要獲得佛果,它的時間就漫長到不可思議! [05′27″]</p>
<p>   所以我們在學習中士道的法,對於輪迴當中的痛苦生起了一種沒有辦法忍受的這樣一個出離心之後,這個時候我們要更進一步地思惟:就如同我面對輪迴痛苦的當下,不願意去忍受輪迴的痛苦,而生起了想要出離輪迴的這個出離心;相同地,我周遭的如母有情眾生,他們所面臨的苦跟我其實沒有太大的差異,所以對於他人所承受的苦,我的內心當中應該生起悲憫;而對他人所沒有辦法遇到的安樂,我們也必須要生起慈心。在內心中以慈心及悲心作為根本、作為基礎,策發內心當中的菩提心,這也是非常重要的一點。 [06′23″]</p>
<p>   關於這一點,過去也有一個公案:有一次文殊菩薩對六十位比丘宣說大乘法,但是這六十位比丘他們並不是具器聽聞大乘法的那種弟子。所以在聽完文殊菩薩對他們講完大乘法之後,結果對大乘法不僅沒有辦法生起信念,反而生起了邪見而毀謗。因為毀謗了佛法、毀謗了大乘法,這六十位比丘在毀謗之後,就吐血然後墮入惡趣。 [06′58″]</p>
<p>   這個時候在旁邊的弟子們看到這種場景就非常地緊張,然後去跟佛說:「佛啊!今天文殊菩薩做了這樣的一件事:他講了大乘法,而六十位比丘都墮入惡趣了,這是不是非常非常地可怕?」意思就是說:「佛陀,您要不要去講一講文殊菩薩啊?」這樣去問話的人,可能是覺得文殊菩薩未曾成佛過,他不知道文殊菩薩的心思和佛是一樣的。這時候佛就對弟子們說:「其實文殊菩薩這樣的講法是可以接受的,而且是非常善巧的!如果今天文殊菩薩對這六十位比丘宣說小乘法,雖然在說法的當下,這六十位比丘可能會獲得阿羅漢的果位,但是這對於將來想要進入大乘法修學或者想要成佛,這時間都太長了!所以文殊菩薩想要縮短他們成佛的時間,就給他們講了大乘法。」 [07′57″]</p>
<p>   透過修學中士道的法類之後,更進一步地,我們內心中要生起進入大乘的這種心念。而這種心念最主要的轉折,在於透過思惟中士道的法,讓我們的心對惡趣,尤其對輪迴的苦——注意!生起出離。心生起出離之後,由於我自己不想忍受,我周遭的有情也是不能忍受,也有離苦得樂的權利,像我一樣想要跳脫惡趣、跳脫輪迴;因此就會對有情生起慈悲心,而進一步地透由大乘法策發自己內在的菩提心,就進入到上士道的修法。 [08′40″]</p>
<p>   所以在聽聞大乘的修心法要之前,透過三士道的內涵來調整我們本身的動機,這一點是非常非常地重要。雖然我們在此所聞的法是大乘的法,但是聽聞者本身如果沒有調整好自己的動機,如果我們耽著的是現今的安樂,以現世的安樂為主來聽聞的話,即使所聽聞的法是大乘法,但是實際上我們所修學的人本身的條件是沒法跟這樣的大乘法相應的。所以還沒有聽聞之前,就必須透過三士道的內涵來調整聽法的動機。 [09′20″]
<p>   雖然善知識們幾乎是每一次聽法都會強調動機的調整,讓我們沿著三士道,把動機調整到趣向於菩提心、趣向於佛果這樣的一個方向。但是就算講了很多年,我們在內心中是否引起對這件事的重視?重視和不重視之間的那一道界線到底是什麼?比如調整自己本身的動機,在「皈依發心」偈頌裡面,「<p> 諸佛正法賢聖三寶尊,從今直至菩提永歸依,我以所修施等諸資糧,為利有情故願大覺成。<p> 」前面的兩句就提到了大乘不共皈依,而後面就提到了大乘的發心。為什麼要提到皈依和發心呢?如果在行善之前,我們本身的動機沒有辦法生起皈依的心念,請問:那我們所造作的善法有沒有辦法成為正法呢?再進一步,如果我們內心沒有辦法生起哪怕是造作的菩提心,朝著這樣的方向,我們所造作的善業不能夠稱之為大乘法或者趣向於大乘法。 [01′19″]</p>
<p>   因此做任何的善行之前調整動機,生起皈依和發心,就變成是非常非常重要的一件事情。縱然三令五申,在大大小小的開示中,我也聽到師父反覆地策勵,還有我很多的上師們都如是說。但是反觀自己的內心,就在策動自己要發心去求大乘這件事上,我們到底把它看得有多重要呢? [01′51″]</p>
<p>   所以對於從現在開始到成佛這樣一個修道進程的計算,我們有沒有特別在意要速疾成佛這個「速」字呢?縱然講了很多次、很多次,好像在內心中也無法生起鮮明的決斷,或者比較強烈的覺受。那麼這種狀態下,就讓這種狀態——好像自己佯裝不知,或者似是而非地懵懂下去,還是要結束內心這種忽明忽暗的狀況?因為現在有幸能夠聽到善知識在大大小小的開示中都這樣提醒我們,在《廣論》幾乎每一處也都提醒我們,一開始就是要「導具善者趣佛地理」,立出這樣的一個目標和宗旨。所以我們能聽到是多麼幸運!因為我們聽到了之後,我們便不會犯那種錯誤去誹謗大乘法,就不會因為誹謗大乘法而墮落。 [02′57″]</p>
<p>   雖然不會因為去造作謗法罪而墮落惡趣,但是我們是否能夠聽進去佛菩薩勸我們的、給我們找的最好的路?最快成佛的那條路,就是在一開始的時候就要準備趣入大乘,不是跳離了惡趣、跳離了輪迴,然後再慢慢地學大乘。在三士道裡最初有一個共下士道,開始就發心趣大乘。這種方式如果沒有善知識來教我們的話,我們是不太會重視到發心這個問題的。發心就決定了成佛的路是近還是遠!所以這條信息,到底在我們無量劫生命的這種進程中值多少錢呢?告訴我們這個竅要! [03′49″]</p>
<p>   比如說能把麵包做到世界頂級的,他一定有一些竅門;能把一個銀壺打到世界頂級的,也都是有獨到的方法。但是進趣無上菩提能找到一條最快的路,那一定是成就了無上菩提的人,他知道怎麼走是最快的。但是他走過了之後,回頭告訴我們還沒有走完的人,會聽嗎?還是想要自己去闖一闖?但闖一闖會闖到哪裡去呢? [04′19″]</p>
<p>   在動機的這個策發上,大家可以持續地、持續地思考。如果覺得自己的心動轉不靈,那麼不要因為動轉不靈就作罷;正因為動轉不靈,所以要努力地動轉它,因為現在我們還有機會!如果連聽到的機會都沒有了,也沒有閒暇去思考這個問題,那才真的動轉不靈。所以如果我們努力思考的話,趣向大乘也不應該成為我們生命的一個神話,可能就可以像眼睛看到、手可以觸摸到這麼真實!因為它就是在我們心念上操作的、反覆串習的、思考的、觀察的,能夠生起的這樣一個正念。 [05′09″]</p>
<p>   所以每每聽到上師們這樣數數地強調發心的時候,內心裡真的是很感恩!不管我們能不能聽進去,還是我們聽了又忘了;做兩天很精進,過幾天有點什麼事情一打擊,想要幫忙別人的心就立刻灰飛煙滅,我們就進進退退、明明暗暗地這樣反覆地折騰。但是善知識都沒有放棄我們,一直在引領著我們,從來不放棄!因為如果放棄我們他就沒有菩提心了;他的心是經過千劫修鍊的,堅固不動的、剎那都不閃的利他心。 [05′52″]</p>
<p>   在這樣堅定地趣向於大乘的上師們的引導之下,那我們是否也拿出精誠之心,認真地想一想發心這件事?在這麼多的經典裡上師們反覆強調,是不是我也應該把它擺在我生命的一個頭等大事上,在內心中徹底地做一個決斷:我在做很多很多的善行之前,我是否要發心為利有情願成佛?至少要有這樣的一個動機去做的。那麼生起這樣的念頭算不算發心呢?不一定算!因為我們要對有情生起那樣的慈悲心,然後由於這樣慈悲心的基礎,為了想要儘快地救他們然後去成佛——當然菩提心還有完整次第的修學。但就是我們天天發心要修學七重因果、自他換,這樣經過嚴密的道次第修行的菩提心,天天這樣發願,我們一定會去修!因為那就是我心之所願啊! [06′55″]</p>
<p>   所以很希望我自己和大家都能夠聽進去善知識幾乎是永不疲厭的諄諄教誨。如果能聽進去的話,得少走多少彎路啊!但是聽不進去的,非得照著自己想像的那樣,說:「我快點從惡道裡出來、快點從輪迴裡出來,我趕快出來,這苦實在太難忍了!」感覺上是趕快出來馬上到一個清涼的地方很好,可是我們離遍智的果位太過遙遠了!佛陀計算的這種走法會比較好,那我們的小算盤算的就是那樣的比較好,所以還是存在那個問題:求證無上菩提是佛陀懂呢,還是我自己懂呢?是上師們有修行的經驗,知道如何是快路、如何是遠路,還是我自己有呢?那麼當我覺得自己很合理的時候,好像不太了解善知識們說的事情,我也沒有一雙眼睛看到無盡的未來,我不可能看穿八萬大劫、十萬大劫,都不可能!甚至這一生的事都是前面做了,後面就忘了!就在這種慧力的狀態下,如果還不去緊緊地拉著善知識的手、聽善知識的勸導的話,那出路又在哪裡呢?我們那麼自信、相信自己的感覺,依據又是什麼呢?所以這些問題自己要在內心中好好地思考一下。 [08′22″]</p>
<p>   當我們得到暇滿人身的時候,就像閃電在烏雲密佈中閃耀,非常明亮但是瞬間就會熄滅。如果用這樣的時間,我們能夠望見璀璨的大乘法脈,能夠心生渴仰,用全部的身心去追求的話,這一次的暇滿人身我們是不是非常地值啊?太值了! [08′47″]
<p>   我們就從「<p> 此中傳有二派釋儀<p> 」這一段開始聽,聽的時候大家要專注、斷除散亂。 [00′15″]</p>
<p> 此中傳有二派釋儀。<p>   說解釋的時候它有兩種傳承。他為什麼要講這個?平常在我們一般的概念當中,我們不太了解,也不大注意這個傳承的重要,這一點實際上是非常重要、非常重要。譬如說我們現在來說,我們隨便做任何一樣東西,買東西也好,我們常常說:這個哪來?這個是美國貨,然後這個是福特的、這個是通用的,然後這個是德國貨。譬如說汽車吧,剛才說美國的是福特、通用,德國的是賓士,譬如說日本的什麼,它每一個都有它的來源。實際上這個來源裡面包含了什麼?就是那些工程師,傑出的人才,這樣。世間的所有的東西,都有它這樣的一個圓滿的來源,何況是佛法啊!何況是佛法啊!所以我們曉得學任何東西,假定你沒有這個正確圓滿的來源的話,學不好。佛法亦復如是,佛法亦復如是!所以他一方面教那個內容,一方面要告訴我們說:我這個牌子哪來的?喔,說這個牌子一點都不錯的! [01′42″]</p>
<p>   師父在這一段裡邊很顯然是介紹傳承。在很多年前,沒有學《廣論》之前,我們不瞭解傳承的重要性,所以師父用特別簡單的例子來告訴我們:傳承的來源都是非常非常地圓滿,來自於非常非常傑出的人。傳承是非常重要的,顯示著傳規、法的清淨,還有它的尊貴。 [02′14″]</p>
<p>   我第一次學法聽到「傳承」兩個字的時候,心裡就在這兩個字上想了很久。那時候跟我在一起學法的一些學生,我們還在星空下討論「傳承」是什麼?因為仁波切要傳給我《廣論》的傳承,一些學生還猜測:是不是要收你做入室弟子,才傳給你傳承?在講這件事的時候是個夏天嘛!現在還記得空氣裡有一些花香的味道。然後在講到傳承的時候,雖然所有《廣論》班的同學——那時候都是大學的同學,他們都陷入了沉默;我們一起在星空下沉默,心可能是跑到很悠遠的一種追憶裡。傳承總是一件很美妙的事情,尤其是上師講出來的時候。 [03′11″]</p>
<p>   但那個時候對傳承是什麼並不知道,只是非常地嚮往。那麼現在看看,我們學習《菩提道次第廣論》之後,已經得到多少傳承了?大家可以想一想。有的學員已經跟著師父學了三十年了,在三十年中間,從我們沒有聽過什麼叫「傳承」二字一直到現在,我們已經得過多少傳承了?還有,幸運地在師父的僧團裡出家的法師們,傳承就得了多少了?有的時候一個夏季、一個冬天,我們都努力地三個月、兩個月這樣集中時間去學傳承。很多很多珍貴的傳承,都透過師父帶我們學《廣論》,我們會生起希求心想要得到這樣的傳承;也有善知識會悲愍我們這些弟子,傳給我們傳承。想想三十年前師父是一個人告訴我們傳承的重要性,而今已經有這麼多的弟子們都瞭解傳承的重要性,而且我們得到了特別多的傳承。所以看到這一段的時候,真的特別特別感恩師父能把《廣論》帶給我們。 [04′29″]</p>
<p>   接下來再聽一下師父的開示。<p>   那麼在宗喀巴大師那時候,這個裡邊它有兩派的傳承,這個兩派的傳承就說明了這個師承。實際上這個師承的內容剛才說的,這個殊勝的教授,都是靠這個傳承下來的。這個是從佛傳下來,經過諸大祖師圓滿的教理、正確的修持,都從這個圓滿的師承這樣地傳遞下來,非常重要、非常重要!這是特別的一點我們應該了解到的。那麼哪兩派啊?下面,一個是那蘭陀寺,一個是止迦摩囉傳的,我們看一看。 [05′18″]</p>
<p>   這一小段,師父說:「<p> 殊勝的教授,都是靠這個傳承下來。這個是從佛傳下來,經過諸大祖師圓滿的教理、正確的修持,都從這個圓滿的師承這樣地傳遞下來,非常重要、非常重要!<p> 」說從佛傳下來的圓滿的教理,還有正確的修持,如果學了這個圓滿的傳承的話,我們所學的教理它就會有完整的系統性,比如說五大論,它會完整地闡述《釋量論》、《中觀》、《現觀》、《俱舍》,還有《戒論》的內涵,它都是有傳承的。 [06′01″]</p>
<p>   第二步還要有正確的修持。比如說打坐,打坐的時候到底是不是空空蕩蕩地坐,坐到好像沒有念頭了,就是什麼境界了?還是一定要心裡緣一個善所緣?那麼善所緣千差萬別,緣哪一個善所緣還能一邊修定、一邊累積福報呢?就是緣佛像的善所緣。在〈奢摩他〉的時候,還有廣泛的講述。 [06′28″]
<p>   我們完整地學了教理之後,探討到實際用功的時候,比如說重不重視集資淨懺,實際上這是基礎的功夫,比如說發心等等,對於每天自己做任何事情的動機的觀照,尤其是對境要歷事練心。師父的這些調伏內心的教授,如果沒有這些傳承,實際上我們學了佛法的教理之後,我們不知道如何在生活中應用;學的教理是一套,然後生活是一套。教理就是指導我們在生活中斷除煩惱,也就是斷除苦因的,可是真正的苦因來的時候,我們不知道什麼是苦因,所以在身心上取捨的時候往往都非常不得力。道理講的是一套一套的,修行根本是不能見人的。 [00′52″]</p>
<p>   如果得到了清淨圓滿的傳承、正確地修持,這個弟子如果很用心地學的話,他一年一年修行的長進,就可以看到煩惱有沒有變輕啊?對三寶的信心有沒有變深? [01′08″]</p>
<p>   觀察自己煩惱,會不會覺得觀察到的越來越多?越多越清晰的時候,可能會產生一種感覺:我煩惱這麼粗猛,好像怎麼斷也斷不完,好像越斷越嚴重。但是正因為我們眼力變強了,就好像在陽光下能看到很多塵埃一樣,這個時候不能說:哇!陽光下這屋子這麼多塵埃,那好吧!我不再打掃了,就髒著吧!當我們看到了越來越多的塵埃之後,我們應該奮力打掃。 [01′34″]</p>
<p>   所以有真正的善知識帶我們修行,還有沒有跟過善知識自己盲修瞎鍊的,差別是非常明顯的。有的時候一開口就聽得出來:哎呀!沒有跟老師學過,跟老師學過,大概就不會犯這樣非常非常粗糙的錯誤。那麼你說:「跟老師學的就不會犯錯嗎?」也會,但他至少大體的脈絡是很清楚的,你會發現他這是學過教理的人。 [02′04″]</p>
<p>   所以努力地在經論上學很多年,儘管我們都覺得自己好像沒有什麼成就、沒有什麼成果,好像還在那兒跟惡業拉拔,跟妄念還有失念在搏鬥吧!但是畢竟師父把圓滿的傳承帶給我們,我們已經對於三主要道建立了基本的概念——如何是一開始修的、如何是中間修的;初重要、中重要、後重要。很多學《廣論》的同學都知道菩提心是非常非常重要,就不會在修行的時候略過菩提心。略過菩提心後果不堪設想! [02′45″]</p>
<p>   然後也不敢不好好地修皈依,因為任何戒體都建立在皈依之上,如果我們對上師、三寶的虔誠日漸損減的話,一定會威脅到所有的戒律。然後也知道抉擇善知識非常重要!一旦抉擇了善知識之後,就要修弟子相,不能觀過,觀過只會損失自己,修信念恩的話只會成就自己。所以很多很多的教理,會在我們心中難以取捨的時候,作為明燈一樣照亮我們的腳下,知道怎麼樣地向前一步、向後一步。 [03′22″]</p>
<p>   所以對於我們這些弟子來說,有什麼比得到圓滿的傳承更為珍貴、更為令人萬分感動呢!因為如果沒有這樣一個清淨傳承,就像我們有了煩惱病,得了這個大病之後,我們並不能吃到一個真正的解藥,病是治不好的。可是現在我們已經遇到了這個清淨、真正的解藥。就像師父說的:「<p> 圓滿的教理、正確的修持,都從這個圓滿的師承這樣地傳遞下來,非常重要、非常重要!<p> 」通常師父在說法的時候,還有在開執事會啊,師父一旦說:「這個非常重要、非常重要!」那個就要銘記在心裡面。如果記不住的話就最好做筆記,然後常常翻一翻。凡是標示出非常重要、非常重要這件事,就是應該不要忘! [04′17″]</p>
<p>   這個非常重要的事,就是殊勝圓滿的教理,還有正確的修持這所有的傳承,就是教正法和證正法清淨的法脈傳承。我們有幸有這麼多清淨的傳承,有這樣一個承載著這個清淨傳承的僧團,還有這麼多的居士們一起學習;跟當年師父隻身求法,帶著一本《廣論》走遍世界的那種狀態,已經完全是天壤之別了。 [04′48″]</p>
<p>   想想當年師父的勇氣,師父矢志不移堅持,把我們這些弟子一個一個地從各自的業力裡邊找到廣論班,讓我們能夠定期上課,按照宗大師教法的道次第清淨地聽聞,很老實地學習。光是把三主要道這個點聽清楚了,其實得到了這種正見之後,大家可以想像在我們的成佛之路上我們將節約多少時間?可能不是用幾劫能夠算清楚的。 [05′22″]</p>
<p>   所以不要小看自己坐在廣論班裡聽聞師父解釋《廣論》的這個時間,在我們的心續上不是一刻千金這樣的力量。聽到這麼清淨圓滿的教授,我們少走多少彎路、少受多少苦!而很多苦都要在惡趣裡經歷的。所以有人說:「聽君一席話,勝讀十年書」,這不是勝讀十年書的問題,這是救我們於千生萬劫的深恩!當我們已經得到了很多很多的傳承之後,再回首當年完全不知道傳承是什麼,找到一個什麼馬上就拿來修的那種狀態,想一想我們今天得到的所有的一切,要感恩誰呢? [06′08″]
<p>   堅持聽法是一件很重要的事情,最好每天都堅持聽,為什麼呢?因為雖然我們已經聽了很多法了,但是聽了之後會不會都記在心裡呢?對境的時候會不會法就現行了?正好是那個煩惱,正好是調伏那個煩惱的法現行了呢?通常對境的時候都現不起來了,為什麼呢?無量劫來串習煩惱的勢力非常地強大,所以對境很難現起正見,大概是初心的修行者比較困難的部分。 [00′43″]</p>
<p>   我們自己的力道現不起來怎麼辦呢?就是要靠聽法的力量,聽法能直接提起我們的心力。有時候會聽到說:「哇,沒力了!」沒力了,是什麼沒力了呢?是沒力氣造善業了,還是沒力氣造惡業了?或者你會認為善業、惡業都沒力氣造嗎?肯定不是那樣的,因為就看看自己內心什麼業力強。如果我們對治的力量沒有力氣了,那惡業的力量一定是很猛烈的,就隨著那種惡業向前走。 [01′22″]</p>
<p>   那麼怎麼樣能夠讓我們對境感到心力匱乏的時候、沒有力氣的時候,就透過聽聞得到力量呢?那就先研究我們為什麼會沒力?是被煩惱打擊得沒力嗎?因為對治了千翻百轉,發現還是在老地方折騰,就是那個繫驢樁,一直繫著這個驢也逃不掉,然後有些人就垂頭喪氣坐在地上:「我不幹了!」不幹了,那個惡業還在繼續長的,每一個白天、每一個晚上、每一個剎那,沒有淨化的惡業都是成倍數地長的。豈止是惡業,苦也在成倍數地增長。所以不是我們說不幹了一切就停了,而是苦就在增長。所以這個時候如果說我心裡沒力了,但是還能聽到法,周邊還有善友能夠幫我們提持正念的時候,如果我們放棄,沒有注視到眼前這個大好的機會還是可以讓我們把心力都提起來的話,那真是太可惜了! [02′26″]</p>
<p>   所以每日的聽法,就在於能夠警醒自己在二六時中迷茫的點。不可能所有的點都警醒了,但是至少有一些點師父的教授會撞擊到我們的內心,讓我們如夢初醒,會突然腦筋變得非常清晰:發現這個念頭不對,我得要調整它!或者這一段時間我都覺得渾渾噩噩的、狀態不太行,有一天突然在師父的講授裡聽到了一個希望,讓你有心力再站起來打擊這個煩惱。 [03′03″]</p>
<p>   有的時候是可能對治煩惱的方法不是很正確,比如說我們念《二十一度母讚》,修怙主、大威德,念這些本尊修法的時候,我們是否是真的很認真呢?是否很認真呢?如果不認真的話,就變成祈求的時候是不認真的。如果祈求是不認真的,會不會產生很大的力道呢?如果養成習慣,一去祈求佛菩薩就昏沉、打瞌睡,或者散亂、不用心,或者苦苦惱惱在想著自己那點事情,這麼珍貴的時間就在自己的手中溜走了,而且我們會沒有一個力量去對治煩惱。因為單靠自己的力量是打不過無始劫來的煩惱的,一定要靠祈求佛菩薩的力量,覺醒我們內心中那種熱情、虔誠和毅力,就是要在正法上努力! [04′03″]</p>
<p>   因為不努力,暇滿人身白駒過隙,如果不好好地抓在手裡,像烏雲一般瀰漫的惡業瞬間又把我們吞沒,就進入惡道,我們將沒有機會造善。雖然現在這個時間造善還是覺得困難,但是畢竟有機會造善,我們是有可能贏得勝利的。如果在這個時候還躺著作大夢,覺得時光一大把,自己好像永遠不死的樣子,那麼就會坐失良機。所以這種種的覺醒,都要常常親近善知識、聽聞正法,再獲得自己內心的如理作意,然後我們的現行才能夠如教修行,才能跟得上。所以能天天聽法是非常非常重要、非常非常珍貴的! [04′53″]</p>
<p>   當我們修行遇到困境,比如說心力不濟的時候,要好好供養三寶,積福啊!然後好好祈求。還有念三十五佛、拜懺。像很多大善知識曾經說過:「你睡前有念三十五佛嗎?如果沒念的話,那你登地了嗎?」大德都如是說哦!如果不把當日的惡業懺悔掉的話,即使我們睡著惡業也在增長。當然如果我們好好持戒的話,我們的密乘戒、菩薩戒、五戒,還有很多法師的比丘戒、沙彌戒等等這些戒律,其實它的功德在睡著的時候,如果你沒有去破壞它也在增長,一樣的。那麼就看我們向這個短暫的人身、如此珍貴的人身、可以贏得大利的人身,去矢志不移地追求什麼! [05′43″]</p>
<p>   所以最可怕的就是:我們在這個滾滾紅塵中迷失了方向,迷失了心所要求的那個地方,就是真正快樂的那個方向,宗旨打失了。這個時候一定要聽法,聽佛陀千古的呼喚,佛菩薩、祖師都是一樣的,覺醒我們的內心——提起正念來,就是勇士!跟煩惱鬥、正念的劍掉落的時候,要立刻把它拿起來,旋即把正念的寶劍拿起來!不可以讓失念的狀態停留太久,因為每一分、每一秒都是惡業在迅猛增長的時刻。惡業在增長就是苦在加劇的時候,等到它成熟的時候是無法忍受的。 [06′30″]</p>
<p>   所以當我們說我們沒心力的時候,通常都是沒心力造善,那個惡業的心力可是猛著呢!這一點希望大家能夠留心在自己的身心上觀察一下。能讓自己覺醒就是要聞法,一聽法的時候就會發現:哇!我這個狀態就是......。拿法數數來校對身心的時候,就會發現它的距離,就會發現自己腳下的一步從哪裡開始,一定是從提起正念開始! [07′00″]</p>
<p>   千萬不要覺得:煩惱這麼猛,那我放棄修行好了,因為對治煩惱實在太辛苦了!天天戰鬥、天天戰鬥,晝夜不停地戰鬥。你覺得放下寶劍會很舒服嗎?那除非我們心裡沒有煩惱的敵人圍困我們。真正讓我們痛苦的就是煩惱賊的圍攻,這一個戰役沒有打勝之前,我們怎麼可能安樂?怎麼可能清涼?縱使現世五欲的安樂會暫時迷悶我們的內心,但是那種苦性終歸會暴露出來,會像刺一樣讓我們晝夜難安,因為輪迴的苦性就是那樣的。 [07′42″]</p>
<p>   當這個苦性沒有結束的時候,用多少五欲的安樂,似乎是想要麻痺它,然後想要用自己的感覺去證明這個輪迴是快樂的,終究會被事實所摧毀,被輪迴的苦性所摧毀。因為生老病死就那麼真實,愛別離、怨憎會這些苦也是非常非常真實的,這些苦遍滿的地方能有什麼純淨的快樂呢? [08′07″]</p>
<p>   所以在這點上就比較希望大家能夠死盡偷心,老老實實地沿著師父所講述的那樣、沿著佛陀所指出的方向,矢志不移地改變我們生命的這種痛苦,不要遇到困難的時候就退心。遇到困難的時候要考慮:我怎麼樣才能夠提起心力?就是要集資淨懺!師父一直叮嚀我們那幾個字:不是你不能,而是可能資糧不夠。資糧不夠就是供養三寶啊、承事父母啊,好好地誦經、拜懺,這些都是讓我們增長心力的辦法。最可怕的就是什麼都不幹,把劍丟了,還要怨天、怨地、怨人,這種作法是累積惡業最快的方法,也是把自己推落到墮落的懸崖邊最快的辦法,也是自己糟蹋自己最成功的辦法。 [08′56″]</p>
<p>   所以最警覺的應該是:要警覺自己內心的動向——它是朝哪裡去的?是朝斷煩惱、向三主要道的方向去的,還是朝著墮落的方向?是朝著親近善知識的方向,還是遠離善知識的方向?是朝著要努力修行正法的方向,還是朝著背棄正法的方向?當我們發現方向不對之後,要立刻調轉!我們的心念不能遲疑,因為下面是萬丈深淵、萬劫不復! [09′27″]
<p>   大家好!又到了我們研討《廣論》的時間。此時此刻,我們或是坐著、或是站著、或者是走著的時候,能否清晰地感覺到光陰的流動?有的人會感覺到時光在一秒一秒地消失,但是很多人會感覺好像是停著一樣,會不會?實際上把我們的生命用電影那樣的鏡頭去快放的話,那個變化就是非常明顯的;如果不去回放的話,就會好像什麼時候都有一種滯留的感覺。 [00′44″]</p>
<p>   我們是行進在一個無常的、為苦性所攝的輪迴的現象中,因為宇宙有兩大現象:輪迴的現象和涅槃的現象,輪迴的體性是苦的,涅槃是樂的。那麼我們在輪迴的苦受裡邊,行苦沒有被破壞的時候,一天沒有出去,我們便被這樣的不確定所左右。即使我們能夠禪定多長多長的時間,但那禪定力壞了之後,可能依然會因為往昔的業成熟為什麼地方就去什麼地方。 [01′25″]</p>
<p>   我們都覺得什麼事情好像是自己想的、自己決定什麼,但多半對很多凡夫來說,都是隨業流轉。我們今生造就了很好的業,得到了人身、遇到了教法,而且有信仰,能夠遇到師、法、友這樣的順緣。當這樣的順緣來到的時候,就要奮發向上,要徹底地對治自己覺得一切似乎都停滯不動,在這個生死中間還有很多安樂,好像可以享樂,完全沒有看到它的無常、它的苦性,任這個人身就這樣白白地流去,只得到了一些微薄的現世樂,有些人現世樂也是得不到的。 [02′10″]</p>
<p>   因為所謂的安樂,在《廣論》裡邊說它是壞苦,就是苦的漸息滅位,實際上沒有一刻苦會停息的,是這樣的一個生命的現狀。我們沒有體會過無苦的快樂,就會把苦的漸息滅位當成是快樂。師父在大大小小的開示裡,都希望我們生起這樣一個決斷,就是不要摻雜痛苦的快樂、要徹底的快樂,就是要成佛——所有的苦和苦因都消除掉,所有的樂都圓滿,沒有一個功德沒有圓備的生命狀態! [02′46″]</p>
<p>   但是多半我們對這樣的生命的狀態很難生起真正的嚮往,我們常常被眼前的因緣阻隔或者障礙,看不到遠方,看不到前面是什麼。而很多修行者也都會陷溺在自己的一種業力裡邊,也聽不進去善知識的提醒。到底有多少事情,我們能夠聽到佛提醒我們、聽到善知識提醒我們的話,真正做到依教奉行的?仔細盤點一下自己的內心,發現自己還是想要按照自己的想法、按照千劫輪迴那樣的想法。萬一這樣的想法很多是走向惡趣的,那就不可避免地走向惡趣了! [03′38″]</p>
<p>   所以這一生遇到宗大師教法、遇到善知識,實際上是一個我們可以脫離惡趣、脫離輪迴的最美好的時機,當這個時機來到眼前的時候,必須拚命地用全部的注意力抓住。儘管我們還會被輪迴大夢的所謂安樂擊昏了頭,想要在生死中找尋什麼真正的快樂,但是一聽到佛陀的呼喚、一聽到善知識的呼喚,我們要立刻把那個睜不開的眼睛努力地睜,一直昏昧的那個抉擇慧把它清晰。因為在能夠聽到的時候還不努力清醒的話,就會到再也聽不到的地方,或者聽了也完全沒反應。所以這樣的人身對我們來說,是非常珍貴、非常地義大,也是很危險的,因為一旦利用不好這樣的時光,反而造惡業,就成了下輩子墮落的一個因緣。 [04′34″]</p>
<p>   所以每次在聽法之前,還是希望大家能夠覺醒輪迴苦性的這件事,讓我們的心要有所戒備、有所準備。因為要防備的是我們內心裡的惡業,或者看不到無常的現象、看不到我的生命在輪迴裡是不安定的。用這種不安定的、還有很多惡業沒有淨化的狀態想要去享樂的話,實際上是非常不現實的;應該用所有的力量把惡業淨化掉,那個時候才會有安樂可享。 [05′09″]</p>
<p>   我們還是要再再地策勵自己的動機,要去希求一個所有的痛苦都遠離、所有的快樂都完備那樣的佛果。  [05′20″]
<p>   在聽法之前,我們還是要再再地策勵自己的動機,要去希求一個所有的痛苦都遠離、所有的快樂都完備那樣的佛果。而且不僅僅是為了自己的利益要得到這個,是為了所有跟我淹沒在輪迴裡的這些如母有情、深恩的有情,為了他們能夠離苦得樂,我們去希求最究竟的佛果,為了這樣的一個目標才來學習《菩提道次第廣論》。 [00′29″]</p>
<p>   今天我們要聽的是「<p> 勝那蘭陀諸智論師<p> 」這一小段。 [00′37″]</p>
<p> 勝那蘭陀諸智論師,許由三種清淨門中,詮釋正法。謂軌範語淨,學者相續淨,所說法清淨。<p>   第一個就是那蘭陀寺。那蘭陀寺那是當年印度最了不起的一個地方,修學佛法的。佛涅槃沒多久就開始建立,一直等到公元一千年左右,那個回教勢力入侵的時候,由政治勢力把佛教摧毀為止,始終是執印度佛教牛耳的、最頂端的一個佛法的中心。那個地方的很多這種了不起的菩薩、祖師,他說在解說佛法的時候、造論的時候,要有三個條件。 [01′43″]</p>
<p>   這個那蘭陀寺順便提一下,我們中國歷史上有一位了不起的玄奘大師,玄奘大師當年到印度去的時候,學到最好、最精采的就是在那蘭陀寺。那個時候是這樣、以前是這樣、以後也是這樣。為什麼要說那蘭陀寺呢?換句話說,印度的整個佛法的最高的,經過了這麼多了不起的成就的人抉擇以後,剩下來的精華都這個樣的!他們解釋這個經論不是隨便的喲,他要幾個條件,三個,就是三門清淨,三方面都要清淨了。這「清淨」兩個字很重要、很重要!就是說這個清淨的話,這個法本身絕對正確,沒有一點點問題,假定說的有一點問題的話,我們學的人就出問題了。像吃東西一樣,你稍微弄得不乾淨啊,對不起,細菌乃至於毒,就把你吃死了;佛法也是如此的、佛法也是如此的。世間只是教你受一點小小傷害,佛法的話,你如果說有一點點不乾淨擺在這裡的話,這留下來的是問題重重。 [03′08″]</p>
<p>   老學員都知道那蘭陀寺了,新的同學是不是知道那蘭陀寺?那蘭陀寺是非常偉大的一座寺院,在佛涅槃沒多久就開始建立。在《四家合註入門》的時候會再講一下。到公元一千年左右,那個時候被回教的勢力破壞掉了。有那麼多大成就者駐錫過的寺院,現在就只剩下遺址了,所以世事無常啊!當我們遇到教法的時候、遇到善知識的時候,千萬要好好地珍惜! [03′47″]</p>
<p>   接著師父就講了玄奘大師,玄奘大師就在那蘭陀寺學習。接著師父說:那蘭陀寺是整個印度佛法最高的地方,經過了這麼多了不起成就的人抉擇之後,它有三種清淨門詮說正法,它的軌則是這樣的。三個條件,三個條件都著重在「清淨」兩個字上。師父說:清淨很重要,這個法本身要正確、沒有一點點問題。先說了這個法,因為法是治我們的煩惱病的,如果法有問題就好像藥有問題——本來有病,吃了藥,藥本身還不對,那就會病上加病!所以師父說世間的我們會受一點兒小小的傷害,要是佛法的話,有一點不乾淨的在裡邊,留下來的可就不是一點點傷害。所以法的清淨就變得尤為、尤為地重要!因為我們是靠這個成就法身慧命,就像救命的藥一樣,如果救命的藥摻雜了毒藥的話,那是不可想像的! [05′06″]</p>
<p>   在很多年前我們還不知道傳承是什麼,也不知道講說正法還有這樣的規矩,也完全不了解這樣的規矩居然是從那蘭陀寺傳來的。那麼那蘭陀寺是什麼樣呢?我們知道玄奘大師是很了不起的,去那兒求法。有多少成就者在那裡呢?不知道多少學佛的同學會想去了解?那是許多許多的成就者和智者抉擇下來的這個軌則,它的傳承是極為清淨的,從那個時候傳下來的。 [05′42″]</p>
<p>   那你們現在會不會有一個問題:「最後那個寺院被回教的勢力給破壞了嗎?那傳承還在嗎?」還在呀!會挪到其他的地方。比如說佛法在這個地方鼎盛,過一段時間又在那個地方鼎盛,到現在傳承未斷,就是我們最最感激涕零的一件事吧!雖然寺院是被破壞了,但是傳承是沒被破壞的,軌則就留到現在;現在我們聽的就是那個時候傳承下來的,淵源是從那兒開始的。想一想哦!佛法不可思議的這種力量,居然可以從那麼遠的時光傳到現在;幾經波折,它依然可以清晰地傳到你我的面前,就是此時此刻!此時此刻我們就在聽著這樣的傳承! [06′41″]</p>
<p>   所以師父常常慨嘆說:「不要把經典當容易看哪!」它是很多的譯師嘔心瀝血,還有很多祖師大德不惜生命把法留下來的。所以想一想,傳承延續到現在是一件不容易的事情!我們能對傳承恭敬、珍惜的方式,就是當它來到我眼前的時候,我是否能夠拿出對等的——哪怕只有能夠跟這個傳承的重量對等——那樣殷重的、恭敬的、萬分珍惜的心?生怕漏掉一個字,全部注意力在聽,這可能才是對所有的傳承祖師的一點點報答吧! [07′33″]
<p>   接著我們來聽第二段。<p>   那麼哪三樣東西啊?他說第一個,老師——軌範語淨。這個裡邊包含了兩樣東西:第一個就是「軌範」,就是尊長,譬如我們說軌範師、親教師,換句話說解釋說法的這個尊長,他自己本身清淨;還要他所講的清淨。為什麼要分兩方面來說?難道說這個人清淨了以後,他講的還不清淨嗎?對!為什麼?當然,他如果本人自己沒有修持的話,那講出來一定不清淨,可是自己有了修持以後,他那個清淨還有問題,這個就解釋一下。 [00′53″]</p>
<p>   平常我們也曉得的,說自己沒有解決問題,幫忙別人解決是不可能的,那麼自己要解決了,那個算是清淨了。這個清淨需要兩個條件,第一個,教理上面要有圓滿的認識,然後這個教理還有驗證上面的、確定不疑的悟證的境界。他雖然有了這個,可是因為說的時候,也許他平常一般地說,也許對機不相應。譬如說:我們現在拿世間來說吧!哦!現在有一個大學者,我們請他來給我們演講。那麼這個大學者來演講有兩種可能,有一種可能呢,就是把他自己學的圓滿的內容告訴我們;還有一種,也許他所對著機,說今天有一個地方,一些小朋友啊大家也仰望這個大學者,所以為了使得那些小朋友心目當中有一個仰望起見,請他來去講。請問那個大學者能跟些小朋友講說圓滿的道理嗎?不行!所以這個裡邊是兩樣東西都圓滿,這是「軌範語淨」。 [02′16″]</p>
<p>   問大家一個問題,師父說:「<p> 那麼哪三樣東西?<p> 」是指哪三樣東西?可以看一下《廣論》,重心是什麼?清淨,對吧?第一個是「軌範語淨」,這裡邊包含了什麼?說:尊長他本身清淨、所講的清淨。這時候就會有一個問題,說:「欸,尊長他自己本身很清淨,講的還不清淨嗎?」師父在下面就做了一個解釋。 [02′50″]</p>
<p>   那我再問大家一個問題,師父說:「<p> 平常我們也曉得的<p> 」,曉得什麼呀?「<p> 說自己沒有解決問題,幫忙別人解決是不可能的<p> 」,這個平常我們曉得嗎?曉得。接下來說:「<p> 那麼自己要解決了,那個算是清淨了。這個清淨需要兩個條件<p> 」,我們先在這兒稍事停一下。 [03′17″]</p>
<p>   先看第一個,「說自己沒有解決問題,幫忙別人解決是不可能的。」其實這個問題,想想我們在跟別人討論問題的時候,有幾種狀況呢?有一種狀況就是:我們會覺得我看這個問題看得是非常清楚的,你為什麼就是不明白呢?所以會覺得:我自己是沒有問題的,我也是可以幫你解決問題的,只是你不接受罷了!對不對?還有的是自己陷入到一種情緒的障礙裡邊,覺得自己是很清楚的,但是那時候可能是苦受滿清楚的——應該是自己覺得理路很清楚,但是如果那個情緒的感覺過去了之後,再把自己的理路重新地聽一下,應該多半會慚愧吧!說:「那時候在情緒中的時候,我講的到底是什麼?」所以,這裡邊說:平常我們都曉得自己沒有解決問題,幫忙別人解決問題是不可能的。其實這問題是很嚴重的問題,像洪鐘一般! [04′22″]</p>
<p>   我自己看了這句話的時候——通常看師父講的,我偶爾會停下來思考。如果自己沒有解決問題,還想要幫忙別人的人要怎麼辦呢?就是抱著學習的態度——不是去幫人的,可能是請別人幫自己的。所以所有帶班的班長,還有很多覺得自己還沒有什麼能力,但是就莫名其妙地被推上帶人的這樣一個位置,這個時候會特別清楚自己遇到事情、對境的時候,自己心裡寂不寂靜、能不能提起正念,那種感覺自己觀察一下就了了分明的。在這種狀態下是什麼都不負責任,還是負責任之後有一點點自知之明,知道這些所有的境界實際上都是大家成就我修行的,然後抱著一個謙卑的心態承事大眾,用這樣一個心態?而不是說:我能解決所有的問題,如果你不聽我的話那就是你的錯。這個問題就討論到這裡,一點點觀察自己。 [05′29″]
<p>   很顯然,這裡邊說這個解決問題,不是那種淺淺的狀態,它是一個深度解決。深度解決是什麼?「<p> 教理上要有圓滿的認識<p> 」,一定是對三藏做過系統聞思、得到過圓滿的清淨正見。然後在教理還要進一步驗證,他有實修功夫,是確定不疑的悟證境界。在教理上,有悟證境界就可以了,師父在悟證的境界前面加了「<p> 確定不疑<p> 」——他對教理領悟的這些一定是要有師承的,就是他的善知識許他這個是沒有問題的悟境。 [00′41″]</p>
<p>   以前我也聽過跟師父報告體會的時候,師父就說:「哎,這是獻寶的。」就是說這個是沒有什麼實際的功夫,自己覺得好像很好,但是師父可能會覺得這是一種自我滿足的狀態。還有的時候,是自己覺得非常非常不好、非常痛苦,但是師父會認為這是一個如法的心態。我們不能說那一點點東西好像就是悟證,但是當一個人在拿著法鏡數數觀照三業的時候,一定會看到很多問題。看到很多問題難免會覺得:「這我能解決問題嗎?」有的時候就會覺得非常害怕自己的心,害怕面對自己。 [01′27″]</p>
<p>   比如說有一天一個人突然開始覺得:「我對佛陀的信心到底是真的還是假的?我能夠信多深?對業果見我能信多深?對我所依止的善知識要授其鼻肉,還要加上抉擇慧——他講如法的要聽、不如法的要委婉地說,不能失去恭敬......。」在這中間的拿捏,尤其是當自己的業習氣來了,全部都聽自己的,善知識教誨就放在後面,從來都只作參考;不是善知識的語教是我們的明燈,而是自己的感覺就是方向。隨著很多東西混為一談的時候,我們能否在每一個抉擇的當下,令自己的心稍稍安靜一下,考慮一下:我現在的所行、所想是否會符順於律儀? [02′21″]</p>
<p>   其實律儀是非常清楚的。師父有大小的事情,其實在我們看起來,師父解決那些事情實在是信手拈來的事情。但是師父每次都要去佛堂非常認真地頂禮佛菩薩,非常虔誠地祈求佛菩薩的加持,再三地、再三地祈求佛菩薩的加持。 [02′49″]</p>
<p>   所以「確定不疑」,那些疑惑要怎麼斷除?一定要跟善知識反覆確定。不能自己想一齣就是一齣——自己今天覺得見到本尊了!欸,這好像是什麼什麼悟境。然後明天有的人就會想一點事情就突然覺得自己好像證空性了!其實可能是什麼還不知道,連空性的正見也沒有獲得,離證悟不知道差多遠呢!所以不學教理、不跟著善知識,就會真的不知道自己在什麼地方。就像在山裡邊迷路一樣,以為都到什麼地方了,其實可能還在原地打轉。所以在師父講法的時候,不要輕易地就放過他講的那幾句話。 [03′36″]</p>
<p>   還有像有的修行人,有的時候就會給自己下一個定義說:「我不行啊!我不能修行了!總結一下這幾年我也沒有什麼進展。」就給自己貼個標籤,馬上下個定義,好像把自己無量劫來的善根都看到了一樣,好像看穿了自己八萬大劫的善,就確定自己是不能修行了,然後就朝著不能修行的方向去打算。實際上這都是自己給自己設的誤區,自己給自己設的障眼法。其實就是一段迷霧,過了迷霧之後我們依然會行進在這個菩提路上。這一生不好好地努力,其實惡業也不會饒過我們的,那些惡業成熟的時間會更長。 [04′20″]</p>
<p>   所以很多時候,如果我們能夠想想師父的教誡,按照師父的教誡那樣去抉擇自己的心的話,真的會少走很多彎路!對自己所想的東西到底是不是這樣的,儘管自己想了千百回覺得就這一條路,但是很多時候跟善知識談一下,結果就不是這樣的。但是那個時候到底是執著自己的見解,還是能把自己的見解拿掉、去聽善知識的呢?那就看自己的信心有多強,對不對? [04′52″]</p>
<p>   所以跟師父學習的時候,常常會覺得:哇!自己好像把這個問題已經想完了,到師父那兒問了一個問題之後,發現好像全都不對!拿了一籃子收穫給師父的時候,師父認為:「這不是收穫!這什麼都不是!」那一籃子東西還要好好地珍惜著嗎?能不能順手把它丟掉呢?然後再準備一個新的籃子接受師父給的東西。有的人去了之後拎那些,回來之後還拎這些,因為對師父講的東西應該是一點兒沒接受,心的瓶子是扣著的。為什麼呢?一切都歸自己作主吧!所以就像祖師呵責的那樣:「無量劫來生死本,痴人認作本來人。」我們沒法把佛陀的言教、上師的言教當作是指路的明燈。要朝著那個方向去,而不是朝著自己所謂的某種方向。 [05′51″]
<p>   剛才講到「確定不疑的悟境」要得到善知識的確認,我們現在所感受到的、所確認到的,到底是清淨的還是不對的?但是有的時候,我們會覺得有百分之百的理由要沿著自己那樣的思路走,但是善知識有百分之百的理由告訴你說此路不通!這個時候要怎麼辦呢?比如說,我們就是活在自己思路的一個範圍之中,現在有一個詞好像叫「舒適區」,對吧?自己習慣的、不是那麼挑戰的,覺得這樣可能還不錯。但這樣的區域是沒法令自己成長的,老活在自己舒適的感覺裡沒法成長,必須去挑戰你害怕的。 [00′58″]</p>
<p>   所以由這個「確定不疑」講了這一點,希望能夠供大家參考。因為我們都是希望能夠在依止法上好好修心的人,所以不要放過師父講的哪怕幾個字、幾句話,要常常放在心裡想! [01′17″]</p>
<p>   所以,在談到「清淨」的這個問題上,師父說:「<p> 平常我們也曉得的,自己沒有解決問題,幫別人解決是不可能的,那麼自己解決了,那個算是清淨了。<p> 」那就是了嗎?還要有兩個條件,是哪兩個條件呢?「<p> 教理上面要有圓滿的認識,然後驗證上還有確定不疑的悟證的境界。<p> 」有了這個就可以了嗎?雖然有了這個,可是在說法的時候,也還有對機的問題。接著就舉個例子大家還記得師父舉的例子嗎?一個大學者,學識非常地淵博,如果來幼兒園看看大家,比如說我們妙慧童子園,那大學者會給我們講什麼呢?如果完全講他的論文,或者說他很深的造詣的最高境界,小孩是完全不知道的。 [02′16″]</p>
<p>   就像我以前還是學生的時候,去聽過一個橋梁專家的分享。他建過很多很多橋,但是他沒有給我們講建橋要經過怎麼樣怎麼樣的程序、設計圖,他只是給我們講:「哎呀,現在的人真是鋪張浪費呀!一個屋子建得好好的,然後賣給另一個屋主,那個屋主一進來,把原有的屋主建的東西全部都砸了!然後他自己重新裝潢一遍。」他說他住那個單元,非常不巧,樓上賣了新的、樓下賣了新的,然後左邊又賣了,乒乒乓乓,每天都在敲東西,走廊裡全部都是麻袋!他說:「一走出來就不高興,因為走廊裡全部是麻袋,而且有灰塵。現代人活得實在是太過奢侈了,不惜福啊!」他說:「我們小的時候,那個地板鋪得那麼好,有一條木板都得拿回去好好地珍惜著、想用它幹個什麼;這地板鋪得好好的,嘩啦嘩啦就全部都都拆了!直接變成垃圾了。」他說他真的有點跟不上這個時代了。他當時給我們講的是這個,沒有講橋梁。 [03′28″]</p>
<p>   我們回來說:我們為什麼去見橋梁教授呢?就想聽一些關於橋的知識,因為我們對橋完全都不了解——怎麼建大橋啊?哪座橋怎麼輝煌啊?它是怎麼建的?比如說我們就特別好奇那個橋墩要紮在那麼深的水裡邊,最初要什麼機器才能鑽那麼深,在那個淤泥中要把橋墩立住。橋梁教授完全沒有告訴我們,只告訴我們不要浪費! [03′56″]</p>
<p>   所以大家回去就有點失望,在討論心得的時候,我們都不太講話。後來說:「不是師父教我們觀功念恩嗎?我們好像現在都在觀察過失,說橋梁教授沒有教給我們建橋的知識。」然後有的同學就說:「你掌握了建橋的知識又有什麼呢?還不是出去誇海口說:『我見到了某個橋梁教授,我知道哪個橋、哪個橋他建的,經歷了什麼故事......。』一個年輕人學會節約、學會簡樸、學會老一輩的這種傳統,會不會是我們更需要的?」那時候我們的心就靜下來,覺得我們這次去聽那個橋梁教授的分享,他確實是為我們考慮給我們講的,可能是想要建設我們心中精神的大橋吧!通向物質簡樸、精神極度豐美的一座大橋。後來我們就覺得那個教授有點深不可測了!所以師父這裡講對機的時候,我想起了以前的那件事。 [05′01″]</p>
<p>   那麼對於一個善知識來說,師父在這裡邊說:教理上有印證、悟境上有,然後說法一定要對機。大家可以看看:對「軌範語淨」,如何說法這件事的傳承還是非常嚴格的! [05′19″]
<p>   在今天的研討開始之前,大家還是要皈依發心,用皈依發心的偈子,讓我們所聽聞《廣論》的這個善行成為聽聞正法的資糧。因為有了皈依之後,如果用一個希求於遍智佛果的發心的動機來聽,它將會成為大乘的資糧。所以要非常非常習慣去串習,每一次聞法或者每一次做善行,甚至每一天起來之後,要有一個大乘的動機活過這一天。 [00′40″]</p>
<p>   上一節課我們學到:「<p> 此中總攝一切佛語扼要,遍攝龍猛無著二大車之道軌。往趣一切種智地位勝士法範,三種士夫,一切行持所有次第無所缺少。依菩提道次第門中,導具善者趣佛地理,是謂此中所詮諸法。<p> 」接著,「<p> 此中傳有二派釋儀,勝那蘭陀諸智論師,許由三種清淨門中,詮釋正法。謂軌範語淨,學者相續淨,所說法清淨。後時止迦摩囉室囉,聖教盛行。<p> 」那麼現在我們就可以聽師父在舊版《廣論》帶裡講的「學者相續淨」這一部分。 [01′35″]</p>
<p>   那麼還有「學者相續淨」。所有的一切法流傳在世間,不僅僅說有老師就行,還要一定有學的人,這個很明白。不但是菩薩、祖師,我們佛也是一樣,佛出世的時候,那個時候同時那個弟子也來。因為一定有這樣想學的人,所以應這樣的機,然後說這樣圓滿的教法。那個時候如果沒有這樣相應的機的話,他雖然他自己有正確的內容,但是他不一定有機會說出來。就是佛本身就是如此!他不是說得很清楚嗎?我所了解的法啊就像大地土,但是我說的法如爪上土。所以通常啊,都是有一個因緣,那個時候佛才說呀!所以,如果說一個法流傳的話,除了老師這個條件以外,學者這個條件也是相當重要的。就像剛才那個故事也是一樣,這個大學者跑得來,跑到幼稚園,跑到小孩子那裡去,對不起!學者的相續不淨,他就沒辦法把圓滿的教法拿給我們。 [03′06″]</p>
<p>   在這一段,師父說:「<p> 所有的一切法流傳在世間,不僅僅說有老師就行,還要一定有學的人。<p> 」說:不但是菩薩、祖師,我們佛也是一樣,佛出世的時候,那個時候很多大弟子就跟著來了。一定會有想學的人,就應這樣的機,說這樣圓滿的教法。 [03′35″]</p>
<p>   這一段每次看到,還是很感慨的,就會感謝那些千千萬萬跟著佛菩薩一起學習的佛弟子們,還有傳承祖師的弟子們。因為如果沒有他們跟著佛菩薩學習的話,我們現在也聽不到這樣的法。我們也看到很多論,都是有哪個大弟子、哪個大弟子請上師說,然後他上師就開始寫那部論,所以學的人是很重要的。 [04′15″]</p>
<p>   師父接著說:「<p> 如果沒有這樣相應的機的話,他雖然他自己有正確的內容,但是他不一定有機會說出來。就是佛本身就是如此!<p> 」舉了佛陀說他了解的法就像大地土一樣,但是他說的法就像爪上的土。 [04′34″]</p>
<p>   這一點,在跟師父學習的時候也有發現。師父天天誦《般若經》,所以師父實際上他自己非常非常喜歡學空性,或者跟別人討論空性。但是因為我們剛剛開始學《菩提道次第廣論》,師父就示現沒有給我們講〈毘缽舍那〉,其實師父自己一提到空性的部分是非常非常歡喜的。 [05′02″]</p>
<p>   那個時候,比如說三十年之前,或者二十年之前,如果把〈毘缽舍那〉講給我們的話,我們可能不知道在說什麼。像現在學了五大論之後,才知道四部宗義、分多少種見解;然後層層遞進,所破是什麼、自己的立宗又是什麼、修行空性的次第又是什麼。也可以清楚地感覺到,實際上沒有前面的道次第,比如說業果見不堅固,怎麼去聽聞空性呢?如果連親近善知識的軌理也不知道,那麼我們也沒法跟一個善知識聽空性,沒法親近大乘善友。 [05′48″]</p>
<p>   所以想一想,第一批來跟師父聽法的那些居士們,真的是很感恩他們!因為如果最初沒有他們跟隨在師父身邊聽的話,可能也就沒有現在這個僧團,也沒有你我現在還在學習著這麼清淨圓滿的教法。所以真的要頂禮那些從一開始就跟隨在師父身邊學習《廣論》的出家人、居士們。 [06′20″]</p>
<p>   在跟師父學習的時候,也會發現師父就在一件事上可以揭示出三士道的內涵,甚至可以再往上去講,都是像行雲流水一般。但是為什麼有的時候師父就某一個點去講了呢?因為再講深了大家是聽不懂的,還有的時候是沒有什麼希求心的。比如說我們學的人,當我們去見善知識的時候,都有一個自己想問的問題,都有自己想要的一個事情。有的時候師父講的問題,就跟我們想要的完全是不一樣的!那時候可不可以倒空自己的杯子,認真地去領受師父的加持呢?其實很多時候我們比較在意自己想要的是什麼,所以「學者相續淨」這件事也是一件不太容易的事情。 [07′07″]</p>
<p>   什麼叫「學者相續淨」?為什麼那蘭陀寺的諸大智者們把學者相續淨擺在傳承教法這麼重要的一個位置、作為這麼重要的一件事?傳承的規矩就是這樣。我們看一看自己的所求,每天看自己最想要得到什麼,大概就可以知道。這也是對於弟子們的一種要求,《廣論》後面也會講更詳細的。 [07′37″]</p>
<p>   很感謝跟佛陀學的、跟大善知識學的那些弟子們,如果沒有他們拚命地努力學的話,我們豈能聽到這麼圓滿的教法呢?那時候一定是呈現圓滿的機,所以這個圓滿的教法才會流傳下來。頂禮諸大善知識,還有他們的弟子們!有了他們,教法才能傳到現在,傳到你我的耳邊,傳到你我的眼前,傳到你我的心中! [08′08″]
<p>   接下來我們再聽師父講的那個譬喻。<p>   這裡我也可以用一個比喻來說一下,所謂比喻是個故事。相傳我們中國歷史上兩位名人:寒山、拾得,以及豐干禪師。他們三位,一個是阿彌陀佛,一個是文殊菩薩,一個是普賢菩薩。結果寒山、拾得兩位大士所現的是什麼?唉!一個破和尚,窮叫化一個,什麼都不認識的。他為什麼這樣現呢?就是那個時候現出來的相是禪宗傳的時候。禪宗的特質是什麼?要主要的見到那個本來面目,換句話說,空性。它掃一切法的,實際理地是一塵不染。所以他自己現這個相,就是什麼?窮得身無立錐之地啊!所以通常我們那個叫化子,窮得連他站的地方像一個錐子那麼一點點都沒有,就這樣,他所現那個相。他所以現那個相,是跟那學者相應的,這我們要了解。所以如果這個地方教法盛傳的時候,除了這個老師以外,這個學者還要有這樣的條件。 [01′32″]</p>
<p>   這一段師父是在講「學者相續淨」。就是說我們學的人如果沒有這樣一個資糧、這樣一個根機的話,實際上善知識很多法也是講不出來的。講到這裡,按著我們的思路,好像應該講一個很相應的弟子的故事,比如說種敦巴大師怎麼樣去請阿底峽尊者。但是在三十多年前,師父從老師的角度講,比如說那時候禪宗傳得比較鼎盛的時候,阿彌陀佛、文殊菩薩和普賢菩薩,示現成了什麼都不認識的——師父說一個和尚窮得沒有立錐之地,這樣的一個善知識的行相。為什麼呢?因為那時候在學空性啊,實際理地要一塵不染,所以就現這個相——窮得沒有立錐之地。現這個相是為什麼?就是跟那個時候學的人相應的。 [02′36″]</p>
<p>   每次看到這種公案都有點膽顫心驚,不知道你們是怎麼想的?因為我們常常就是會把別人當凡夫,這種心思是很普遍的,好像覺得別人沒有什麼了不起的。但是萬一碰到這種佛菩薩示現的,就像普普通通的很多人,甚至表現出他受教育的程度還沒有你高的時候,你很難想像他有什麼高深的證悟。當這樣的一個善知識來到我面前的時候,現在想一下:窮得沒有立錐之地的這樣一個出家人站在我面前的時候,我們是否能夠現起那樣的敬意、恭敬心啊?但是為什麼那個時候這樣的老師出現,那樣的有情會現起敬意呢?會生起信心呢?大家可以想一想。 [03′32″]</p>
<p>   還有的時候,有的人比如說比較相應神通,當你表現點神通的時候,他就覺得是很了不起的,但是很多大德是很不贊成這種說法的。因為他們認為神通是「聖末邊事」,真正的是要建立正知見;大家要學會持戒、建立業果見,免去惡趣的痛苦,然後建立無自性、一塵不染的空性見,想法去解決輪迴的痛苦,因為這兩大苦嘛!佛法終究是建立在一個令自他解脫痛苦,達到最完美快樂的這樣一個目標。 [04′16″]</p>
<p>   所以不是要顯得自己多偉大、多了不起,要在別人面前高出一人,都不是這個目標!就是為了非常踏實的離苦得樂這樣的目標。是離什麼樣的苦呢?所有的苦。得什麼樣的樂呢?最圓滿、最圓滿的快樂,完全沒有一絲絲痛苦染雜的快樂。不像我們現在感受的快樂只是壞苦,就是一個苦的漸息滅位,它是有對比性的,跟可能最苦的狀態比起來這是快樂的。但那種快樂完全是沒有可比性的,如果它是一棵樹的話,從樹根到樹幹、到枝葉、花果,全部都是快樂的。 [04′58″]</p>
<p>   師父也會常常講他生命裡遇到的那些很神奇的人,我們在旁邊聽的,有的時候是很害怕的!因為貌似凡夫的一個人,他可能是佛菩薩示現的。所以學了這一段之後,我在想師父舉了這樣一個譬喻,在提醒我們什麼呢?佛菩薩有萬千的示現哪!就像觀世音菩薩他所化現的也是「當以何身得度者,即現何身而為說法」,都是根據我們弟子的根機這樣示現的。所以我們內心裡對一切境都不要抱持著輕蔑的心,尤其是對殊勝境,要好好地虔誠求法,把我們學者的相續——就是我們的心續,從動機到加行、到結行要努力地清淨。真的就是只為正法而親近善知識,只為法來。這樣我們才能慢慢地、慢慢地從善知識示現的一點點、一點點,看到他還沒有示現出來的那些不可思議的、不可勝數的功德,還有那些證悟力。 [06′24″]</p>
<p>   比如說大家都知道師父倡導有機,在二十多年前,有機沒有現在那麼普遍,而且做有機的人多半血本無歸,是非常艱難的一件事情。一位出家人這麼關心土地的農藥問題,關心河流、土壤,還有大家吃到嘴裡的是什麼;乃至在地上匆匆爬過的小蟲,牠爬過的土是不是傷害了牠?還有空中的飛鳥、水裡的游魚。師父就用一個有機的概念,去饒益這些墮落在三惡道的有情,想要照顧牠們。而且也不是他一個人發心照顧就可以了,還努力地帶領我們這麼多人一起發心;不是為了自己今天吃一個無農藥的東西然後來種有機,而是為了修慈悲心、不要去傷害有情,不要去破壞環境。因為環境一破壞了之後,人也走投無路了,人也沒有地方待了!所以現在看看二十年之後有機這麼普遍,有很多人種有機,種著、種著就來學《廣論》了! [07′38″]</p>
<p>   有誰想到一個大德、一個高僧要這樣示現,去研究怎麼種菜種得大家吃得很好,然後因為這個原因還讓大家學到了清淨圓滿的《菩提道次第廣論》這樣完美的傳承!還有師父辦學校,很多很多的示現,不都是應我們現在這個時代的需要、應我們這些弟子的需求,然後他來引導我們要怎麼做。所以對我們來說,我們就要用最清淨的發心跟師父一直學下去,才不會辜負大善知識為了教導我們所示現出來的種種利生事業。 [08′32″]
<p>   接下來我們要聽「所說法清淨」這一段。在聽聞之前,大家要端正自己的發心,用皈依發心那個偈子提起自己的動機也可以,或者用《廣論》前面那一段提也是可以的。哪怕只有半小時或者四十分,我們都要為了利益無窮無盡的有情去希求佛果;為了證得那樣遍智的果位,我要知道證得那樣遍智果位的因是什麼;那麼要了知那樣的因就必須聽法。所以我們現在在一起研討《菩提道次第廣論》,實際上是為了一個徹底地、究竟地令自他都離苦得樂的目標,所以這一刻對我們的生命來說是非常莊嚴的。請大家能夠認真地聽! [01′00″]</p>
<p>   然後有了這個條件以後,第三個,所說的法要清淨。為什麼法要清淨呢?這個法也說,應機是一種。還有一種呢?它那個法當中有一種應機應小的,有一種應大的;有一種性宗、有一種相宗;儘管它是大的,應它的局部的。我現在拿佛經來說個比喻。佛經說了這麼多三藏十二部,譬如說《金剛經》,它也是說:啊!這個最上乘、最上乘;《楞嚴經》,通常我們說這種都是好得不得了,為什麼它不是圓教呢?因為它就是針對著這一類根性的,是!這是大乘,可是他大乘是大乘啊,對不起,小乘的漏掉了。然後那對這個人天五乘的人又不相應。如果說性宗的話,相宗又不相應;相宗的,那性宗的又不相應,這就不圓滿了。所以啊第三個,這個圓滿的內容,還要有它特殊的內容,它三樣東西有它特別的條件。噢!那個是那蘭陀寺。 [02′15″]</p>
<p>   在這裡邊師父說:「<p> 所說的法要清淨。<p> 」接下來提出一個問題說:「<p> 為什麼法要清淨呢?<p> 」就列舉了要「<p> 應機<p> 」 :有應機小的,有應機大的;有性宗、有相宗;在大乘中,還說有的儘管它是大的,它是局部的。在佛經中三藏十二部——浩如煙海的佛經,比如說《金剛經》,說是「<p> 最上乘<p> 」;那麼《楞嚴經》也都是「<p> 好得不得了<p> 」。但師父說:「<p> 為什麼它不是圓教呢?因為它就是針對著這一類根性的。<p> 」 [02′57″]</p>
<p>   比如說很多很多人都相應念《金剛經》,但是念了《金剛經》之後到底能不能懂《金剛經》?自己覺得懂了嗎?我問過很多誦《金剛經》的人,有的人覺得懂了,可能也有待參考,但大多數的人都覺得是沒懂的。沿著《菩提道次第廣論》的次第來說,它是在發菩提心後面才學毗缽舍那,所以一定是大乘發心之後再去取證空性的果位——登地。 [03′33″]</p>
<p>   如果有個老師去教的話,可能會把那其中隱在的意思就講給我們,我們自己看的時候是看不出那條隱在的線的。所以師父在這裡面提出了「應機」。應機,就是像一個小朋友就要吃兒童餐;病人要吃比如說不要太油的、不要太辣的、對他的養病很好的;什麼階段的人都要根據什麼階段吃那樣的飯。所以這就是一種佛菩薩還有我們的善知識為我們調製的法味。所以「所說法清淨」就包括了應機。 [04′14″]</p>
<p>   在應機這裡邊師父又提出了:雖然說有的是小乘的、有的是大乘的;在大乘裡有的也是講大乘局部的,那麼還是沒有圓滿。要是有圓滿的內容,還有它特殊的內容。我也在想:師父說的特殊的內容是什麼呢?是指由顯入密嗎?這是我的一個疑問。所以在這個「法清淨」裡邊,師父就特別強調了「應機」,到後面這幾句話強調了「圓滿」。 [04′54″]</p>
<p>   在《廣論》裡,有下士、中士,然後上士。宗大師說:無論是怎樣的,都請從共下士道開始修起。如果我們的心續中已經有共下士道的內涵,那麼我修共下士道就會很快,它也不會耽擱時間。可是萬一直接就修上面的,比如說直接上手菩提心、上手空性,可是我們連因果、皈依都不知道,都沒有堅強的這種信念,修後面那肯定是修不起來的!那什麼樣根機的人都請從最初的道次第開始修,這樣的話就不會漏掉什麼。比如說前面的次第沒有的人,如果不從前面的次第起修、修後面的話,後面修不起來,前面又落下了,兩邊都是空的。可是如果都是從共下士道起修的話,無論是何種根機的人,如果已經有的就更快速地生起,如果沒有的就從現在開始修。所以它是圓滿的教法,「三根普被、利鈍兼收」。所以對我們來說,是非常美好的一個相遇! [06′07″]</p>
<p>   其實這一段我看了很多遍,我在想師父到底要告訴我們什麼呢?讀著、讀著,總是會感受到師父希望我們能夠學到圓滿、清淨的教法。圓滿的教法是那麼地可貴,因為會把我們引導到一個大乘法的法脈之中,讓我們從一開始就要注意自己的發心,注意到其實我們學佛是為了成佛這樣一個目標。並不是為了得一點人天的快樂;也不是以一己之力超離輪迴為目標;還要去兼顧以所有如母有情離苦得樂為唯一目標這樣的一個純粹發心。要在很多時候淬鍊這樣的發心,用推理的也好,用什麼樣的角度也好,反覆地去觀察自己的內心、策勵這樣的發心。 [07′06″]</p>
<p>   舉了這麼多大乘、小乘的經典,在這所有的舉例之中,師父很顯然是希望我們能夠好好地珍惜值遇圓滿教法的機會。因為它從我們一開始什麼也不懂,像個小朋友一樣,連聽法都不會、連找善知識也不知道,從這樣的一開始教我們,一直到後面的成佛,所有的道次第都沒有缺少的這樣一個圓滿的教法,能夠值遇到是何其殊勝! [07′39″]</p>
<p>   那麼「所說法清淨」,在這裡邊所說的法清淨——應機。如果不是大乘根機的人,我們從前面開始學著、學著、學著,老師天天地講、天天地講,說:「大乘多美好!」我們如果能夠累積到那樣的資糧,對善知識的法語能夠信受,然後資糧不夠的就積聚資糧,有業障的就懺悔,慢慢把自己的根性熟成大乘根機,也不是不可能的事情。 [08′12″]</p>
<p>   師父給我們展現了無限的希望!在琳琅滿目的教典之中,到底什麼是配我們的根機、什麼是配我們的胃口的?一定是最圓滿的教法!因為我們沿著最圓滿的教法,會一直走向佛地。如果我們遇到這樣的教法,再遇到引導我們圓滿教法的大乘善知識,那麼我們修信念恩、亦步亦趨地跟隨他,慢慢地或者迅速地淨化自己相續裡那些跟圓滿教法不相應的所有的雜質、所有的違品,我們自然會令師父越來越開心吧! [08′54″]
<p>   接著我們要聽:「<p> 彼諸智者,則許三種而為初要<p> 」。<p> 彼諸智者,則許三種而為初要。<p>   那個地方那些大菩薩、大祖師們哪,就說上面那個東西只是一個基本,除了這個以外還要其他的。那麼他又怎麼說呢?他說的是下面的。也許在這個地方我們會想:哎呀!那到後來的時候,豈不是比前面的更精采呀?這個概念我們要了解,並不是說後面的比前面的更精采,而是說後面的對適應後面的人來說更適應,這個是根本——一切法真正的重點,是應機才是重要的。所以同樣地,當初那蘭陀寺的三種法門,是應他們的三種法門的條件,是這個樣;後來的人由於機不太一樣了,慢慢地每況愈下。所以說,就正法而像法、末法,這個機比較差,所以要求的條件越更多、更嚴密,這是它的不同。否則的話,我們又說:「哎呀,後面的好啊!」妄判是非,不知不覺當中就會造成功不應理的取捨。那麼他下面怎麼說呢? [01′30″]</p>
<p>   在這一段裡邊,師父說:那些大菩薩、大祖師們,說上面只是一個基本,除了這個還有其他的。這個時候師父舉出了我們內心中的一個想法,說:「哎呀!會不會到後來比前面的更精采了吧?」然後師父說:「<p> 我們要了解,並不是說後面的比前面的更精采,而是說後面的對適應後面的人來說更適應,這個是根本——一切法真正的重點,是應機才是重要的。<p> 」所以同樣地,那蘭陀寺的三種法門,說應他們的三種法門的條件,是這個樣子;後來機不一樣了,就變成後面那個樣子。 [02′20″]</p>
<p>   師父一直擔心我們會認為是不是後面的好、前面的不好呀?然後再加四個字說:「<p> 妄判是非。<p> 」就是說不要覺得那樣是不好的、這樣是好的。為什麼呢?因為如果是這樣的話,我們認為不好的我們就會丟掉它、不敬重它,所以師父不希望我們在「<p> 不知不覺當中就會造成功不應理的取捨<p> 」。不應理的取捨會做什麼呢?就會造罪呀!因為都是法的傳承。如果我們起心動念中有一個輕慢的心、不敬的心,或者認為它是不對的心,但是事實不是這樣的,因為那都是祖師、佛菩薩留下來的,這樣的話我們就對法造下了一個不好的業。而這個不好的業在我們的心續裡成熟的話,是很可怕的! [03′10″]</p>
<p>   在這一小段的解釋裡,師父非常小心地呵護著我們內心的善根,就像慈母牽著一個小孩走路一樣,讓我們心中的每一個念頭走向正念、走向如法,千萬不能跌倒了,讓自己的善根受傷。所以在這一小段的解釋裡邊,師父非常殷重地講了好幾次:不是說前面的不好,而是後面的應機。 [03′40″]</p>
<p>   在聽《廣論》的時候,會常常聽到師父對我們內心中的一些念頭直接作取捨。慢慢就學會用他的思路、他的判斷去判斷內心的一些事情。這樣跟著師父聽久了之後,你會覺得真的有一種慧力被提升的感覺。因為我們不辨取捨就是沒慧力,但是常常跟著師父學習正確的取捨,取捨久了之後,就會發現對一些事情的取捨就俐落多了,沒有一直猶豫在那個灰色地帶。所以在這點上,師父教導我們對於傳承、對於教典的殷重態度,是我們應該效學的。 [04′25″]</p>
<p>   接下來聽下一段。<p> 謂正法造者殊勝,正法殊勝,如何講聞彼法規理。今於此中,應如後釋。<p>   這個分成功:第一個作者殊勝,那就是前面的軌範語淨;第二個正法殊勝,這個法本身正確。還有呢,有了這個造者,這個造者當中包含了一定有什麼?這個教者、學者這兩樣東西在這裡面。沒有這兩樣東西的話,他這個「造」不可能、不可能,這第一點。所以這兩個含攝了,那麼說的又殊勝,在這個地方多的有什麼?怎麼講、怎麼聽這個道理。這個道理非常重要、非常重要!下面哪,等一下講到那個四個題目的時候說它。現在我在這裡,說就用什麼?就用後者那個辦法,用後者那個辦法。現在我們這地方就停一下、休息一下。 [05′38″]</p>
<p>   師父說:「<p> 作者殊勝,那就是前面的規範語淨;第二個正法殊勝,這個法本身正確。<p> 」有記得吧!有在看嗎?還有在這個造者當中,師父說包含了什麼呢?提了一個問題:我們在想「正法造者殊勝」,好像就是創造正法的人啊!可是師父提出了兩個——教的和學的,這兩樣東西都在裡邊。其實這個提法是會石破天驚的,我們沒想過吧!在很多年前,《廣論》聽到這裡的時候真的有點驚訝:造者是包括教者和學者兩樣東西在裡邊? [06′23″]</p>
<p>   師父接著說:「<p> 沒有這兩樣東西的話,他這個『造』不可能、不可能。<p> 」然後想一想是應理的,沒有教的、沒有學的,怎麼會有正法出現呢?怎麼會有這樣的一個造者出現呢?他前面一定是跟他的老師學,學會了之後一定要往下教。現在像我們僧團的五大論班,最高班的一開始都是學習五大論、衝擊的第一班,第一班學了之後就要教底下的班。然後在反覆、反覆地給其他班上課的過程中,就像各位班長帶班的時候,你知道帶的班越多其實受益的就是自己。因為你會一遍一遍地重複學習,而且各班都有進度,你不敢懈怠,在上課之前你一定要好好地熟文,深刻地去看師父這個義理是什麼,乃至義理背後所指的內涵是什麼。所以在貌似帶班,或者說給別人講的同時,實際上自己是一個非常非常努力懇切的學生、會不停地發現自己很多問題的一個學生。 [07′36″]</p>
<p>   所以,在貌似教別人的時候,實際上自己要好好地學。像跟隨在師父身邊學的時候,我也非常非常認真地看師父是怎麼帶別人、怎麼教別人的。那個時候就會發現,師父給他講一個道理,一定會告訴這個出家人下腳的一步是什麼、腳下最踏實的那一步是什麼,那一步一定是他可以踏上去的,而且是他可以感受到的。 [08′04″]</p>
<p>   所以跟在師父身邊學習的時候,我會覺得佛法非常地親切、非常地擲地有聲,是非常真實的。因為每天每天在我們的二六時中,會不停地觸及到自己的內心、觸及到佛陀的教言、觸及到祖師佛菩薩的這些語教。然後我們拿這些語教數數地針對自心的時候,我們就自然會感受到佛法的力量。什麼力量啊?調伏心續的力量。怎麼調伏啊?把那個被痛苦、被各種煩惱逼迫得快抓狂的心,讓它一次又一次地清淨下來,讓它一遍又一遍地回歸在正路上。這就是一個用法來調伏的過程。 [08′49″]</p>
<p>   正因為跟在師父身邊學,看他是怎麼樣講,又怎麼樣地帶人的,一個弟子跟上師學的時候也會學到這些。所以我會發現學的、教的這兩個,真的是完美地融合在一起,什麼也不能缺乏的,就像一個宇宙一樣,是非常非常地遼闊和恢宏的。所以當師父從這樣的角度去講的時候,其實內心是滿震撼的!不知道你們是怎麼想的? [09′24″]
<p>   接著師父說含攝了之後,「<p> 那麼在這個地方多的有什麼?<p> 」就是「<p> 怎麼講、怎麼聽這個道理。這個道理非常重要、非常重要!<p> 」連著兩個,凡是師父說到「非常、非常」兩個或者更多個的時候,我通常就在這個地方停下來。「怎麼講、怎麼聽這個道理非常重要!」其實到現在為止也是這樣,大家每次聽之前有沒有作正式的發心啊?聽聞軌理有沒有憶念呢?因為聽聞軌理的那些修為沒有在自心經過紮實地修鍊修起來之前,都得要串習呀!因為不串習就忘了。 [00′40″]</p>
<p>   我們每天的日程都排得很多,如果到了聽法的時間沒有做好聽聞軌理,就等於這個程序是不對的。這個程序是不對的話,到時候就像師父常常用做飯的例子,做飯的程序不對的話,做出來東西就是沒法吃的。那我們聽聞佛法也要注意它的次第,和它井然有序的這個家風啊!如果每次都不注意聽聞軌理,那麼由於聽聞正法所得到利益那個部分就會受損,所以這個算帳是很清楚的!就像如果一個醫生給病人作手術的話,那多少道程序?一條一條的,那一個都不能差的!就比如說洗手這件事是非常平常的,進手術室之前的醫生洗手那真是非常徹底的!然後多少種手術器具要什麼、要什麼、要什麼,那都不能缺的。因為觀待著一個人的生命和健康呀! [01′35″]</p>
<p>   那麼我們聽法也是為了法身慧命,所以聽的時候就老老實實地沿著聽聞軌理去串、去修;要去說法的話,也要按著講說軌理,完全放好自己的動機、清淨好自己的動機。不能是為了名聞、利養或者為了什麼,只能是為了能夠淨化自己的相續,為了這個法能夠淨化有情的相續、離苦得樂、為成就無上菩提這樣的目標。 [02′05″]</p>
<p>   所以,這裡邊的字句雖然是不多,但是一字千金哪!這個部分都是善知識非常、非常注重用心的部分。我們學的時候,如果也能夠用心體會的話,其實也就像跟在師父身邊一樣的,就像認真地去師父的小佛堂跟他請益,然後師父就是這樣講的。 [02′33″]</p>
<p>   「今於此中,應如後釋」,這一段師父在新版的《廣論》中也有一段,大家可以聽一聽。<p> 今於此中,應如後釋。<p>   現在宗大師說,我現在這兩種當中,用的哪一個?用後者。表示他那個法,都是有他一定的傳承。 [02′57″]</p>
<p>   那麼然後呢,另外有一點意義我們也不妨說一下。前面是那蘭陀寺,這麼殊勝,那後來為什麼會慢慢地變,變到這個止迦摩囉室囉寺這樣起來呢?這也就是說,世間本來是無常相,還有呢,因緣一直這個會變化的。所以,以前的人根性具足,因為根性具足條件都好,所以你簡單一點就可以了;後來的人條件差,這個簡單的不夠,所以要更確實的內容。因此在這個地方嘛,我們了解了以後,我們不必拿我們現在的眼光去看哪一個好、哪一個壞。世尊說法沒有不好的,不同,只是根性不同而已,這種根性的人以這種方法、那種根性的人那種方法。然後呢,整個時代來說,向前跟世尊相應那種的條件好,所以不妨說得簡單;後來的人要同樣的內涵的話,就應該更多一點。這是我們附帶的,但是這個也並沒有一定的特徵。總之,從這個多方面去思惟觀察,我們能夠找到我們自己相應,這個才是真正重要的。  [04′25″]</p>
<p>   好!在新版中,師父說:宗大師說,我現在這兩者當中用哪一個呢?用後者。表示那個法都是他有一定的傳承。說宗大師這樣的說法是有傳承的。還有另一點意義,師父說要說一下:「<p> 前面是那蘭陀寺,這麼殊勝,那後來為什麼會慢慢地變,變到止迦摩囉室囉寺這樣起來呢?<p> 」師父接著說:世間本是無常相,因緣一直都在變化的。所以,以前的人根性具足,根性條件都非常好,簡單地說一下就明白了;後來的人條件差,簡單的不夠,需要更多一點兒的內容。那麼到底是哪一個好呢?師父的結論還是這樣的:世尊說法沒有不好的,不同,只是根性不同而已。這種根性的人就用這種法,那種根性的人就聽那種法。然後呢,整個時代向前就跟世尊相應的那個條件好,所以就簡單一點,然後向後就多一點。 [05′40″]</p>
<p>   在這個講完之後,師父說:「<p> 總之,從這個多方面去思惟觀察,我們能夠找到我們自己相應,這個才是真正重要的。<p> 」這句話是什麼意思呢?就是怕聽了法之後,我們就像在舊版講的那樣——妄判好惡,說:「啊!這個好、那個不好。」實際上,能夠找到自己相應的,從中受益,完成正法對自己相續的饒益,才是真正重要的。這也是為什麼會有傳承的根本原因。因為傳承就一直傳遞下去,才會饒益到慢慢的根機走上來的所有的有情,包括你我。 [06′26″]</p>
<p>   在這一段的解釋裡,師父還是跟前面舊版的是差不多的。在這裡邊有個無常的相,還有人的根性的轉變,這揭示出:不要用自己的眼光去看哪一個好、哪一個不好。說:「<p> 我們不必拿我們現在眼光去看哪一個好、哪一個壞。<p> 」那我現在只有這樣的眼光啊,我不用現在眼光去辨別的話,好像也沒有什麼其他的眼光辨別,那怎麼辦呢?所以要親近善知識啊!要學習用清淨的、正確的抉擇慧去抉擇,不要妄加分別。取捨要正確,所以要聽聞正法、要親近善知識,正因為自己不行所以才要學。因為這前面還有一句話說:「<p> 我們了解了以後,我們不必拿我們現在的眼光去看哪一個好、哪一個壞。<p> 」所以前提是說:沒了解的時候,就會拿自己的目光;了解了之後,就會去找自己相應的,會對於正法普同恭敬、普同供養,用殷重的心來學習、來傳承。 [07′38″]</p>
<p>   師父在此處還是要教導我們,用一個樸實的、真正地拿法來饒益自己的心續,也令他人饒益的這樣清淨的動機來學習正法。不要上來挑毛病,這裡不行、哪裡不行,然後挑了一堆之後自己什麼也沒得到,可能還造一堆惡業。那你說:「明辨取捨是挑毛病嗎?」跟這完全是不一樣!明辨取捨是透過辨析教理,讓自己的慧力越來越犀利。慧力變得越來越犀利,抉擇什麼呢?比如說抉擇教理呀!拿抉擇的教理再抉擇內心啊!最終要把我們生死中的自性執抉擇掉,然後達成無死的、清涼的那樣一個美妙的生命境界。而且在這之前要大乘發心! [08′34″]</p>
<p>   所以,師父還是在在處處提醒著我們要銘記傳承的正法它最實惠的作用,就是要令我的心續能夠得到正法的饒益。而且如果只發這樣的心,說正法只饒益我自己還是不夠的,要拿法來利益所有、所有的人。那麼怎樣才能夠拿法利益所有、所有的人?一定要去希求遍智的果位!所以每每在聽師父的講述的時候,總被他的心意所感動,因為在字裡行間,都會讀到他小心地令我們的善根每一步、每一個念頭這樣地成長,應該說是悲心切切吧! [09′28″]
<p>   大家好!又到了我們學習全廣的時間了。今天我們會學習《四家合註》和《四家合註入門》。現在請大家把《四家合註》翻到 94 頁,我們來一起看文。<p>   在 94 頁中間藍字的部分,說:「<p> 開示釋儀當中諸智者異門者:<p> 此中傳有二派釋儀:<p> 」括號「<p> 〔<p> 勝那蘭陀<p> ,師云:此為往昔阿育王於舍利弗誕生處,所建安置大乘經函之宏偉經院。五百大乘阿闍黎、陀尊兄弟及龍樹等,皆於其中,以講聞大乘教法之門廣為拓建,為印度諸僧團中最殊勝者。〕中<p> 」括號結束。「<p> 諸智論師,許由三種清淨門中詮釋正法,謂軌範語淨、學者相續淨、所說法清淨。後時<p> 〔<p> 止迦摩囉室囉<p> ,師云:此寺於摩羯陀北方,恆河畔小丘頂上,具一百零八佛殿,內殿中央供奉與金剛座大菩提像等量之世尊像,外有圍牆環繞。安住其中諸班智達,行種種聖教事業,亦為僧伽資生極妙善處,覺窩大師亦從此處迎赴藏地。建寺者為法王達摩波羅,彼即獅子賢論師之施主。〕<p> 聖教盛行,彼諸智者,則許三種而為初要:謂正法造者殊勝、正法殊勝、如何講聞彼法規理。<p> 」再看下面的藍字,「<p> 明當隨於何規:<p> 今於此中,應如後釋。<p> 」 [02′30″]</p>
<p>   這一段說明關於「講說方式」,智者們有哪些不同的承許:對於講說的軌理,過去曾經出現過兩派的承許。一派是勝那蘭陀寺,上師說:這是以前阿育王在舍利弗尊者的誕生地所修建的一座安置大乘經函的宏偉經院。五百位大乘阿闍黎、陀尊兄弟以及龍樹菩薩等等,都曾駐錫其中,以講聞大乘佛法之門加以擴建,並且是印度各部僧團中最極超勝的寺院。解釋那蘭陀寺。那裡的智者們承許透過三種清淨的方式來解說正法,這三種清淨即是師長的言語清淨、弟子的相續淨、所詮述的法義清淨。 [03′30″]</p>
<p>   另外一派,源自後來教法極為興盛的止迦摩囉室囉寺。上師說:該寺是在摩羯陀北方恆河畔小丘頂上的一座寺院,包含了一百零八座佛殿,這是很宏偉的一座寺院。內殿中央供奉著與金剛座大菩提像大小相等的釋迦世尊像,外圍都有圍牆環繞。寺中的班智達們廣行種種不同的弘法事業,而且是僧眾生活條件非常優越的一個道場。聖阿底峽尊者也從此處被迎請到藏地。這座寺院的修建者是誰呢?就是法王達摩波羅,他就是獅子賢論師的施主。其中的智者們,則承許有三者在最初的時候是極為重要的。這三者是什麼呢?正法造者殊勝、正法殊勝、如何講說聽聞正法的軌理。說明此處依循哪一種軌理呢?就是本論會依照後者的方式來解說。這是《四家合註》裡的原文和白話解釋。 [04′50″]</p>
<p>   現在我們再把《四家合註入門》翻到 81 頁,再看也是中間藍字一行下面黑字。「<p> 開示釋儀當中的諸智者異門者:<p> 此中傳有二派釋儀:<p> ﹝<p> 勝那蘭陀<p> ,謂蘆葦塘。師云:此為往昔阿育王於舍利弗誕生處,所建安置大乘經函之宏偉經院。五百大乘阿闍黎、陀尊兄弟及龍樹等,皆於其中,以講聞大乘教法之門廣為拓建,為印度諸僧團中最殊勝者。﹞中<p> 」。 [05′28″]</p>
<p>   這個解釋,很明顯說「勝那蘭陀寺」,跟《四家合註》不一樣的就是,這有一個「蘆葦塘」,因為這是拉卜楞寺的版本,拉卜楞寺版就是這樣的。這個「釋儀」,仁波切的講記就是:接著是說明要用什麼樣的講解方式來闡述道次第呢?在印度有兩座大寺院,第一座就是「勝那蘭陀寺」——這裡邊就有語王尊者的註:所謂「那蘭陀」意思就是「蘆葦塘」,因為那裡的水池長了很多長長的蘆葦,所以拿來稱呼那個地方。那蘭陀同時也是舍利弗尊者的出生地。接下來,語王尊者的箋註說:「此為往昔阿育王於舍利弗誕生處,所建安置大乘經函之宏偉經院。」本來是舍利弗尊者的出生地,之後到了阿育王時,在這裡建造了安放許多經典的寺院。 [06′30″]
<p>   在這一段,我們可以再講一下「那蘭陀寺」。仁波切接著說:你們去過那蘭陀寺嗎?現在的那蘭陀寺已成為廢墟了,不復存在。只是有個塔的遺跡,傳說是舍利弗尊者的塔,不知道是不是真的。在公元 1193 年,突厥人叫巴克赫提亞爾.卡爾積,帶兵破壞了這座偉大的寺院,藏經閣也被破壞了。大批的僧眾只能逃往他處,從此衰落,慢慢地變成廢墟——就仁波切講的:「就是廢墟了。」在 1861 年,英國考古學家亞歷山大.康寧漢,開始挖掘這座寺院的遺物,逐步呈現這座寺院的遺跡,不然連遺跡可能都看不到了。 [01′03″]</p>
<p>   在當時的那蘭陀寺,有「五百大乘阿闍黎」和「陀尊兄弟」倆,哥哥是陀尊成就尊,弟弟是陀尊安樂主。陀尊安樂主是《勝天讚》的作者,這本書非常有名,在《丹珠爾》中都有收錄。這兩位都是印度班智達。那蘭陀寺大概是阿育王時開始有雛型,之後具德怙主聖者龍樹——就是龍樹菩薩把它擴建了,成為印度的內道教徒講聞、學習的主要寺院。「以講聞大乘法之門」,透由講說、聽聞大乘教法的方式來興盛擴建寺院,而成為「印度諸僧團中最殊勝者」。 [01′55″]</p>
<p>   關於那蘭陀寺,我想給大家再多講一點點。那蘭陀寺就是古印度佛教的最高學府,梵語義譯過來就是「施無厭」,又作「那爛陀」。施無厭就是布施沒有厭足的意思。相傳這座寺院南邊的池潭中有個龍,名字叫那爛陀,然後寺就建在那個池子的旁邊,所以就取了這樣一個稱號。如果從實際的意義來說,因為過去如來修菩薩行的時候,為大國王,建都此地,樂善布施,德號施無厭,故稱其名。這座寺院在古印度摩羯陀國北方,就是今天的拉查基爾——舊譯王舍城——北方約十一公里的這個地方。建寺由來有很多種,眾說不一。在《大唐西域記》裡邊有這樣一個記載:笈多王朝的帝日王為了曷羅社盤社比丘建的,然後歷代國王屢加擴建,最後形成了外觀宏偉、內學精湛的一座大寺院。 [03′10″]</p>
<p>   而《東噶辭典》中提到:這座寺院落成的地方,就是舍利弗尊者的出生地,為了紀念聖者的恩德,中印度及四方五位國王齊心合建出當時無有能與之媲美的佛學院。多羅那他大師則說:這座寺院位於舍利弗尊者的出生地,又是舍利弗的八萬阿羅漢弟子的涅槃處,阿育王曾對舍利弗塔廣興供養,並且創建了一座佛寺在這個地方。 [03′44″]</p>
<p>   之後大乘部最初的五百阿闍黎共同討論,說:「如果在舍利弗曾經的住處宣說大乘法,當令大乘法普傳十方。」於是就有陀尊阿闍黎兄弟開始創建寺院,他們興建了八間佛殿,收藏著當時所有的大乘經函。這是很難想像的!就是把大乘教典全部收在這座寺院裡。 [04′13″]</p>
<p>   這座寺院在七世紀的時候是印度最具代表性的佛教學府,其中藏書有多少呢?大家猜猜看,可以想像一下——九百萬卷!歷代學者大德輩出,像龍樹菩薩、聖天菩薩、戒賢論師、獅子賢論師、月稱論師等這麼多的大論師。另外大家知不知道玄奘大師是去哪裡學習的呢?還有義淨大師?玄奘大師和義淨大師,還有其他高僧,也從中國來到那蘭陀寺學習、翻譯。當時這座寺裡邊的僧眾雲集,僧眾多達多少人呢?高達萬人,是萬人的大寺喔!可以想見那上早晚課的時候,僧伽海會喔!非常地壯觀!每天有多少個講壇呢?有一百多個講壇,之後也成為金剛乘的修學中心。這就是我們傳說中的那蘭陀寺曾經的盛況。 [05′22″]
<p>   上一次我們講到那蘭陀寺收集了所有的大乘經典,有九百多萬卷經。跟法師們討論那蘭陀寺的時候,其實法師們都是心馳神往的。想想那時候印度沒有印刷術,所有的經函都是手抄本,而且主要是貝葉經,還有樹皮為紙這樣抄下來的,可是那個時候出了那麼多大成就者! [00′31″]</p>
<p>   那蘭陀寺建寺的地址是舍利弗的出生地,舍利弗是赫赫有名的佛陀的大弟子,那麼關於阿育王,我想給大家稍稍介紹一下。阿育王是佛所授記古印度的護法國王,在公元前 304~232 年間。阿恕伽是他梵語的音譯,義譯就是無憂,前世為德勝童子,他在小孩的時候就喜歡玩土嘛!玩土的時候,他是太有福報了,就看到了佛陀托缽在乞食。他看到佛陀的時候就心生大歡喜,因為一個孩子也沒有什麼可以供養的,就想:把那個土當做食物,供養給了佛陀,然後發願成為王。 [01′24″]</p>
<p>   佛陀就為他授記:於佛陀涅槃百年後這個童子當作轉輪王,統領南贍部洲,名阿恕伽,分佛舍利作八萬四千佛塔,饒益有情。此王為阿闍世王的後代,頻頭莎羅王的王子。他的母親是婆羅門女,原先他的母親為其他的後宮所嫉妒,專門服苦役,她因為善解國王的意思,後來成為了第一夫人。由於生下了阿育王以後,別人就再也不敢欺負她、不敢打擾她,可能也不敢嫉妒她了,所以就取名為無憂。好像這個小孩給他的母親帶來了幸福、無憂的生活——非常美好的一個名字。這是其中的一段關於阿育王的記載。 [02′16″]</p>
<p>   但在《印度佛教史》中又有這樣的記載,說阿育王出生於北印度的贍巴阿拿境,父親為日種國王涅米大,母親原來是商主的妻子。因為阿育王出生的時候國王消除了之前的憂惱,所以叫無憂。年少的時候他就通達了各種文學和武術,喜歡練武。因為他的前世以土供佛,所以他今生的身形鄙惡,長得不是很好,所以不為王所愛念。很奇怪!父母親會因為小孩長得不好而不喜歡嗎?有的時候因為這個小孩長得不好,父母可能會更憐惜他一些,會不會這樣呢? [02′58″]</p>
<p>   但是那個時候有個占相師是很厲害的,他一占相就知道雖然他有點不那麼好看,但是一定會成為國王,所以就暗告大臣。當時國王常常遣他去攻打其他的叛國,但是卻不給他兵器,這個時候地神就從地上湧現,然後奉上了兵器。到了那個背叛的國家之後,還沒有開始進攻,那個國家就自己投降了,於是國土就逐漸地擴大。看來是一個能征善戰的王子,天神共護。 [03′34″]</p>
<p>   後來因為宰相與太子不和,於是把相師的預言告訴了五百大臣,然後就謀殺太子,幫助阿育王登基。但是阿育王受到許多大臣的輕視、宮女的不喜,所以殘殺了五百大臣及五百宮女,百姓改稱為惡阿育王——前面有個「惡」字,看起來這段的描述是很殘忍。後來他又招了殺父殺母的這個惡人——耆梨,作了一個酷刑房,名叫愛樂獄,其中的刑法是比照地獄的。 [04′08″]</p>
<p>   當時有一個出家人,失誤就走到了那個酷刑房裡,然後馬上就會被燒或者被殺了。這個出家人就哀求說:「可不可以緩刑七日啊?」後來就被答應了。他就精進用功,在七日之中見屎尿、內臟種種不淨,生厭離心,精勤修道,證得了阿羅漢果。然後惡人以各種方式施刑,但是都不能害到他。於是就趕快去報告給國王,消息傳開之後,國王和百姓就一起觀看。然後這位阿羅漢——當初誤入這個刑房的沙門,就知道:啊!度化大家的時候到了,所以就現大神通,並且告訴國王世尊的授記。國王心生希有,懺悔前愆,然後皈依佛門——這個曾被稱為惡阿育王的就皈依了!為了除掉眾生的怖畏,他把那個刑房愛樂獄就直接毀壞掉了。 [05′11″]</p>
<p>   其後,這個國王遵從著佛的授記,召喚鬼神相助,於一日中就建造了八萬四千佛舍利塔,一天就造完了,所以人們改稱為正法阿育王。人們對他的稱呼改得也滿快的,馬上就改了。然後又迎請了優婆毱多尊者宣揚佛的功德,教化十方。阿育王自己是完全沒有慳吝心地供養佛僧,數以萬計,而且他也是見人就勸、見人就勸,勸百姓布施修福啊! [05′44″]</p>
<p>   我不知道大家有沒有被勸過要多布施啊、要多修福啊?現在看起來勸我們布施修福的,好像都是來要錢的,但是要是國王勸我們的話,我們就不會有這種心,因為覺得國王不會要我們的錢,因為他有的是錢。要是一個同行善友勸我們,我們就會覺得:欸!你怎麼老說這個事情,勸我們布施修福呢? [06′09″]</p>
<p>   阿育王晚年的時候,想要學習須達長者。須達長者那個故事記得吧?我們還把它編成了戲劇演過。他把地全鋪成金子供佛,對吧!阿育王也發願供養百億的黃金。當供養到九十六億黃金的時候,很不幸地,阿育王就生病了,而且病得很重。想想,這個國王這麼能供養,王子、大臣會有些擔憂啊!怕王庫空虛、都供出來了,所以就不再供養。 [06′44″]</p>
<p>   因為才九十六億,還差四億,但即使是拿個金盤子、銀盤子——那個侍從會端進去為這個生病的國王送食物嘛——國王仍然將金盤子還有銀盤子這些物品,告訴他的侍從去供養布施給僧眾。最後只給國王送了半顆菴摩羅果。然後國王就囑咐他的侍從去報告寺院裡的上座說:「此是國王最後供養。」這個菴摩羅果是國王最後的供養。 [07′21″]</p>
<p>   上座收到了半顆菴摩羅果之後就召集僧眾說:「你們看到阿育王統治天下受用快樂,現在大王被臣屬所控制,連自己的財物都無法自主,只剩這半顆菴摩羅果能隨意得用。」因大王以殷重心來布施於僧眾,於是上座就交代典座,將半顆菴摩羅果放入羹湯裡面,讓所有的僧眾都能夠受用,上座也就由此教誡眾僧說:「因此啊,要對生死輪迴深生厭惡!榮華富貴的快樂不久就會敗壞,權勢自在也是不久就會失去,生死實在是非常地可惡啊!」 [08′09″]</p>
<p>   後來阿育王臨命終的時候,就問他的輔相羅提毱提說:「在此世中,誰得自在?」答曰:「唯聖世尊,得大自在。」然後阿育王就合掌發願:「唯除庫藏,四海一切盡供佛僧。此生所積一切功德,不求世間人天果位,只願速成聖位得大自在。」說完他就以齒印——就是用牙咬的——去封詔書,然後就把它給了那個輔相,隨即命終。可以說他在命終之前的這個善念、這個迴向,還是非常非常令人欽佩的。所以後來這個輔相與大臣就共同商議,就把四億黃金供僧,贖回了四海國土。終於圓滿了阿育王的最後的心願。 [09′07″]</p>
<p>   赫赫有名的阿育王!聽了還是滿受感動。在他修布施的時候,最後什麼都沒有了,金盤子、銀盤子都去供僧。後來得到了半顆菴摩羅果——擁有那麼多的國土和那麼多臣民的國王,最後只給國王送了半顆菴摩羅果——他還拿那個半顆菴摩羅果去供僧,並且發願說:「唯除庫藏,四海一切,所有國土全部供僧!」正是因為他這樣說了,所以後來大臣和王子才把那四億的黃金補上。所以看一看,我們平常對於修布施有沒有這樣的精勤啊?這樣的一種布施真的是令人欽佩啊! [09′51″]
<p>   在講到勝那蘭陀寺的時候,說是安置大乘經函的宏偉經院,五百大乘阿闍黎還有陀尊兄弟及龍樹等等,都在那蘭陀寺裡邊。大家知不知道陀尊兄弟他們的事蹟呢?我可以講一下。陀尊兄弟就是指陀尊成就尊還有陀尊安樂主,他們大約是在釋迦牟尼佛涅槃後兩百年出生的。 [00′35″]</p>
<p>   下面我要講的是依據《六世賽倉大師文集》中《殊勝讚廣釋》中的內容。陀尊兄弟生於印度一戶世代信仰供奉大自在天的家庭,這個世家善巧並且愛樂行持六件事:讀誦《吠陀》典籍、令人讀誦、修習火供、令人修習火供、布施、受取六事。哥哥出生的時候取名陀尊成就尊,年幼的時候通曉總體婆羅門的《吠陀》教典,對於外道所有的典籍也都能夠通曉無疑,得到了智者的美名。他依著祖先傳下來的規矩,長時地供養大自在天。但他不僅讀誦外道的典籍,同時也讀誦內道的典籍,並且完全地通曉其中的意涵。因此他看到佛世尊的至言無倒地開示了苦及苦因,以及遮滅苦因之道,是具有殊勝意涵的教典,至於其他外道的典籍就不是這樣的。 [01′46″]</p>
<p>   到了一定的時候,他與弟弟安樂主兩個人就想:「我們平時供奉的大自在天較為超勝,還是佛世尊較為超勝呢?我們應該好好地探究,並且找人詢問。」於是他們向父親請問。父親說:「我們家祖祖輩輩都是讀誦婆羅門《吠陀》典籍,並且供奉大自在天,至於真正說來究竟是誰較為超勝,我也不知道。如果你們真想知道的話,可以到無熱惱湖畔,那兒有一座四季覆蓋著冰雪的雪山——岡底斯山。我們的大自在天以及他的妃子鄔摩天女,據說現在就住在那裡。要是你們有勇氣的話,就去那裡親自謁見大自在天,並且請示他這個問題,他會告訴你們的。」 [02′58″]</p>
<p>   於是,兩位兄弟心想:「在我們倆還沒有親自見到大自在天得到他的指示之前,我們不修任何的善根。」他們發誓一定要親自見到大自在天。於是兄弟二人就啟程前往,一起到了岡底斯山。在那裡他們看到了一處天神的林苑,裡面散落著稀奇的人天妙花、妙果、葉子,還有果實低垂的佳木,到處都是。四周非常地寬闊,令人非常地舒心、非常地悅意,景色別致,大自在天的坐騎象王就像白雲一般隨意地漫步。兄弟二人見到這樣的情景就非常地高興,並跑進去尋找大自在天所住的位置。 [04′02″]</p>
<p>   在花葉、果實低垂的樹林當中,他們看到了一位美麗可人的天女,光看一眼就能奪人心意,在她的身旁還有許多年少的天子一起摘著果實。這位天女看到他們之後,問他們說:「你們來到這麼難以前來的地方,是有什麼事情嗎?」兄弟二人便詳細地告訴天女所有的原委。天女聽了之後說:「我就是你們大自在天的妃子鄔摩,如果你們倆為了這個目的想要見大自在天的話,就跟著我來吧!」 [04′46″]</p>
<p>   他們就跟著天女走到了一片花果極為繁茂的天苑,周圍都是湖泊和水塘,各種水鳥發出優雅的鳴叫,具足八支的流水及瀑布的水氣就那樣彌漫在空中,於是出現了五彩虹霓的帳室。裡邊有一座天人的宮殿,懸掛著半滿瓔珞,矮牆、柵欄作為裝飾——那個矮牆應該是光做的吧——在透明的無量宮中,設了一個寶座,大自在天就傲氣地坐在上頭。有許多天女或者手持著孔雀翎扇、或者手持拂塵,還有彈奏琵琶的、吹著笛子的、有端來各種甘露美食的。然後鄔摩天女就交代部眾主,就是他的兒子象鼻天毗奈耶迦,說:「把這兩位童子帶到大自在天的面前。」然後部眾主牽著他們倆的手,帶他們來到大自在天的座前,他們兩位就恭敬地禮拜了大自在天。 [06′02″]</p>
<p>   大自在天說:「你們兩位來到這難以到達的地方,是為了什麼事嗎?你們想要得到什麼悉地?」年少的兩兄弟說:「我們兩個是婆羅門族人,此行來到這裡不是為了求得悉地。我們家祖祖輩輩都是奉您為導師,對於您的論典以及《吠陀》也都學習得很精通,另外對於佛陀的教典也學習得善巧、嫺熟、通達了,但是不曉得哪位導師以及誰的教典更為殊勝?因此祈請您能夠告訴我們。關於導師以及教、論、著的究竟,是誰高誰低呢?何者較為超勝,我們就想依信於誰。」 [06′54″]</p>
<p>   看一看,這兩位滿直率地就去問了這麼直率的問題。大自在天聽完了之後,就對他們說了:「如果你們想明白這件事,那就在這兒稍等一下吧!」時值正午,也就是接近釋迦佛諸比丘化緣乞食的時候,天上來了五百阿羅漢,身著褐黃色的法衣,手持缽與錫杖,就像飛鳥翱翔。他們下來的時候,就像黃色的大雁降落,到了大自在天的宮殿前面。大自在天、鄔摩天女,以及身邊的侍從,他們手持著燒香、塗香,還有各種鮮花等等的供養,恭敬地上前迎接。 [07′48″]</p>
<p>   他們請眾阿羅漢坐上了天人妙供中的舒適坐墊,接著大自在天與鄔摩天女等,供上了豐盛的百味飲食,請諸羅漢應供,羅漢得到了滿足。隨後鄔摩天女又供養了各種鮮花、水果,之後與大自在天坐在一起。接著眾阿羅漢便受供迴向,並且以布施福德作為主題而開示正法。結束之後,又像飛鳥飛上天一般,回到了他們自己的住所。 [08′28″]</p>
<p>   注意哦,這個過程應該這兩個兄弟都看到了吧!於是大自在天就對婆羅門兄弟二人說了一個偈子:「我等日日興供養,誰之弟子獲妙德,除世間過功德巍,最勝妙相遍傳揚。以大歡喜正供養,當下即若得涅槃,三界導師德無等,智者當供彼佛陀。」大自在天接著告訴他們說:「所以你們二人也要以導師佛陀世尊作為皈依呀!並且要恭敬供養佛陀的至言,以及隨學佛陀的聖者僧伽。」兄弟二人清楚了解了大自在天的意思之後,心滿意足地回去了。 [09′26″]</p>
<p>   婆羅門陀尊成就尊與安樂主兩兄弟回到了自己的家裡,他們知道了吠陀的教典以及其所開示的內容都是沒有心要的,自此就把這些棄如蔽草。而導師佛陀世尊和佛陀所宣說的至言,才是消除一切痛苦、獲得最勝解脫果位的真實方便。他們對此獲得了堅固的定解之後,就由「知功德、知差別、自受許、不言有餘」這四個層面,從內心深處皈依三寶。注意!《廣論》上也有這樣的。並且在心續當中生起了——注意!看是生起了什麼——見一切生死輪迴無有心要的真實出離意樂,於是捨俗出家而趣入佛陀的聖教。 [10′30″]</p>
<p>   進入佛門之後,婆羅門兄弟懷著對於導師大悲尊極深的誠敬信心,依著內、外道導師與教法勝劣的差別,還有各別的功德過失,弟弟安樂主以佛陀世尊勝出世間天神的論述方式,造了《勝天讚》;哥哥陀尊成就尊則造了《導師世尊如來應供正遍知佛陀吉祥勝者釋迦能仁殊勝讚》,簡稱《殊勝讚》。 [11′03″]</p>
<p>   另外在其他的史籍當中則記載:在第三次集結經典之後,大乘教法剛開始興盛,摩羯陀境內有一對兄弟名為婆羅門陀尊成就尊以及安樂主。他們兩位都精通內、外道的教義,但是哥哥心中懷有疑惑,覺得大自在天較為超勝,而安樂主則完全歸信於佛陀,兩個人由於見解和信仰相處得不太和睦。後來因為母親的勸勵,兄弟二人修成了神行悉地,到了格拉夏山王——也就是岡底斯山——大自在天的跟前。 [11′46″]</p>
<p>   在那個地方見到了五百羅漢像飛鳥般從天飛來,大自在天及其隨從禮敬羅漢,並且供養午齋而聽聞佛法。婆羅門兄弟二人請問了大自在天,大自在天說:「解脫只有佛道中才有,其他是沒有的。」兄弟二人非常歡喜,回到了自己的家鄉之後,就捨掉了婆羅門的服飾而成為居士大德,正為受持終身居士八戒,善巧通達大小乘。為了分判導師與外道大師的勝劣,因此陀尊成就尊造了《殊勝讚》,而安樂主造了《勝天讚》。這兩篇讚傳遍了所有市集與王宮,那時當地的人大多將這兩篇讚作為歌詞而歌唱,流傳非常非常地廣。陀尊兄弟二人供養在金剛座的五百位聲聞的生活所需,又在那爛陀承事供養五百位大乘行者。 [12′54″]</p>
<p>   一般而言,那爛陀是聖者舍利弗出生的地方,同樣也是舍利弗與八萬阿羅漢涅槃的地方,中間有一段時間地方空了、人也沒有了,只剩下一座舍利弗的塔。當時阿育王就供養了那座塔,並且修建了一座宏偉的佛殿。後來大乘最初的五百阿闍黎共同商議觀察,如果在聖者舍利弗出生地弘揚大乘教法的話,有大乘之法之興盛、眾人生信的徵兆;如果在目犍連尊者出生地弘揚大乘教法的話,徵兆顯示會有很大的勢力,但算不上正法興盛。他們看到這樣的徵兆之後,陀尊兄弟就興建了八座那爛陀寺的經院,安置了許多大乘的經典。因此那爛陀寺最初的建造者是阿育王,但是大乘教法最初在那裡弘揚起來,則是五百阿闍黎與陀尊兄弟的功勞。中間則是由婆羅門羅睺羅令興盛,再由龍樹菩薩令大乘法盛極一時。這些是多羅那他大師所說的。 [14′14″]</p>
<p>   我上面所講的就是賽倉大師的《殊勝讚廣釋》中所說的內容,有機會我們可以學一學兄弟二人造的那兩篇讚。如果可以的話,可能也可以寫成讚頌歌頌佛德,讓我們能夠集聚很大的資糧。謝謝大家! [14′37″]
<p>   聽完了陀尊兄弟和五百阿闍黎,我們可以接著看一下《四家合註入門》第 83 頁,看第一行的黑字。「<p> 諸智論師,許由三種清淨門中詮釋正法<p> 」,哪三種還記得吧?「<p> 謂軌範語淨、學者相續淨、所說法清淨。<p> 」下面看仁波切的講記,說:吉祥那蘭陀寺所有的智者是用什麼方式來講說正法呢?以「三種清淨門」來「詮釋正法」,就是「軌範語淨、學者相續淨、所說法清淨」,以這三種清淨門來詮釋正法。所謂「軌範語淨」,軌範師對於清淨論典的內涵所作的無謬解釋,即是「軌範語淨」。「學者相續淨」,就是指弟子們相續不摻雜煩惱。同樣地,前一個「軌範語淨」的意思,雖然主要是指無謬解釋論典的義理,然而軌範師的相續清淨也很重要,並不是只要講得好就可以,而軌範師本身的心續、意樂不好卻沒關係。不是這樣的!從字面上看來,沒有說軌範講得好就可以,不用管相續清不清淨,其實相續清淨才是主要的。所以軌範的相續清淨是非常重要的! [01′38″]</p>
<p>   仁波切在這裡說:「一定要思考這對他人是有利益的,或者這對他人是否能有利益?一定要懷有利益他人的心才說法,這是根本!在這之上言語清淨——能無謬宣說論典義理,這才是軌範語淨的意思。除此之外,不能說即使軌範師的相續不清淨,但所說的法仍是清淨的。」仁波切不承許這種說法。 [02′11″]</p>
<p>   這一點在跟仁波切學習這麼多年,感觸是非常深的!仁波切是這樣講,也一直是這樣做的,也是這樣教我們的。比如說每次我有什麼事情請問仁波切:「我要去哪裡見大家,仁波切,我應該最注意什麼?」仁波切通常會說:「要懷有真實的饒益他人的心!」多少年都是提醒這一句話!我最初剛學《廣論》,其實不太敢為別人講。但那個時候就有一位法師帶我到比丘尼寺院,非得要我給那個寺院的法師們講課。我當時不是很想去,主要是怕講錯,然後就請問上師。上師說:「如果他們那麼希望你去的話,那就去吧!」我說:「那到底要注意什麼呢?」仁波切就說那句話:「要懷有饒益他人的心,這個心要非常地真切!」從那個時候開始仁波切就是這樣說的,以後大大小小的事情問下去,這個都非常重要! [03′32″]</p>
<p>   所以這個「軌範語淨」,上師解釋說一定要說法師的心續是清淨的,絕對不是為名聞利養而說。為別人說法的時候,不是希望能得到讚美,或者希望一些現世的利益,絕對是為了饒益他人的心續,能夠拔除苦因、能夠種樂因,展現法的悲憫性——拔苦與樂。如果在內心的深處能夠真實地以這樣純粹的動機去說法的話,仁波切在此處的意思是說這才是軌範語淨。只把經典的意思解釋得沒有錯,但是意樂裡如果是為了自己的名聲、為了種種的現世利益而去說法的話,不是此處所說的軌範語淨。 [04′27″]</p>
<p>   我想這一點,仁波切的教誨我們要記在心上。在廣論班研討也好、法師們出去說法也好,我們都以這一條想一想:祖師們傳承下來的規矩是這樣的,善知識的教授是這樣的,那麼觀察一下我自己內心深處的意樂,到底為什麼來學《廣論》的?到底為什麼跟別人一起研討《廣論》?到底為什麼去說法?內心深處有沒有一個真實饒益他人的心?這是善知識最在意的事情! [05′05″]
<p>   有一次仁波切給我們講道次第的法類。講完了之後從說法堂出來,很多居士很感動,就追著仁波切。然後我就跑在仁波切面前跟仁波切說:「師父,很多居士想要看您!」仁波切一聽就停下來,然後就站在那兒把雙手攤開。這時候居士們就擁上來,仁波切說:「看吧!一個白髮老翁!我的一切都是三寶給的。」當時就穿著袈裟,非常慈悲地站在那裡給大家看。那時候可能很多同學都沒見過仁波切,他們說:「我們要看佛爺!」然後就圍著師父合掌。 [00′47″]</p>
<p>   仁波切多次講過:說法的時候坐在高高的法座上,要觀想諸行無常。這一切都是三寶給的,對於眾生應該懷著一顆徹底恭敬和虔誠的心,去禮敬所有的出家人,甚至是一個流鼻涕的小沙彌! [01′15″]</p>
<p>   跟仁波切一起朝禮寺院的時候,就看過仁波切走到一個寺院,那個寺院有很多小沙彌在背經。那個時候月亮已經出來了,那是一幅很美的圖畫——月上中天,皎潔的白光照在那琉璃瓦的寺院上,院子裡有一棵大樹,大樹旁邊就是沙彌圍著一圈在背經。仁波切帶著我們走過去的時候,腳步就放慢,一點點走,快走近的時候仁波切就開始磕大頭,給那些背書的小沙彌頂禮。正在背書的小沙彌,肯定不知道有個大上師正在頂禮他們! [02′02″]</p>
<p>   所以「軌範語淨」這一點,仁波切解釋說:「說法師的相續清淨很重要,到底有沒有真實利益眾生的心!」在我們跟隨善知識的時候,就能看到經典上所說的事情,在善知識的行持中是真實出現的! [02′26″]</p>
<p>   接著第三個「所說法清淨」,所說的法必須是能以無謬方便之門,引導所化機至佛地的正法,這才是清淨的法。就修改與救護的功德的角度來講,正法的定義是什麼呢?摧伏所化機的煩惱,能令他的相續生起功德,依此引導令至正道,這就稱為正法。所以,那蘭陀寺的說法方式,就是以這三種清淨門來詮釋正法的。 [03′03″]</p>
<p>   注意!在這裡邊所說的法清淨,上師講到:什麼是正法?無謬的方便之門,引導所化機去哪兒呢?至佛地,這才是清淨的正法!清淨的正法具有什麼功德呢?它能夠修改與救護。所以,正法的定義就是能夠摧伏所化機的煩惱,能令我們的相續生起功德,並且引導令我們能夠入正道。那麼我們能夠在一起聽聞和研討這樣一個有清淨法脈的傳承——從那蘭陀寺的這樣傳承,雖然後來宗大師是尊止迦摩囉室囉寺的傳承,但是它們兩個可以收攝為差不多是一樣的。 [03′50″]</p>
<p>   所以能夠聽到這樣的傳承,我們真的要感謝歷代傳承祖師的辛苦,尤其要感謝為我們講說《廣論》的師父還有仁波切!沒有這些大善知識為我們講說,我們是無法了解到其中的竅要。縱然得到《廣論》,在我們的經櫃裡供上個二、三十年,有些人可能都沒法打開把它讀一遍;縱然讀一遍也不得其要;如果譯經院的法師們沒有費盡千辛萬苦把《四家合註》翻譯出來,我們也沒法用漢文聽到這樣的傳承。所以禮敬一切傳承祖師,禮敬為正法而努力的僧眾們!也對大家能夠一直堅持學全廣,謝謝大家的用心,一定要迴向無上菩提!謝謝! [04′41″]
<p>   請大家把《四家合註入門》翻到 86 頁,今天我們來繼續學習《四家合註入門》,86 頁下面原文的部分。我先唸一下。 [00′16″]</p>
<p>   後時<p> 〔<p> 止迦摩囉室囉<p> ,師云:此寺於摩羯陀北方,恆河畔小丘腳下,具一百零八佛殿,外有圍牆環繞,安住其中諸班智達,行種種聖教事業,亦為僧伽資生極妙善處,覺窩大師亦從此處迎赴藏地。建寺者為法王達摩波羅,彼即獅子賢論師之施主。內殿中央供奉與金剛座大菩提像等量之世尊像。〕<p> 聖教盛行,彼諸智者,則許三種而為初要:謂正法造者殊勝、正法殊勝、如何講聞彼法規理。<p> 明當隨於何規:<p> 今於此中,應如後釋。<p>  [01′16″]</p>
<p>   下面我們來看仁波切的講記。勝那蘭陀寺以三種清淨門宣說正法,那蘭陀寺的講法傳規就是這樣的。另一種方式是什麼呢?「<p> 後時<p> 」,就是之後,繼那蘭陀寺之後,印度另有一座很大的寺院,叫止迦摩囉室囉寺,也就是戒香寺。這裡邊所有的智者講說的方式,在義理上和前一種講規大致相同,但字面上不太一樣——說的方式不同。 [01′56″]</p>
<p>   「<p> 止迦摩囉室囉寺<p> 」,我們可以看一下《四家合註》(P98)後面的第五個註。它是古印度的一個寺院,在恆河邊,梵語是「比札馬拉希拉」,義為戒香寺或超戒寺;也有譯成是能映覆戒。它就位於摩羯陀北方恆河邊一座山丘的山頂上——這座寺院是在山頂上。 [02′30″]</p>
<p>   我不知道諸位有沒有去過位於山頂上的寺院?去那裡通常就是要從很遠的地方坐車,我不知道這座寺院是不是?因為我去過藏地的寺院,坐車就坐很久,然後到山腳下開始沿著山路向山去。我曾經去過一個寺院,它的山路就是窄窄的一條,這邊就是萬丈深淵,然後這邊就是高山,車就在這邊走。當時給我們開車的司機可能是路太熟了,所以我感覺到他好像在衝刺一樣。向左側一看——我是坐在邊上,就直接可以看到深淵,那底下霧茫茫的,直接可以看下去;然後右邊就是山。窄窄的路,一直爬、爬,爬到山頂上。如果是在冷天的時候,真的就非常冷,風也非常大,但是還是有很多出家人駐錫在上面,真的是歎為觀止! [03′26″]</p>
<p>   聽起來這座山不是很高,一座山丘的山頂,有的說這個寺院是提婆波羅國王建的;也有說是他的兒子,就是達摩波羅國王建的。這個寺院是以佛陀的殿堂為中心,周圍有五十四座顯教的經院、五十三座密法院,共有一百零八間殿堂。可以想想應該是規模非常的宏偉,一百零八間殿堂!最外邊有圍牆環繞,規模真的是很宏偉的。最著名的聖阿底峽尊者,還有許多印度的祖師都駐錫過這個寺院。最後就遭到伊斯蘭教軍隊的破壞。 [04′11″]</p>
<p>   我們再回來看《四家合註入門》的講解。「<p> 止迦摩囉室囉寺<p> 」,這裡邊就進入語王尊者的箋註,說:「<p> 師云:此寺於摩羯陀北方,恆河畔小丘腳下<p> 」,印度的摩羯陀即現在的菩提迦耶,在北方恆河邊的小山腳下。我們常常聽到摩羯陀國,摩羯陀國是什麼時代的?也是中印度古國的名字,它也是位於恆河中下游地區,大體相當於今天比哈爾邦的中南部。這個地方當時出產一種奇特的稻米,米粒碩大,色香俱全,顏色也很好看,又很香,被當地人稱為「供大人米」。想起了我們北方的大米——五常大米,也是很有名的。我把東北的大米曾經送給別人,也去供養寺院,吃過的人都說非常非常香。所以看到這供大人米想起了東北的大米。 [05′19″]</p>
<p>   摩羯陀國的風俗是非常純樸的,百姓重視學業、篤信佛法。注意哦!這個摩羯陀國多富呢?著名的金剛座、大菩提寺、那蘭陀寺等佛教的聖地都在這個國家內。阿育王還有旃陀羅笈多二世,也是這個國家佛教鼎盛時期的兩位統治者。這段介紹在《新譯大唐西域記》裡有。大家可以想像那摩羯陀國,除了那麼有名的大米之外,居然有這麼大的寺院,聖者輩出啊!不是用一個富庶所能形容的。 [06′02″]</p>
<p>   再回過頭來看《四家合註入門》,說印度的摩羯陀就是現在的菩提迦耶,在北方恆河邊的小山腳下,「<p> 具一百零八佛殿,外有圍牆環繞,安住其中諸班智達,行種種聖教事業<p> 」。在那裡邊有很多很多班智達駐錫,有的說法、有的辯論,以各種各樣不同的事業來承事教法,用不同的方式弘揚教法。比如說,有些人坐鎮在東門或西門。有沒有想過為什麼還有善知識要坐鎮東門、西門?大家可以想想是做什麼呢?如果有外道前來,就同他辯論;然後有些人當住持說法,用不同的形式來弘揚佛法。 [06′52″]</p>
<p>   「<p> 亦為僧伽資生極妙善處<p> 」,這是指當時僧人的生活是很優渥的。對我們有深恩的阿底峽尊者,當時就駐錫在這座寺院裡面。阿底峽尊者去西藏的時候就是從這個地方被迎請進入藏地的,就是從止迦摩囉室囉寺。 [07′19″]
<p>   這麼宏偉、規模宏大的寺院,這麼多的大班智達駐錫其中,這個寺院的功德主和大施主是誰呢?他就是印度的「法王達摩波羅」,他也是獅子賢論師的施主。《顯明義釋》的作者就是獅子賢阿闍黎,達摩波羅也是他的施主。「<p> 內殿中央<p> 」,就是在寺院大殿裡邊後殿中間,供奉著和金剛座大菩提像等量的世尊像。「大菩提」就是指佛薄伽梵的聖像,殿裡邊有一尊和金剛座菩提迦耶釋迦能仁的像等量的佛像。以上就是語王尊者的箋註。 [00′48″]</p>
<p>   在這座寺院裡聖教非常地盛行,這裡面諸智者們的說法方式,就如下文提到的:「<p> 則許三種而為初要:謂正法造者殊勝、正法殊勝、如何講聞彼法規理<p> 」。講法一定要具備這三個條件,這非常重要!講法必須具備這三個條件,就是這座寺院的一個講規。 [01′12″]</p>
<p>   仁波切又接著說道:有一些解釋或是一些上師的說法裡邊,說那蘭陀寺和止迦摩囉室囉寺的說法沒有太大差別。為什麼呢?因為「所說法清淨」就可以攝入「正法殊勝」;「學者相續清淨」可以攝入什麼呀?「如何講聞彼法規理」;然後「軌範語淨」大致上可以納入「造者殊勝」,所以這兩者基本上是很相似的。那本論是依循何者呢?宗喀巴大師是依後者,就是止迦摩囉室囉寺的講規,因為覺窩傑具德阿底峽尊者是依這座寺院的作法,是這座寺院的上師,所以這樣去講說的話,應該也有良善的緣起。因此「<p> 明當隨於何規:<p> 今於此中,應如後釋。<p> 」就是指傳規要依這座寺院的作法。 [02′14″]</p>
<p>   創建止迦摩囉室囉寺院的這個國王,他的音譯就是達摩波羅,義譯是法護。傳說他前世是一位三藏法師,發願要廣弘般若,投生為王族——成了王子,後來成為國王。他是波羅王朝第二任的君主,疆土極為廣闊,令般若教授及密集法門遍佈國土一切地方,而且令通曉般若還有密集的這些班智達列坐眾前,非常非常尊重大善知識。 [02′55″]</p>
<p>   他剛剛開始執政的時候,就迎請了獅子賢論師宣說般若。這位國王所建的五十座講壇,其中有三十五個都是般若講壇。後來又啟建了止迦摩囉室囉寺,長時間供養一百零八位班智達,還有一百一十四位阿闍黎等密教師。不僅如此,他還每個月為聽法的人施設饗宴,供養聽法眾。 [03′29″]</p>
<p>   《般若經》中記載:《般若》法流初廣弘於中印度,再傳至南方,後回傳中印度,再向北傳。而回傳中印度的授記,正是這位達摩波羅國王執政的時候。他在位期間,出現了多少大善知識呢?有善護、獅子賢論師、嚴飾、海雲、光明生源、滿增論師,以及金剛大阿闍黎佛智父子、佛密、佛寂等大師,是正法相當鼎盛的一個時代。 [04′08″]</p>
<p>   他不僅僅是這座寺院的施主,還是獅子賢論師的施主。不知道大家對獅子賢論師了解多少?我可以依據著《師師相承傳》給大家略略地介紹一下。 [04′22″]</p>
<p>   獅子賢論師,他是「弘般若道獅子賢」。值得宗喀巴大師這樣稱讚的阿闍黎獅子賢,他從往昔久遠過去生當中就已經發起了菩提心,學行偉大的佛子行。他是為了在這個剎土中弘揚佛教的心要——般若口訣,乘願而來的一位大德。 [04′47″]</p>
<p>   這位阿闍黎誕生在王族當中。可是過去有一些佛教史中說:這位阿闍黎住在母胎的時候,母親被獅子傷害。獅子吃了他的母親之後,沒有吃腹中的嬰兒,所以他就活下來了,活下來之後又平安地長大,因此取名為「獅子賢」。這是在《師師相承傳》裡邊寫的記述。 [05′18″]</p>
<p>   但是後來我看了這一段的時候,我也在想:如果他真是出生的時候有這樣一個遭遇,如果還把他叫獅子賢的話,不是每次喊他,他都傷心嗎?他就會想他媽媽被傷害了。大家用這樣一個名字稱呼他,不是很傷害他嗎?獅子把他留下了,可是把他媽媽吃掉了,他一出生就沒有母親,所以我會覺得這樣到底是對不對的?因為這裡邊作者也說:「過去有一些佛教史中說。」看起來他也有一些疑惑。 [05′52″]</p>
<p>   這位大師他成年之後,完全不留戀喧囂的俗家,於是就在佛教裡出家了。出家之後受了圓滿的學處——比丘戒,精細地研習了一切自部他部的宗義,成為徹底的善巧者。注意哦!「研習一切自部他部的宗義」,是一件不容易的事情;又在研究了之後,成為徹底的善巧者,而且他是精細地研習,這是要花一番工夫的。尤其是特別對於尋求《般若》的教義,尊者就像常啼菩薩那樣,不顧辛勞與生命,不顧危險這樣去尋求,發憤圖強,一直要勤求《般若》的教授。那時候尊者常常在想:「什麼時候才能對於《大般若經》的教義、三乘道次第的圓滿道體,獲得他人所不能牽引的深刻定解呢?」一邊這樣想,如此地一心勤求不懈。 [07′00″]</p>
<p>   大家可以想一想他的想法。我把他的想法再講一遍:「什麼時候才能對於《大般若經》的教義、三乘道次第的圓滿道體,獲得他人所不能牽引的深刻定解?」他心中的所願就是了解《大般若經》,還有三乘道次第的圓滿道體。得到什麼樣的深刻定解呢?就是完全不可動搖的這種定解,這是他心中所願! [07′32″]
<p>   那個時候大堪布靜命是佛教之主,因此獅子賢就去依止了他,在意樂和加行兩方面都非常如理地依止了這位大堪布靜命,又深細地研習從至尊彌勒傳來的般若教授、聖無著兄弟以及聖解脫軍所著的這些論著;也精細地研究了聖龍樹解釋佛陀密意而著作的中觀諸論。所以他圓滿地聽受了佛世尊傳給至尊彌勒,再傳給無著兄弟,漸次傳來的廣行道次第的口訣;又學了由佛世尊傳給至尊文殊,再傳給聖龍樹師徒,次第傳來的深見道次第的口訣。對於所聽聞的教義、道次第各個扼要,反覆地思考、衡量、細察;並為了使心中能夠熟習,勤奮地串習其中的所緣行相。 [01′02″]</p>
<p>   大家可以想一下:光是學完了這個深見的傳承和廣行的傳承,就要花很久的時間,然後再對所聞的教義、次第各個扼要——注意下面這幾個字——「反覆地思考、衡量、細察;並為了使心中熟習,勤奮地串習其中的所緣行相」。觀察得到定解之後,還要經過串習。「由此對於佛法心要——三乘道次第圓滿道體,生起了特殊的覺受。」這樣的一個用功法!走的路線非常地清楚——親近善知識、聽聞正法、如理作意,然後法隨法行,基本就是這樣的次第。很精彩呀!乘願再來的大菩薩,他學修的次第也是按著這個嚴格的次第而學修的,非常值得我們思考! [01′55″]</p>
<p>   他這樣子勤奮地串習了所緣行相之後,對於佛法心要——三乘道次第圓滿道體,生起了特殊的覺受,於是對數千位信眾開始講什麼了?《般若》的教授!夢寐以求的《般若》的教授才可以講了。 [02′15″]</p>
<p>   這位論師為了想要大弘佛教的事業,因此在他的上師大堪布靜命面前,求受至尊彌勒的修法而修持。他修得很用功吧!然後他就作夢,夢見一位身著紅花色的僧衣、威儀端正的比丘對他授記說:「前往東方『喀薩巴尼』去吧!」在夢裡他被這樣授記。然後他也就依照授記前往所說的地點,在那個地方修齋戒法三天。既而他又再度地觀察夢境,在拂曉的時候就夢見了「能飛聚落寺」哈熱殿堂的上空,在雲層的空隙中,出現了諸天神的半身像,就是上半身。這些天神在做什麼呢?正以各種供物——非常豐厚的供物在作供養。 [03′15″]</p>
<p>   獅子賢論師就問:「這天神是為什麼而作供養呢?」天神就回答說:「至尊彌勒在宣說《八千頌》,所以我們在作供養。」他就仔細地看啊,看了很長的時間,於是就看見了至尊彌勒,金色的面容,頂上嚴飾著一座小塔,右手結說法印。他就立即頂禮供養,而啟問說:「慈尊您的論著,現今有許多注疏,應當依著哪部論作為依據呢?」至尊彌勒答道:「應當通曉一切的論典,把合理的部分總攝起來,這一部論就由你來著作吧!」很奇妙,他去問依靠什麼論?然後至尊彌勒答道說那部論還沒問世,你來寫吧!所以他就得到了本尊開許,獲得了開許。醒來之後,又作了供養。看起來一切都是在夢中。有很多大德的修行是夢中、醒來都是一如的,沒有什麼差別。 [04′31″]</p>
<p>   聽了這段,你們會不會每天躺在床上很期待作一個這樣的夢?但是我們祈求至尊彌勒,見到至尊彌勒會想要什麼呢?會先頂禮供養嗎?而且問說:「慈尊您的論著,現今這麼多注疏,應當依著哪部論作為依據?」我們會這樣去問嗎?多半會想跟至尊彌勒要一個什麼?現成的成就,而沒有想要至尊彌勒指示我一下到底應該看哪一本書。 [05′06″]</p>
<p>   因為得到了至尊彌勒這樣的一個指示,所以他就準備寫書了。然後為了尋覓撰寫論著時的施主,他就從東方的喀薩巴尼往西去了。當時有一位達摩波羅王,就是我們提到的達摩波羅王。達摩波羅是用古代習慣的音譯方式譯的,如果用現在的音的話,應該念作「達瑪巴拉」。這位國王聽說阿闍黎獅子賢善於講說《般若經》,於是派遣使者迎接他。看起來這位國王也是朝思暮想,心之渴仰啊!迎接非常非常地奇特,迎接的使者和獅子賢論師恰巧在路上居然相遇了!我們可以想一想,應該路有很多吧!都走同一條,就相遇了,應該是非常歡喜!想一下那個場景。相遇了之後,也就把論師迎接到了三莊嚴寺,到了之後獅子賢論師就為數千位僧眾廣傳《般若》的教授。 [06′18″]
<p>   誰當施主啊?如果有一個講《般若》的法會,大家都很想爭著當施主吧?對!那個時候就是達摩波羅王作為施主。依著至尊彌勒菩薩的授記,獅子賢論師就著作了《現觀莊嚴論顯明義釋》;匯合《現觀莊嚴論》與《般若八千頌》口訣的《八千頌廣釋》;隨順聖解脫軍所著的《般若二萬五千頌光明論》,而將《般若二萬五千頌》配合《現觀》的要義,寫下了《二萬五千頌》的攝義《八品論》;《攝功德寶釋易解論》、《般若修法》,還有《旃札巴文法變格頌》等諸論著。 [00′46″]</p>
<p>   這位阿闍黎具足無比的悲智,又由於至尊彌勒的加持力——看這個部分喔!這麼精彩的大德,著書立說、講《般若》、寫論著都要靠本尊的加持——以此他所著的《顯明義釋》成為修菩提道次第人們的「般若法眼」。大家想一想什麼叫「般若法眼」?意思就是像研讀《般若經》的眼睛一般。就是我們看經,然後眼睛一行、一行,一個字、一個字地看;而他的《顯明義釋》就像我們能看《般若經》的眼睛一樣,被稱為「般若法眼」,是非常厲害的!希望我們以後能夠一起學。像我們寺院的很多法師都已經學了好多遍。 [01′39″]</p>
<p>   他所著述的《八千頌廣釋》細到什麼程度呢?從最初的打掃房舍開始一直到修習止觀雙運瑜伽中間,所有的三士道道次第的這些扼要都如《般若經》中所說的那樣:何者為道的體性、道的數量如何決定、次第是如何等等,都非常清晰地開示。注意!清晰哦,非常清晰地開示!還有一句很重要的——沒有絲毫的錯誤!一點點錯誤都沒有,這麼清淨的論典。 [02′27″]</p>
<p>   並且在每一個所緣法類中,修持其中一者時,並非必須捨棄其他所緣法類,而是依靠依怙彌勒的口訣,強調在每個所緣法類之上具備圓滿道體。就是每一個所緣之上,它有全圓道體的縮影。這個也是依照依怙彌勒的口訣,強調在每個所緣法類上具備圓滿道體,所以全部都是上師指導的。 [03′01″]</p>
<p>   最初從順解脫分開始,直至最後金剛喻三摩地作為二現錯亂的正對治,進而獲得一切相智之間;以及獲得一切相智之後,由二十七種事業門如何作利益眾生事業之間,一切都有完整的開示。剛才我講的一串哦!那要學一本書,還要學好幾年才能弄清楚,什麼是金剛喻三摩地、二現錯亂,乃至正對治二現錯亂?獲得一切相智之後,二十七種事業門是什麼呀?怎麼樣去作利生事業?一切都完整地開示,這我們要學。以此對贍部洲的眾生作出了恩德無比的事業。就是我們住的這個洲的眾生,獅子賢論師對我們有無比的恩德! [03′54″]</p>
<p>   下面說:「因此想要修行菩提道次第的人們,應當謹向獅子賢論師虔誠祈禱求加持。並且應該再三地細讀論師所著的許多論著,對自身所修道次第的扼要獲得堅固的定解,任何邪魔惡友都無法令心改變。」記得最初獅子賢論師求法的時候,他心中的志願就是希望能夠對圓滿的道體和《般若》的內義產生他人不能牽動的堅固定解。現在我們對他的祈求也是這樣的。 [04′33″]</p>
<p>   所以我們應該好好地祈求獅子賢論師,而且應該再三地細讀論師所著的這些論著。像我們寺院的法師們就是長時間地學習、背誦、辯論。對自身所修道次第的扼要,誰的自身?就是我們,所修的道次第的扼要部分,要獲得堅固的定解。堅固成什麼樣子呢?任何邪魔和惡友都無法令心意改變。就是已經非常堅定地認為,經過觀察、再三仔細地抉擇——諸大論典的抉擇,還有心對境的這些抉擇之後,得出的這個清淨的見解是沒法動搖的。這是大善知識對我們的期待! [05′21″]
<p>   大家好!又到了我們研討《廣論》的時間了。在研討之前,還是請大家觀察一下自己的身心狀況,最重要的事情就是要殷重發心,殷重發心這件事,我在很多講次裡都會不停地提到。因為當我們做一件事,我們的發心會直接導致這件事完成的結果是什麼樣的程度。我們聽聞的是大乘的法,如果我們不去造作一個大乘發心的話,那這樣的時光真的是滿可惜的!所以請大家還是要殷重發心——為了利益無窮無盡的有情,我們要去證得最殊勝遍智的果位;為了有一天達到究竟地離苦得樂那個果位,我們要來研討《菩提道次第廣論》。 [00′55″]</p>
<p>   好!今天我們要學的是《菩提道次第廣論》師父帶子的第四卷,請大家先聽一下師父的帶子。 [01′09″]</p>
<p>   現在這個地方本論所採用的是後者,這個後者分四大段,分四部分,說:<p> 由是菩提道次引導分四:<p>   現在呢,我根據後者這個師承,來說明這個菩提大道修證次第的方法,分四部分:<p> 一、為顯其法根源淨故開示造者殊勝,二、令於教授起敬重故開示其法殊勝,三、如何講聞二種殊勝相應正法,四、如何正以教授引導學徒之次第。<p>   分四部分。那麼為什麼要分這個四部分,這裡簡單地說明一下這個道理。詳細的內涵每一部分哪,他就是說這個,我們只要把下面認真地學,那個細部都了解,一開頭,原則說一下為什麼。第一個我們了解,說學一切任何一樣東西,你一定要跟一個自己有正確認識的人學,這樣才學得好。不管做世間出世間任何一樣東西,你要學會,一定要跟一個會的人學才行;同樣會的人,他越是內容精采、越是圓滿是越好。世間法尚且如此,何況佛法!世間法出一點毛病,那麼最多你說,哎呀,作生意少賺一點錢、虧一點本;佛法出了毛病的話,就流落在生死輪迴,小的受生死之痛苦,大的在三惡道中,不得了地嚴重!尤其是修學佛法,你稍微不小心一點哪,嘿,會產生很大負效果,很大負效果,這一點我們要注意!所以真正對這個佛法本身是否清淨,是絕端地重要。那麼要想得到清淨圓滿的教法的話,這個引導我們本身他的條件,是決定因素。 [04′03″]</p>
<p>   好!現在我提一個問題。師父說:「<p> 為什麼要分這個四部分?<p> 」然後「<p> 一開頭,原則說一下為什麼<p> 」,接著說:「<p> 第一個我們了解<p> 」。大家還知道第一個我們了解什麼嗎?如果你們沒記住的話,可以看手抄,第一個我們要了解的是什麼呢?說:「<p> 學一切任何一樣東西,你一定要跟一個自己有正確認識的人學,這樣才學得好。<p> 」我們要了解的第一個事是——「學」!學一切任何一樣東西,我們要學習。那麼學習要跟一個什麼樣的人學呢?就是他自己會有正確的認識這樣的人學。結論:「<p> 這樣才學得好。<p> 」 [05′07″]</p>
<p>   這點大家有疑義嗎?你們可以討論一下。是不是學一切任何一樣東西,一定要跟一個自己有正確認識的人學,這樣才學得好呢?如果他不會,也沒有辦法教我們。所以學得好的一個因素,就是一定要跟一個自己有正確認識的人學,就是他是會的、他是正確的。 [05′37″]</p>
<p>   接著師父說:「<p> 不管做世間出世間任何一樣東西,你要學會,一定要跟一個會的人學才行。<p> 」還是闡述這個問題。接下來又說:「<p> 同樣會的人,他越是內容精采、越是圓滿是越好。<p> 」所以在會的人裡邊就提出了什麼?精彩和圓滿。接著我們要學習什麼呢?世間法和什麼?佛法。說:「<p> 世間法尚且如此,何況佛法!<p> 」接著師父類比了世間法如果學不好會怎樣、佛法學不好會怎樣。世間法出了一點毛病,那麼最多你說:「哎呀,作生意虧錢了、虧本了!」但是佛法出了毛病的話會怎樣呢?流落生死輪迴,因為佛法是要我們出離生死輪迴的。然後「<p> 小的受生死之痛苦,大的在三惡道中<p> 」,惡道之中的苦就非常地劇烈了。師父接著說:「<p> 不得了地嚴重!<p> 」如果學得不對的話。因為佛法是要教我們了脫三惡趣的痛苦,乃至了脫整個輪迴的痛苦,如果沒有學明白、學錯了的話,這兩個痛苦都脫不了。所以對我們本身來說損失很大,非常嚴重! [07′11″]</p>
<p>   所以,師父說修學佛法要非常非常地慎重,尤其是稍微不小心一點,就會產生很大的負效果。注意!接著師父說了:「<p> 這一點我們要注意!<p> 」注意哪一點呢?是注意學佛法要小心嗎?還是注意下面的那句話——「<p> 真正對這個佛法本身是否清淨,是絕端地重要。那麼要想得到清淨圓滿教法的話,這個引導我們本身他的條件,是決定因素。<p> 」注意!出現了這樣幾個問題,就是對這個佛法本身是否清淨是絕端重要的,為什麼?因為不清淨的佛法的傳承沒法教我們了生脫死,沒有辦法,因為只有佛陀有解決生老病死的辦法,只有佛法有。如果把佛法學錯了,這個最大的勝利就得不到了。所以它本身的清淨就變得——師父用了「絕端地重要」——絕端地重要!那麼要想得到清淨圓滿的教法的話,決定因素是什麼呢?就是引導我們本身他的條件——引導者的條件是決定因素。 [08′40″]</p>
<p>   大家可以看一看,在這一小段裡師父的觀點。他站在我們一個學習的人的角度,深刻地分析了:如果沒有找到清淨圓滿的傳承的話——沒有找到那個能把清淨圓滿的傳承傳給我們的人的話,沒有這個決定因素,那我們到底會不會學到清淨的教法?不會。學不到的話,佛法給我們的利益就得不到,對我們來說就不得了地嚴重,就是都白忙了、白辛苦了!可見在世間法和出世間法中,最重要的就是佛法帶給我們這個利益,而它的根本決定性的因素,就是引導我們那個人他的條件,因為他會決定這個傳承清不清淨。 [09′35″]</p>
<p>   這個觀點,大家會不會覺得師父完全是站在學的人的角度在探索?為什麼要「顯其法根源淨故開示造者殊勝」呢?完全是站在學的人會得到什麼樣的利益,從這樣的一個角度讓我們去了解,為什麼法的根源清淨這麼重要。法的根源清淨最重要的源頭,就是造論、說法的那個人,而這一點關乎到我們生命的成敗。比如說我們到底能不能離開輪迴?到底能不能離開惡趣?如果一個有殊勝傳承的善知識給我們開示的話,一定會無倒顯示出離生死輪迴的清淨之道、脫離惡趣的深信業果的法門,不會讓我們忽略這些。一旦我們陷入不清淨的法中,我們根本走不上清淨、正確的道路,練、練、練,成了旁門左道,或者在非常局部的地方花了很多功夫,而道的主體卻不知道;或者過分地追求自身的一點覺受,而對真正出離生死的這個問題幾乎一概不提。 [10′54″]</p>
<p>   所以這個法的根源清淨,完全源自於說法者或者造論者他的殊勝條件,這一點就變得非常重要!我們一定要了解那個造論者是怎麼殊勝的,因為了解了他真的關乎到我自己學的成敗,這件事不是可有可無,而是非常非常地重要!所以師父從這樣一個角度,非常善巧地引導我們的心,慢慢地去了解宗大師的意趣。 [11′26″]
<p>   好!我們接著聽下一段。<p>   不過這個地方大家會說:「欸,那麼引導我們的佛最圓滿,何必還要你來造、他譯了呢?難道你還比佛強嗎?」現在很多人提出這個問題,這個話聽起來,是呀,我們想,對呀!所以現在有太多的人說:「啊,你不要去看那個論,難道造論的菩薩還強得過佛嗎?」我們一聽覺得對,然後你就不去看論了。這裡邊卻是有個大問題,這個我們在這裡解釋一下。 [00′40″]</p>
<p>   師父提出了這個問題。有的時候在聽法,聽著、聽著心裡出現一個疑問:「那是為什麼呢?」有的時候善知識講著、講著,講就講到那個疑問,那種感覺非常好,好像他聽到了你的疑問。像這裡我們的心裡嘀咕這個問題,說:「既然是說要得到最清淨圓滿的教法,那佛就最圓滿了,為什麼還要學論啊?就不用學論了!造論的菩薩還強得過佛嗎?」然後我們一聽,注意!我們一聽,看!發生什麼事了?「<p> 我們一聽覺得對<p> 」,然後產生一種結果,就是不去看論了。 [01′35″]</p>
<p>   這只是心裡的一個問題,但是它沒有被正確地解決的話,導致的結果就是不去看論。看起來輕輕滑過的一個問題,但它導致的結果,可能這一輩子都不去讀誦詮釋佛經的論典。可是靠自力怎麼能夠趣入佛陀的密意呢?這樣的損失實在太過巨大!可它的源頭卻是一個疑問,乃至是一個輕率的回答,就能使一生空過,甚至走上覺得學論沒有用這樣的一個險途,造了很大的惡業! [02′22″]</p>
<p>   現在大家學《廣論》、學《南山律》,還有學五大論已經有點蔚然成風,可是二、三十年前應該漢地還沒有這樣的一個風氣。那個時候師父就提出這樣的觀點,讓我們認識到學論對了解佛經的重要性,尤其是不去看佛所授記的大菩薩寫的論的話,是沒法了解佛陀的密意。 [02′48″]</p>
<p>   舉個最簡單的例子,現在我們學五大論,有的學得很快,有的學得有點慢,那我們就會拿學得好的同學的筆記看。欸!第一天不明白,結果看了一下他的筆記,第二天就明白了。同班同學的那個筆記能超過善知識講的嗎?肯定不行,但是它卻給自己一個最大的幫忙,就是把不明白的地方弄明白了,這樣才能明白善知識的意思。我們經過一輪、一輪地學習,學習菩薩解釋的那些論典,會慢慢地靠近佛陀的密意。 [03′31″]</p>
<p>   然後師父說:這裡邊有個大問題。什麼樣的問題?接下來可以聽下一段。 [03′42″]</p>
<p>   佛,說的法跟他內證的內容,有兩個絕不一樣的地方,這一點我們要認識。他內證的是完全圓滿的,千真萬確,所以就內證這一點來說,沒有一個人能比得過佛。菩薩當然不如,祖師更不如!但是他講的法卻有一個特質,是對不同的根性說的。他對小孩子,就講小孩子的法;對大人,對大人的法;然後對兩千多年以前的人講的法;對我們現在是另外一種法。佛自己是最圓滿的,可是他講出來的法所對的根性,跟你相應不相應?不一定相應,這第一點。不但在時間、空間,都有一大段的距離,在這種狀態當中,這個裡邊就有問題了。 [04′42″]</p>
<p>   理論上面我們應該了解,實際上呢,我們也看一下:是,佛說的法是絕對圓滿,千真萬確。因為說得圓滿,所以他對機也圓滿,所以凡是講到哪裡,每一部經典上面,那個當機眾聽完了以後,大乘的,一定是很多人證無生法忍,最起碼的發菩提心;小乘的,得法眼淨、證阿羅漢,這個是佛真正圓滿的結果。表示什麼?那當機就有這樣的功效。假定不當機的話呢?對不起!所以「佛法不應機,等同閒言語」,如果不應機的話,那就是說空話一樣的。現在,我們不幸的是不應機,你看上去不一定有效,儘管你說你有了信心去看,有信心是有信心,你看是看了半天,如果你大乘根性,請問你得了無生法忍嗎?你發了菩提心嗎?小乘的,不要說羅漢果,你得了法眼淨嗎?沒有。那麼表示什麼?這個問題就在這個地方嘛!這事實也是這樣,這個我們要了解的。 [05′56″]</p>
<p>   看了這兩段,我提一個問題。師父說:「<p> 這一點我們要認識<p> 」,請問這一點是指什麼?有想到嗎?對!師父說:「<p> 佛,說的法跟他內證的內容,有兩個絕不一樣的地方,這一點我們要認識。<p> 」這一小段一開頭就把佛說的法,和佛陀內證的功德分開來談,這一點非常地明晰。接著講佛陀內證的功德,有八個字,看得到吧?「完全圓滿,千真萬確。」接著師父說:內證這一點,沒有一個人比得過佛。接著他說的法有什麼樣的特質呢?師父說:是對不同的根性說的。 [06′59″]</p>
<p>   說對小孩、對大人,後面又有一個說對兩千年前的人這樣講,對我們現在的人是另一種講法,你對這點有疑問嗎?兩千年前講的和現在講的在對機上會有差別嗎?我們怎麼去會通這個問題呢?大家可以想想哦! [07′25″]</p>
<p>   我們在看佛經的時候,比如讀《金剛經》、讀《妙法蓮華經》,有的讀《華嚴經》,讀很多經典,我們都看到過那上面講比丘、比丘尼、優婆塞、優婆夷,這些聽法眾都是這樣,說:哎呀!證得法眼淨、證得阿羅漢果,然後還有發阿耨多羅三藐三菩提心,還有怎樣、怎樣的勝利。但是我們看了一遍佛經之後,甚至是看很多遍之後,就是看不懂佛陀在講什麼。 [08′04″]</p>
<p>   師父說:問題就在這個地方!什麼問題呢?為什麼我們不會像經典上的那些人一樣——佛在說法的時候他面前的那些弟子那樣,獲得那樣的證悟力?我們甚至聽不懂佛陀在講什麼。那聽不懂佛陀在講什麼的我們,又看到了經典的時候,要怎麼辦呢?你們在心裡困惑過吧?說念《金剛經》開悟,六祖開悟了、有一些人開悟了,我們《金剛經》念了很久也開悟不了,甚至學著、學著也不知道學到哪邊去了,如果沒有一個善知識沿著正確的次第引導自己的話,我們很難透過讀誦佛經就了解佛陀的密意。 [08′55″]</p>
<p>   從這個地方可以理解一下什麼叫當機、什麼叫不當機;不然我們就是在討論:「啊!什麼應機?我是什麼機也不知道啊!那怎麼辦呢?」那就看看能不能看懂佛經,能不能證得在佛經上當時應機的那些有情他們所證得的那些果位,我們能不能達到?如果達不到的話,佛說的那段法就是沒聽懂了。 [09′28″]
<p>   那如果你問:「我也遇到佛說的那段法了,我雖然沒有親耳聽到佛陀講,但是佛陀把他的法留在經典上,我也是看到了,那我不算應機嗎?」是看到了!比如說現在遇到宗大師教法,我們沒有聽到宗大師親自給我們講《菩提道次第廣論》,但是宗大師也說:思念我、對我有信心的弟子們,可以去看我寫的兩本顯密道次第。佛陀也有這樣的叮嚀,要去深入經藏,智慧如海。 [00′39″]</p>
<p>   那看不懂,怎麼深入呢?問題就在這兒,浮面的意思都看不懂,如何深入呢?就像我們一開始,假如沒有人講《攝類學》,就把一本《攝類學》的著作翻譯過來學習,沒人教,看能不能學懂呢?所以現在還是需要有個人幫我們,對不對?祖師、菩薩的論是怎麼出現的?就是因為有看不懂的人。所以不是說佛宣講了經典之後,這個祖師還要再造論,好像為了填補什麼空缺。如果真的是為了填補空缺的話,那一定是學法的人不明白,所以菩薩、祖師們才來教我們。像文殊菩薩,是七佛之師啊!很多祖師也是佛陀化現的,他就再來教我們,給我們設計更細密的階梯讓我們往上走。 [01′45″]</p>
<p>   三界有情最深的痛就是生死之痛,生死的根本就是自性執的無明;佛陀出世的目的就是為了解脫眾生的生死,而要解脫眾生的生死,就是要令眾生證達無自性。在所有所有的經典當中,《般若經》以最廣泛的理路探討無自性的道理,因此《般若經》是經中之王呀!《般若經》說:「<p> 如是般若波羅蜜多是大神咒、是大明咒,是無上咒,是無等等咒,是一切咒王,最尊最勝、最上最妙,能伏一切,不為一切之所降伏。<p> 」佛陀在《般若經》中也叮囑阿難:「<p> 慶喜當知!除此般若波羅蜜多甚深經典,受持諸餘我所說法設有忘失,其罪尚輕。若於般若波羅蜜多甚深經典不善受持,下至一句有所忘失,其罪甚重。<p> 」這是佛陀叮囑阿難的。然後又說:「<p> 慶喜當知!若於般若波羅蜜多甚深經典,下至一句能善受持不忘失者,獲福無量。<p> 」注意哦!能有一句受持不忘的,就獲福無量。一句和無量福,差距是多大?還有叮囑說:「<p> 若於般若波羅蜜多甚深經典不善受持,下至一句有忘失者,所獲重罪同前福量。<p> 」就是忘了一句那個罪,也是無量,它這個因果是非常巨大的!還有說:「<p> 慶喜當知!若諸菩薩供養恭敬、尊重讚歎甚深般若波羅蜜多,則為現前供養恭敬、尊重讚歎我及十方三世諸佛。<p> 」如果菩薩能夠供養恭敬、尊重還有讚歎甚深般若波羅蜜多,則現前供養——不是觀想,是現前供養——恭敬、尊重讚歎釋迦佛及十方三世諸佛,供養《般若經》就等於供養無量諸佛,而且是現前供養,現前供養得到的福是很大的。 [04′26″]</p>
<p>   然後又說:「<p> 慶喜當知!若諸菩薩聞深般若波羅蜜多,起殷淨心恭敬愛樂,即於過去未來現在諸佛無上正等菩提,起殷淨心恭敬愛樂。慶喜!汝若愛樂於我、不捨於我,亦當愛樂、不捨般若波羅蜜多甚深經典,下至一句勿令忘失。<p> 」大家有沒有看到這一段?《般若經》在佛陀的心中,是何等的份量啊!他在叮囑阿難的時候用何等殷切之心啊!如果真的是愛樂佛陀、不捨佛陀的話,那麼就應該愛樂、不捨般若波羅蜜多甚深經典。而且他的標準——下至一句都不要忘,最好全記得!這是佛陀對我們的殷殷期待啊! [05′25″]</p>
<p>   大家還記不記得以前有講過玄奘大師翻譯《般若經》的那個公案?梵文版的《大般若經》總共有二十萬頌,因為弟子們的勸請,玄奘大師曾經一度想要簡譯,結果晚上就作了很恐怖的惡夢。隔天玄奘大師把夢境告訴大家,決定不要簡譯,當天晚上就夢見佛菩薩眉間放光,有很多吉祥的夢兆。所以玄奘大師不敢刪減梵文,一字不差、完整地翻譯了六百卷的《大般若經》。由此可見對於《般若經》慎重的程度,是多麼地殷重啊! [06′05″]</p>
<p>   《般若經》的內涵非常地廣,我們僅憑自力無法了解,佛菩薩為了令我們了解《般若經》的顯義空性和隱義現觀的密意,所以才有《現觀莊嚴論》、《道炬論》、《菩提道次第廣論》出現於世。這些論是為什麼而出現的?就是為了應我們的機啊!可以極大地、根本性地幫助我們了解佛陀的密意,讓我們在各自修行的緣起點上都有一個下腳處。所以這些論的出現,正是佛菩薩悲心和智慧的體現啊!而對於值遇這些論的我們來說,該是多麼地難能可貴! [06′50″]</p>
<p>   論,具足修改、救護兩種功德——修改我們的相續,救護我們的生死。我們一起好好用功吧!否則何以報佛恩?何以報師恩?何以報父母恩啊? [07′12″]
<p>   好!我們接著聽下一段。<p>   再說,他因為是當不同根性的機,所以這部經典裡面說這樣的一個法門,那部經典裡面說這樣的一個法門,這個法門是整個修行過程當中的一個部分,一個關鍵所在。譬如說《金剛經》那是破空,就是對「著有」的人怎麼樣教你破這個,這樣的觀點。不同的經典有它不同的說法,拿我們如果學不好的話,學了這個呢變成功什麼?斷章取義。這個斷章取義是修學過程當中是最嚴重的,是一個大缺失!所以你不認識這一點,你也以為如此——好、好、好!那麼,必定要經過這個圓滿的教授傳承,說明這個內容,那時候你才曉得:喔,原來這樣的!教你自己去學是斷章取義,等到這個善巧的解釋明白了以後,然後用到你身上的恰如其分哪!這個所以能夠把「斷章取義」變成功「恰如其分」要靠什麼?要靠這個引導的人哪,這一點我們必須要了解,這樣。所以這個上面我們要了解:哪、哪!有這個特點在,這個特點在。要不然的話我們難免會引起誤解,引起了誤解就失去了大利益!所以他現在說,喔,這個造者殊勝。尤其這個圓滿的教法,你將來看一下,那個才曉得它所講的這個殊勝,殊勝到什麼程度,為什麼它這個法這麼好!這個對我們是有一個非常重要的一個基本的認識! [02′04″]</p>
<p>   問大家一個問題:不同的經典它會闡述不同的法門,舉了《金剛經》說對「著有」的人,要怎麼樣地去破他這個執著。然後接著說:「<p> 不同的經典有它不同的說法,拿我們如果學不好的話,學了這個呢變成功什麼?<p> 」師父有四個字,還記得吧?「<p> 斷章取義<p> 」。那麼斷章取義,師父又說是修學過程中最嚴重的什麼呢?對!一個大的缺失。如果不認識這一點,我們可能還會以為沒有問題——好、好、好。但是要怎麼樣能夠避免這個大的缺失呢?師父說:「<p> 必定要經過這個圓滿的教授傳承,說明這個內容,那個時候你才曉得:喔,原來這樣的!<p> 」 [03′06″]</p>
<p>   這裡邊揭示了一個問題,說:自己去學的話,師父說會學成斷章取義;善巧者為自己解釋了之後,用到自己的身上才叫恰如其分。那麼從「斷章取義」到「恰如其分」,中間的過渡最重要的是要靠什麼呢?「<p> 要靠這個引導的人哪!<p> 」接著師父又說:「<p> 這一點我們必須要了解。<p> 」「<p> 要不然的話我們難免會引起誤解<p> 」,引起了誤解之後,誰失去了利益呢?我們會失去非常大的利益! [03′53″]</p>
<p>   像這一點,賽倉大師在他所著的《中觀筆記》中說:「最初沒有聞思就修習奢摩他」,沒有聞思就開始直接修定。「要生起也並不是很困難,一、兩年就能生起」,修定也不是很困難的。但是賽倉大師接著說:「但是壽量無法確定,無法將奢摩他轉為道用便死亡的話,由於奢摩他的力量會投生於色界等處,對於異生來說那裡是無暇處,是不好的!」 [04′27″]</p>
<p>   像我們一開始學習的時候都很想學打坐。我當初也是,非常非常想學習打坐,認為打坐就像佛陀那樣可以開悟,開悟就可以解決很多問題,尤其是解決生老病死。但是到底死結結在哪裡?悟——到底悟什麼?都是不知道的,以為一打坐就可以解決。 [04′49″]</p>
<p>   其實我們學習〈奢摩他〉、〈毘缽舍那〉的時候,就知道從止到觀它的問題一層一層的,是非常非常嚴謹的一個次第。但是如果一個最初的入門者什麼都沒有聞思,就去學習奢摩他的話,可能並不了解真正要修學奢摩他的意義。甚至到最後會把奢摩他看成是慧分——它是定分,結果看成是慧分;甚至有的人連奢摩他沒生起也不知道,以為就是生起奢摩他。這裡舉的還是生起奢摩他了,但是奢摩他沒有轉為道用,他只是來生投生在色界了,結果對於一個凡夫來說那裡還成了無暇處——投生色界之後沒法修行了,所以是不好的! [05′35″]</p>
<p>   所以像格魯派就會致力於什麼?一定要透過聞思確定教法的扼要,不是一開始就要修定,大家都知道這個特點。一開始要透過聞思確定教法的扼要,之後要修持不共外道的奢摩他,這是個特法。但是不了解這個特法的人會覺得這是個缺點,好像怎麼都不修定?先廣大聞思,然後把修定轉為解脫生死的這個力量,而不要成為一個投到無暇處的力量,這樣的話,對我們來生來說沒有什麼太大的幫助。所以賽倉大師在他的《中觀筆記》裡這樣的一段說法,恰恰是說中了我們很多人的心病吧!大家可以捫心自問一下。這就是一種教授,這就是一種有祖師、菩薩的教授的特點。 [06′29″]</p>
<p>   像妙音笑大師在他所著的《大中觀》中也說:「想成為智者與不讀大經大論,這兩者是自相矛盾。因此,應該了解到以此開啟慧眼,進而仔細地抉擇宗大師父子的論著,那麼一切智智就在手中。」這都是智者所說的話,為什麼要去聞思,要去了解這麼多?乃至我們要學《廣論》的時候,還要學為了顯示法的根源開示造者殊勝,為什麼要學這些? [07′02″]</p>
<p>   再舉一個例子,在宗大師所著的《入中論善顯密意疏》中也說過:「因此大乘行者,如同《中論》中所說,對於成立一個事物的無諦實,也是用無邊不同能立的正理來成立的,所以對於真實義而言,智慧是非常廣博的;對於小乘行者,他用簡略的正理,以量來成立真實義,也不會像大乘的行者那樣修持,所以對於真實義而言,智慧並不廣博。因此才會提到廣略修持無我、圓不圓滿這些差別。之所以會有這樣的差別,是因為聲聞、獨覺只是為了斷除煩惱而精進,只要證得真實義簡略的意涵就夠了,不用學太廣;而大乘行者為了要斷除所知障,必須要對真實義增廣智慧,而令智慧極為廣博。」 [07′59″]</p>
<p>   像宗大師在《入中論善顯密意疏》裡,乃至妙音笑大師、賽倉大師的這些觀點,如果我們不廣泛地學論,是不會得到這樣的見解的。我們自己看經典,會得出這樣的見解嗎?任何一個內心的迷惘、對於經典的誤解之處,都會把我們陷溺在那裡,可能還不是陷一生。我們自己陷在那兒之後,可能覺得自己的見解是正確的,還會去跟別人宣說,把別人也引導到一個險處。 [08′29″]</p>
<p>   所以能夠學習這些祖師們寫的論典,尤其是對佛經引導我們凡夫如何次第而進,進而走大乘、了解空性。什麼時候修定更為恰當,祖師們做了非常精確的一個抉擇。所以對我們這些後學來說,能讀到這樣的就少走多少年的彎路,是非常非常幸運的! [08′56″]</p>
<p>   所以師父說:「<p> 為什麼它這個法這麼好!<p> 」可以看到師父講到這邊的時候,好像很振奮、很激動的感覺。一提到宗大師的教法,師父常常都是非常非常地感動、非常非常振奮地給我們說:「這個法實在是太美了!」因為這裡邊有無邊的正理抉擇,就像配好的藥一樣,拿來吃就可以了,不用我們再去找,萬一找錯了就麻煩了!所以一定要為自己能遇到這樣清淨圓滿的教授,在心裡悄悄地鼓掌,然後感恩佛菩薩。 [09′34″]</p>
<p>   如果沒有宗大師寫《廣論》的話,我們深入經藏,把佛陀所有的《大藏經》讀一遍,能不能讀出三主要道?能不能讀懂空性?甚至能不能讀懂大乘發心對於成佛次第的重要性?乃至先聞思,還是上來就修止,哪個對我們更好、更划算呢?這些祖師幫我們抉擇完了,我們學習得是不是輕巧多了呢?儘管我們可能會對這樣的抉擇說:「是這樣嗎?」你再去看看經典,看能不能得出比宗大師、比妙音笑大師更精彩的結論呢? [10′09″]
<p>   那麼還有一點,因為我們要想修學的時候,必定有一個特質,因為我們是個凡夫。假定說我們成了佛的話,我們不是修學,我們教別人;我們只是凡夫,了解了這個苦要去學,所以我們的的確確,雖然學的人說應該有辨別的能力,可是這個辨別能力的確不強。那麼這個時候根據這個什麼?根據真正有成就的世間,或者在我們這個圈子裡邊,經過了時空考驗以後,經過這個如理抉擇以後,肯定他的價值的,那個是我們認定的一個標準。本來這種認定的方式,本身是並不圓滿,但對我們來說,也只能用這個;我們找人說,大家都說這個人好的,你也好的。那麼然後大家說的當中有兩種:有一種壞的人說好的,這個不一定;有一種是好的人說好的,那大概就可靠。好的人當中又是智慧的人說好的,那他跟智慧一定相應;有很多人福德的人說好的,那這個人跟福德一定相應。這個是我們抉擇我們要跟的這個善知識的一個重要的條件。 [01′32″]</p>
<p>   在這一段大家可以想一下,師父開始說:「<p> 因為我們要想修學的時候,必定有一個特質<p> 」,這個「特質」是什麼呢?接著師父說:「<p> 因為我們是個凡夫。假定說我們成了佛的話,我們不是修學,我們教別人;我們只是凡夫,了解了這個苦要去學。<p> 」短短的這幾行,涵義很深喔!想要學的時候我們必定有一個狀況,就是我們了解了這個苦,然後要去學。師父說假定成佛了的話,就去教別人,不用學了。 [02′31″]</p>
<p>   那麼「<p> 的的確確,雖然學的人說應該有辨別的能力<p> 」,因為沒有辨別的能力就沒法學了,可是這個辨別的能力到底有多強呢?師父怎麼說?「<p> 辨別能力的確不強。<p> 」又是凡夫,有一點辨別能力,然後這辨別能力又不強。「<p> 那麼這個時候根據這個什麼?<p> 」我現在要問大家一個問題:「這個時候根據什麼」,這句話是問什麼的?從我們因為了解苦要去學佛法,但是辨別能力不是很強,要根據什麼、做什麼呢?同學應該想到了吧!要有一個根據去選擇善知識,對吧? [03′32″]</p>
<p>   因為在前幾段的時候大家有學過,師父說:我們要學任何一樣東西,一定要跟一個自己有正確認識的人學,這樣才能學得好。就佛法來說是不能夠有任何的錯誤,佛法本身是否清淨絕端地重要。那麼想要得到清淨圓滿的教法的話,引導我們本身的善知識的條件就是決定因素,所以我們總得有一個根據去選、去學習。師父在此處提出的問題非常非常重要,非常精彩的提問! [04′16″]</p>
<p>   根據什麼呢?根據真正有成就的世間,或者在這個圈子裡邊經過考驗之後,如理抉擇,肯定他的價值的,那個是我們認定的一個標準。還是有一個標準可以衡量的。經過時空的考驗、如理抉擇之後肯定他的價值;就是已經穿越了很長時間,他的價值還是像天上的星星一樣璀璨無比的。 [04′48″]</p>
<p>   「<p> 本來這種認定的方式,本身是並不圓滿,但對我們來說,也只能用這個。<p> 」這句話怎麼理解呢?比如「<p> 我們找人說,大家都說這個人好的,你也好的<p> 」,注意!在這個好中有兩種:一種是壞的人說是好的,這樣不一定;一種是好的人說是好的,那大概就可靠。在我們這個根據裡再去分一下,有了那麼長的時空印證之後,好人說的好的,在好的人當中又是有智慧的人說好的,那麼一定是跟智慧相應的;如果有很多福德的人說好的,那跟福德一定是相應的。這個是我們抉擇我們要跟的善知識的一個重要條件。 [05′40″]</p>
<p>   這一段從前面看過來的時候,有一些同學會跟我說:「看到這一段非常奇怪,師父為什麼又轉過來講這個呢?」因為前面已經都講了,對我們非常非常重要的善知識、傳承清淨啊,講到那邊;然後突然又講到我們自己了,前面不是已經講過自己了嗎?這邊又講到自己了。講到我們自己講到什麼程度呢?就是好像慧力也不是很高、抉擇慧也沒有多少,在這樣的狀態下要怎麼去抉擇呀?所以師父在這裡邊列舉了幾個標準。不知道大家覺得這樣的標準能不能用得上呢?是不是很實在呢?  [06′22″]
<p>   我舉一下祖師的例子。像賈曹傑大師所著的《釋量論顯明解脫道疏》有了這樣的一個提問,大家可以聽一聽,看跟師父在這一段講的有什麼關係。說:「那麼,在做了這樣的觀察的時候,是在認他為導師之前,就知道他有證達解脫道的功德嗎?還是在這之前是不知道的?如果已經知道了,那就表明自己已經了解滅苦的方便了,所以再去尋求他就成為無義了!假設不知道就去依止,那就是還不能辨別誰是所應依止、所不應依止的,理當最初遇到什麼人就依止誰。」這樣的一個疑問——一定要選擇一個這麼殊勝的導師去學,但是我們怎麼樣去了解他的功德?問題有聽明白吧? [01′18″]</p>
<p>   這樣會不會有過失呢?回答:是沒有這樣的過失的。「我這裡所說的是具有觀察的人尋求知識的軌理,他在最初的時候,用正量曉達粗分的義理,並且以伺察意了知其些許細分功德,然後又詢問他人,並且透過共許,也能得知那一部分。」跟師父在這一段講的是不是差不多?抉擇慧沒有特別特別地多,但是有伺察意——就是師父說有那麼一點智慧。「了知其些許細分功德,然後又詢問他人」,大家共許出來,經過了時空考驗的,有智慧的人選擇的、又是有福德的人選擇的,「透過共許也能得知那一部分」。是不是一樣的?這是賈曹傑大師對這個問題的設問和回答。 [02′16″]</p>
<p>   再看貢唐大師所著的《辨了義不了義善說藏釋難論》中,也做出了同樣的結論:「所以在最初的時候,雖然還不能以正量證達他具足通達實性的功德,但是也要透過經中所說通達空性相的身語行誼,以及觀察他所宣講的教理,一方面自己觀察,同時也詢問於他人,然後發起信心而依之為師。」這一點是要透過經典去觀察。透過經典還是有那個問題——同樣是研究經典,有的人研究得深,有的人研究得淺;智慧深的人就會研究得深,智慧淺的人就會研究得淺。所以還是必須得用伺察意觀察,同時也詢問他人。賈曹傑大師和貢唐大師同時提到了這一點,師父也在此處提到了這一點。 [03′15″]</p>
<p>   這段話如果師父不在此處幫我們考慮的話,不知道大家會不會覺得為難,或者有些人就略過去了?因為要選擇善知識,選擇之後就一直要修信念恩,不能改變,要跟隨他修學,所以只有一點點智慧的時候,怎麼樣去相應這件事情?師父用這麼簡短的一句話,給了我們這麼明晰的準則,不知道諸位心裡有沒有一個震動? [03′49″]</p>
<p>   可能這段話不仔細講的話,會覺得好像講的就是挺普通的一件事情,但是再看一看祖師們在論典中所設問和回答的,就知道他還是在討論一個量則的問題。當我們在擁有這一點點慧力,又有福報可以詢問到那些有智慧的人的時候,我們是否可以依止到真正的善知識?應該是可以的! [04′16″]
<p>    現在這地方,他下面就把這一點的行相指出來。所以我們目前,雖然不能認識佛法本身的內涵,沒有殊勝辨別善惡的能力,可是我們卻有世間上面這種的共識。所以他現在拿這個共識來告訴我們說:「啊,對、對、對!這個才是。」於是啟發你的恭敬仰望一心想學,你就學對了。有了這個標準以後的話,那個取捨就取捨對了。 [00′38″]</p>
<p>   接下來這一段師父就結論說:雖然不能認識佛法本身的內涵,沒有殊勝辨別善惡的能力,可是我們卻有世間上這種共識。拿這種共識來告訴我們的話,也可以啟發我們的恭敬仰望、一心修學這樣的心。師父接著就肯定說:那就學對了!「<p> 有了這個標準以後的話,那個取捨就取捨對了。<p> 」所以不是因為自己只有一點點智慧,然後碰到誰就跟誰學;或者因為我也不知道怎麼回事,所以索性誰也不跟誰學,就自己讀自己的。還是要去就師父給我們的共識,運用自己的抉擇慧,運用所學的教典,加上這幾點一起去抉擇。所以在這個階段內,師父會告訴我們怎麼樣地運用自己所具有的這個能力,去選擇依止善知識,這點經驗對我們來說至關重要! [01′49″]</p>
<p>   這裡邊還有一個問題:拿這個共識來告訴我們的話,會啟發我們的信心。大家覺得是這樣嗎?共識——很多人都承許的那種功德,對我們自己來說是沒有的,所以一定會啟發我們恭敬、仰望的心想要跟他學,有這個心就會被善知識所饒益,大家想一想是不是這樣的? [02′25″]</p>
<p>   所以在課下談論,還有在自己的思想自由馳騁的那個空間,如果我們常常注意到去思惟佛菩薩的功德、善知識的功德,這樣我們開口說起來也是這些,達成了這些共識;也可以讓那些剛剛開始學佛、不知道怎麼回事的人,他們聽一聽之後,就生起對佛陀、對教法的嚮往,然後就找到了這條路,所以這是一件對自他都有好處的事情。如果我們善於知道最基本的善知識德相的條件,在內心裡數數地憶念,然後行之於身口的話,對自己和周遭的人,還有對剛剛學佛的人一定是有一個很好的影響。就想:假如那個剛剛學佛的人是你我呢?如果聽到這樣的嘉言,不就是沿著這樣的言論找到宗大師教法了嗎? [03′25″]</p>
<p>   好!我們再聽下一段。<p>   那麼第一步呢,說這個要去學;這個修學佛法,要一個重要的特點,要什麼?恭敬心。平常我們最大的障礙,都是說:「哎呀,我有業障啊!」業的中心是什麼?「我」。我的特質是慢,當你有一個慢的心,這慢總歸是我總覺得最精采。平常所以我們跟人家聊天也好什麼,自己總是自己的意見總是對的,因為你有自己的意見,那個障礙在那裡,別人的東西就進不來。假定你是了解對方的高明,他告訴你方法的正確,你那個時候,心裡面就把慢心就降低了。這個慢心對治它一個非常好的方法——恭敬。 [04′11″]</p>
<p>   接著說我們要去學了,修學佛法有一個最重要的特點,記著吧?這個特點是什麼?這個特點居然是恭敬心!大家想:欸,學習佛法好像最重要的是信心吧?但師父此處講了「恭敬心」。師父先講了它的反方——恭敬心的障礙是什麼?平常我們最大的障礙就是:「哎呀,我有業障!」「<p> 業的中心是什麼?<p> 」就是這個「<p> 我<p> 」呀!就是自性執的我。「<p> 我的特質<p> 」,師父在此處說「<p> 是慢<p> 」,我們怎麼觀察呢?就是當有一個慢心的時候,「<p> 總歸是我總覺得最精采<p> 」。平常觀察的時候、聊天的時候,聊什麼呀?師父在這裡邊用了兩個「總」,「<p> 自己總是自己的意見總是對的<p> 」。「<p> 因為你有自己的意見<p> 」,會產生什麼問題呢?就障礙在那兒,所以別人的東西就進不來。 [05′15″]</p>
<p>   那怎麼對治呢?就是我們認真地聽一聽別人高明在哪裡。一旦聽到別人比自己高明的地方,那麼我們再了解到他告訴方法的正確性,這個時候心裡面的慢心就會降低了。所以慢心用什麼來對治啊?大家說磕大頭,都說:「我磕多少輪了、磕多少輪了!」計數當然是非常非常好的,但是有沒有觀察一下,磕了這麼多輪小禮拜或者大禮拜之後,我們的慢心是否降低呢?還是因為我磕了這麼多頭,反而生起了慢心:「看!我磕了這麼多頭,你都沒有磕!」注意!是降伏我慢的。降伏了我慢會出現什麼?才會有恭敬啊!有恭敬才會好好地學。 [06′10″]</p>
<p>   所以師父在這裡邊再去引申:當我們就世間共識的功德了解了之後,生起了向上仰望的心,那還差什麼呢?師父又進一步剖析我們內心中那個「我」呀!很大的那個「我」,要用恭敬來對治。怎麼辦呢?就要聽得進去別人的功德比自己高明之處,不能自己有一個東西老是塞在那個地方,什麼也進不來,這樣的話怎麼進步呢?所以這一段層層深入地引導我們的心,要朝向恭敬的方向。其實我們已經在被師父的法語調伏了,一點點地調伏。 [07′00″]
<p>   所以他第二步說這個:啊,不但這個造的人這麼殊勝,而且造的法這麼殊勝,「啊,這麼好!」於是你一心仰望,於是那恭敬心提起來,那個時候你就能夠正式修學佛法。所以他在正式講這個法之前,先把這個法的殊勝說一下,啟發我們對這個法的恭敬。我們平常所以愚痴,最大的原因就是不恭敬,所以當你恭敬的時候,一方面眼前修學佛法,是一個最大的推動的力量,障礙減少,同時呢以前的宿障也能夠淨除,這個是一個很重要的原因! [00′49″]</p>
<p>   這樣很快地聽一遍,如果你們課下沒有去聽師父的帶子的話,聽完能很快地了解嗎?要重複地聽哦! [01′01″]</p>
<p>   前面推論這麼多,說到底有沒有智慧呀?沒有智慧怎麼辦呢?能不能依止到善知識?然後,師父講到這裡了:哎呀!不但造的人這麼殊勝,而且造的法這麼殊勝,這麼個好法,所以我們一心仰望,恭敬心就提起來。造者殊勝、法殊勝,為什麼講這兩點?其實是為了降伏我們的慢心,讓我們知道依止的善知識是怎樣的,從而提起恭敬心,因為佛法要在恭敬的狀態下才能很好地修學。所以師父把這個來龍去脈講得很清楚。 [01′38″]</p>
<p>   很多年前,很多人可能沒有習慣學很多教典的時候,能有著這樣非常非常善巧,還把我們內心中的那種疑問能夠答出來的善知識,是不是很幸運啊?所以在這個時候,師父說在正式講法之前,要把法的殊勝說一下,啟發我們對法的恭敬。接下來一句話,「<p> 我們平常所以愚痴,最大的原因<p> 」是什麼呢?師父在此處說:「<p> 是不恭敬。<p> 」大家內心裡會覺得是這樣嗎?我愚痴是因為不恭敬嗎?你們可以討論、討論。 [02′25″]</p>
<p>   其中一點,我會發現特別愛學習的人確實他會在很多境界裡都想要學;想要學的話,就會注意別人哪個地方比自己超勝;對教典的理解,還有行持的部分,什麼樣的品德是比自己超勝的,他就很注意去看別人生命裡最閃光的部分。如果一直很我慢的話,是看不到別人比自己超勝的部分;他沒有那樣我慢的心,懷著恭敬心去看的話,一定會看到很多很多閃光點,看到了之後他就會去學,學久了之後,能不成為智者嗎?還會那麼愚痴嗎?所以如果師父不做這樣的連結的話,很難想像自己一個不恭敬的身語意狀態會導致愚痴,甚至越來越愚痴嗎?我們可以捫心自問一下。 [03′32″]</p>
<p>   那麼恭敬的心態,師父說:「<p> 一方面眼前修學佛法,是一個最大的推動的力量,障礙減少,同時呢以前的宿障也能夠淨除。<p> 」什麼叫推動的力量,而且是最大的?為什麼恭敬心成為一個最大的推動的力量呢?大家想一想:我們最大的推動的力量應該是好樂心嘛——我喜歡,為什麼是恭敬心呢?我問大家一個問題:如果是我喜歡的話,那喜歡什麼呢?比如喜歡學佛法的什麼呢?教給我們的眼界,對吧?我們怎麼樣去看待一個問題。一旦我們去看自己的時候或者看他人的時候,這種眼界一定就會合乎於恭敬的。因為不恭敬的話,跟佛法整個的見解都是不相符順的,學著、學著就沒有意思了。 [04′49″]</p>
<p>   大家考慮、考慮:當我們去拜佛沒有感受的時候,當我們去學經典沒有感受的時候,當我們去聽佛法沒有感受的時候,請問是不是恭敬心出問題了呢?我們面對佛像的時候,心裡沒有什麼感動,是由什麼導致的?比如說看到觀世音菩薩的像、看到釋迦佛的像,那種從寺院很遠的地方就想要跑過去,然後跑到佛像前就想一下子拜下去,非常歡喜和虔誠地看著佛像,那個心慢慢地模糊了之後,我們到底要怎麼樣去把它修起來呢? [05′32″]</p>
<p>   要想一想、憶念佛陀的功德,想一下:釋迦佛為悉達多太子的時候,怎麼樣地離開了王宮進入了苦行林?他從一個怎麼樣的生活狀態,進入到了赤著腳、托缽,什麼都沒有的一個修行者的狀態?他不是一般的王公貴族,因為他就是未來的國王,他棄捨的東西和他想要得到的東西,如果棄捨的比得到的更多的話,那不是做了一個顛倒的選擇嗎?一定是在自己的生活降到不能再低的水準的時候,他的精神得到了前所未有的豐美、大樂、大自在。那麼在這其中,進入苦行林,費了那麼多辛苦的修行,得到了佛法之後為我們宣講佛法,這一切的辛苦,我豈能站在他面前對他無動於衷呢? [06′37″]
<p>   所以當我們觀察到自己內心中對於佛陀、對於經典的麻木和平淡的時候,要現起對治,要去尋求為什麼會變成這樣?是不是失去了最大的推動的力量——恭敬?那麼恭敬是由什麼生起的呢?是不是要知功德、知恩德,才會生起這樣的恭敬?這個時候,由念恩、念功德的心去憶念的話,內心的敬意自然就油然而生。因為我們如果不是對佛陀有很深的一種感動、被他的教誨所牽引,我們也不會走到這裡來。對不對?所以當那個心慢慢地模糊之後,要再令它清晰。 [00′48″]</p>
<p>   那麼修學了一段時間沒有什麼進步,這句話可不可以來觀察一下自己?為什麼都沒有進步?是不是因為失去了恭敬心?或者沒有注意修學恭敬?因為師父在此處說:「<p> 眼前修學佛法,是一個最大的推動的力量。<p> 」而且會減少障礙,因為不恭敬的話會滋生很多煩惱。 [01′12″]</p>
<p>   舉個最簡單的例子:我們常常說在廣論班的時候請大家要做善行點滴,大家都講一下你在這一週做了哪些善行。有的時候班裡的同學難免有一些小小的誤會或者磕磕碰碰,甚至家裡邊有一些事情,到班裡不太高興,看別人不太順眼。可是到善行點滴的時候,大家就會側耳傾聽,非常認真地聽他做了什麼樣的善行。聽著、聽著就發現,在一瞬間就會對那個人改觀,因為發現:哇!他心裡這麼善良都是我不了解的!一瞬間就清除掉了。然後就會重歸到對那個人的禮貌、恭敬的狀態。 [02′00″]</p>
<p>   另外,師父又提出:「<p> 同時呢以前的宿障也能夠淨除。<p> 」有很多這樣的公案,不是有一個人說他的壽命不太長了,就問佛怎麼辦?佛就要他對著一個城門天天去磕頭,那個城門進來的每個人他都要去磕頭。結果有一天就磕到了他的怨家,他的怨家本來找他算帳,一看他在磕頭就饒了他。這也算是一個淨化宿障最典型的例子。所以如果我們能夠對其他人抱持著恭敬心的話,那麼是不是可能該成熟的惡緣,由於恭敬的緣故就沒有成熟了? [02′42″]</p>
<p>   由於我們想要恭敬佛菩薩、想要恭敬善知識、想要恭敬教典,因為這都是我們需要恭敬的,所以我們就非常努力地在內心中修持恭敬,慢慢地就能夠恭敬身邊的很多人。由於恭敬的緣故,我們現行的障礙會減少很多,而且還可以減少宿障——過去的障礙,這是一件很美的事情! [03′08″]</p>
<p>   師父花了這麼大的篇幅來講為什麼要講「造者殊勝」?為什麼要講「法殊勝」?就是為了引生我們的恭敬心,讓我們不要那麼我慢,我慢擋在那兒什麼都進不來。而且又講了恭敬是這麼美好的一件事情,它是一個學佛法最大的推動力,不僅僅現行的障礙能夠減少,還能夠淨化以前的障礙。所以當我們在學到「造者殊勝」和「法殊勝」的時候,我們就會得到師父所說的這些利益,大家一定要好好地學! [03′42″]</p>
<p>   談到愚痴的話,大家可能覺得它的正對治應該是成為智者;要成為智者,就是深入經藏、多學教典。那為什麼是沒有恭敬心成了愚痴呢?大家可以作廣泛的討論。其中有一個理路是:很多教典都在宣說佛菩薩的功德,比如說講菩薩幾地、幾地的功德,我們可以看自己有沒有?甚至大阿羅漢的功德。舉個最簡單的例子:對上師生起殊勝信心的那種樣子自己有沒有?教典全部都是在講超勝於自己現行的那種功德,當我們去學習的時候,處處觀察一下自己,就會發現:哇!有這麼多的先賢、聖人在我的生命中,我豈能自己覺得自己很了不起、不好好學! [04′44″]</p>
<p>   像師父在教我們的時候,他不是站在一個高高在上的師父的角度。在師父的日記裡,比比皆是都可以看到他是那麼謙恭,像很小的小學生那樣一個狀態,每天對佛菩薩啟白,傾訴他內心的虔誠,小心地檢討著自己三業哪裡、哪裡有問題,一絲不苟地檢查。看到了徹骨地虔誠和徹骨地恭敬的皎潔的比丘的形象,所以師父講的其實和他的行持是一樣的,也和教典的依據是一樣的。 [05′30″]</p>
<p>   所以在這點上,如果我們稍稍用理路去推演一下,結合自己的內心,如果能把念頭、把知見轉了的話,師父講的這一小段教誨,一定會對我們此生乃至生生世世產生非常大的影響,甚至徹底改變我們! [05′52″]
<p>   以前在求法的時候,會常常感到求一個法是非常不容易的,要花很大的努力才能求到。在聽法的整個過程,每天、每天的狀況不一樣,以前在五臺山聽《入中論》的時候,會遭遇到很多很多的狀況,有的時候生病算是一例;就是不生病,也會有一些交通啊,或者突然這裡出問題、那裡出問題,讓你不能夠在聽法之前內心很安靜。 [00′36″] </p>
<p>   這個時候聽法的時間到了,你要準時到寺院去上課。在上課的時候,因為那件事衝擊力很大,比如說在五臺山的話,住的那個小旅館說:「啊!你今天不能住這兒了,要搬家!」又沒處搬,拖著行李,行李就放在外面,然後在裡邊聽課,也不知道聽完之後去住哪裡。所以在這樣的狀態下,怎麼樣能夠在善知識的法音一響起來之後,我們就全神貫注在聽法,暫時地棄捨現世?這還是源於對法非常熱烈的一個希求心。 [01′19″]</p>
<p>   這個希求心是很奇特的,就是你非常、非常想聽法,但是偏偏在聽法之前出了一個事情佔據自己的心,波瀾起伏了一下,這件事還沒處理完,聽法的時間到了,能不能非常快速地轉移到這個法的善所緣上,那件事就好像沒發生一樣,被接下來法的續流排到後面去了?不然就會坐在法會中心馳餘處,不管善知識講得多麼精采,我們的心總是攀緣在剛才發生的那件事上,在盤算著怎麼解決、怎麼收場,甚至一直在調伏自己的某一種情緒。等到調伏完了之後就下課了,這節課就沒有聽到。雖然向內調伏也是很好的,但是這節課的內容卻沒有學到,還要自己補課! [02′10″]</p>
<p>   那麼怎麼樣練到一聽到善知識的法音就立刻被這個法音所吸引,其他自己所想的那些緣突然好像消失了一般呢?我認為是源於熾烈的歡喜心和希求心。當我們特別特別歡喜的那件事出現的時候,我們的眼裡、我們的心裡就只有那件事,其他的不愉快、其他的傷痛,甚至身體的病痛,在聽到法的時候好像都停止了。所以法對於有希求心的人來說,確實有一個很深的療癒作用、轉移作用,會讓傷痛停止,會讓焦灼停止。心裡全神貫注在聽法的時候,實際上就會同時產生一種愉悅和療癒。這是就很淺的部分來說。 [02′58″]</p>
<p>   那麼對法的希求心是怎麼生起來的呢?大家可以想一想這個問題。當我們有了那樣的一個希求心之後,我們就可以受用這個希求心所帶來非常現實的利益——你一聽到法之後就開心,一聽到法就好像把人世間所有的痛苦都忘記一般,真實地體會到法的拔苦與樂的作用。所以那一點是滿真實的! [03′26″]</p>
<p>   大家只要在希求心上作非常真誠地探討,不要思惟個幾天、操練一下,然後就放置在一邊——在沒有生起強烈地希求心的時候就放著,或者認為自己生不起來;什麼事情都是透過串習生起來的,何況這是一個真實可以生起來的對境,又不是一個欺誑的法。所以非常希望大家能夠常常地練習,讓自己的心去希求於正法,在聽法之前好好地作前行。 [04′00″]</p>
<p>   好!那我們現在就聽師父繼續講。 [04′06″]</p>
<p>   那麼說,哦,有這樣的殊勝的造論的成就者,造了這樣殊勝的這個解釋的法。下面哪,還要一個道理——對於這樣的殊勝相應的法怎麼樣聽、怎麼樣講。你在這種狀態當中才跟它相應,否則的話這個還不相應,這個還不相應。那麼這個第三點,平常往往疏忽掉了,實際上這一點非常重要,非常重要!這個詳細的內涵,講到第三點那部分自然會有很清楚明白,很清楚明白。 [04′51″]</p>
<p>   在這一段師父說:「<p> 有這樣的殊勝的造論的成就者,造了這樣殊勝的這個解釋的法<p> 」,就是前面那兩個科判。接下來進入第三個「<p> 如何講聞二種殊勝相應正法<p> 」。「<p> 還要一個道理——對於這樣殊勝相應的法怎麼樣聽、怎麼樣講。<p> 」注意!可能新同學不是特別熟,老同學已經非常熟,就是「怎麼聽、怎麼講」,「<p> 你在這種狀態當中才跟它相應,否則的話這個還不相應<p> 」,師父又說一遍「<p> 這個還不相應<p> 」。當我們遇到了一個殊勝的法,我們都習慣去跟善知識求法。求法的時候好像心力還滿猛的,想求一些沒聽過的,對沒聽過的法都很有希求心。那麼求了法之後,對於自己怎麼樣地聽是否做過詳盡的規劃呢?有沒有想:求法的機緣成熟了,善知識非常歡喜地答應給我們講的時候,如果由於怎麼樣地聽沒有做詳細的規劃,那師父說在這種狀態中是還不能相應的! [06′07″]</p>
<p>   接著師父說:「<p> 那麼這個第三點,平常往往疏忽掉了。<p> 」我想問大家:是誰的平常?師父在說誰的平常往往疏忽掉了?是指知道道理的人,還是指不知道道理的人疏忽了呢?你們的答案會是什麼呢?不知道道理的人能疏忽它嗎?不知道世界上有怎麼聽、怎麼講的規矩。像以前沒有學《廣論》的時候怎麼聽?我們大概就是專心地聽、不要走神,就知道這些。那麼學了《廣論》之後,我們知道聽聞軌理的那麼多要求。 [06′54″]</p>
<p>   所以大家會覺得這是對於知道道理的人,還是不知道理的人呢?師父說:「平常往往疏忽掉了」?誰的平常?是我們自己的平常嗎?拿這句話向我們的心去觀察的話,「疏忽」兩個字是什麼意思呢?現在怎麼講的,是不是沿著說法軌理那樣說的;聽法的,是不是沿著聽法軌理那樣聽的?那麼「疏忽」是什麼意思?疏忽是已經知道了還是不知道呢? [07′33″]</p>
<p>   疏忽!舉一個很簡單的例子。假如一個手術室的大夫,他在進手術室之前都要進行嚴格地洗手,最後要戴上手套。他洗了手之後,是不能用他的手推開手術室的門的,必須用他的身體、用肘讓那個手術室的門打開,因為他的手已經洗過了。為什麼這麼嚴格地要把手洗乾淨,這個情節一定要這麼被重視呢?因為如果一開始手沒有洗乾淨、其他的器具沒有消好毒,那麼這個手術就有可能失敗。失敗是什麼意思呢?就是你把該割掉的都割完了之後,實際上這個人是活不過來的!為什麼呢?因為中途發生了感染。那麼為什麼發生了感染?就是跟之前沒有好好洗手有關係。所以手術室的大夫進入手術室之前的那個洗手的動作,就變得非常地重要!它是不可以被忽略、不可以被疏忽掉的,因為一疏忽之後,後面就是人命,整個全部都失敗了! [08′50″]</p>
<p>   這是非常重要的一個成分,是不能被疏忽掉的。像你出門去其他國家,護照丟了,那就問題很嚴重。所以「疏忽」是一個非常重要的事情、應該天天記得的事情,可是由於疏忽的原因它就不見掉了。不見囉!師父說:「<p> 實際上這一點非常重要!<p> 」又一個重複:「<p> 非常重要!<p> 」 [09′16″]</p>
<p>   到這裡,我們可以觀察一下自己:當我們每一次開始去聽法的時候,我們會不會還在「如何講、如何聽」的這一點上,非常認真地,就像手術室的大夫一樣詳盡地洗手,做這個準備?會不會這樣? [09′33″]</p>
<p>   我問完了這個問題的時候,你能清晰地想到自己疏忽的現行嗎?比如哪一次聽法自己是疏忽的?自己疏忽的那個心和行相是什麼,能抓得到嗎?不然就變成說:「啊,我總是疏忽!」這樣一個大概的對自我的檢查,下次應該也沒有什麼改變。疏忽的行相到底是怎樣的?心態到底是怎樣的?會出現怎樣的動作、怎樣的神情?那麼不疏忽的樣子又是怎樣的?腦海裡有沒有清晰的行相?這一點,我認為也很重要!因為如果我們不去詳細地尋找的話,疏忽的樣子到底是什麼,我們並不認得;如果把非常非常重要的一個步驟疏忽掉的話,我們可能整個修學佛法都失敗於此,所以這個問題是非常非常重要的一個問題! [10′41″]
<p>   師父舉了例子,大家可以聽一下接下來師父所講的。 [00′10″]</p>
<p>   這地方我不妨舉一個簡單的例子來說明一下,譬如說我們現在要到哪一個地方去——當然我們現在是要從凡夫地跑到佛地,那麼這個都是精神上的、哲理上的——我們現在用一個眼前看得見的,事相上的這個比喻。譬如說:我到台南去。你可以走路,走路不要任何準備,反正你站起來就走了,不就行了嘛!你只要認得這條路,有人告訴你這個路怎麼走,就這樣。那麼換句話說,有一個過來人告訴你怎麼走,然後呢,指示給你這個方法,那個沒有錯,這兩者夠了,你不要其他準備的。<p>   下面腳踏車,對不起!腳踏車就要準備準備囉,那個腳踏車過去的時候,上面嘛看看那煞車好不好,然後呢鏈條很久沒有用,要加點油,哪一個地方等等,要一點準備。如果汽車的話,那準備更多,說前面這個冷卻引擎的水,然後呢機油,然後呢汽油,然後輪胎裡面的氣足不足,你準備好了以後才行啊!如果是飛機的話那更嚴重,如果準備不夠的話,不動滿好,一動出起毛病來,到那個時候的話性命交關。儘管已經有一個人告訴你怎麼走,然後這個路也告訴你清清楚楚,如果你不準備好的話,出毛病喔!這是千真萬確的事實!<p>   所以我們現在,有很好心學佛的人,也有圓滿的教法,我現在所體會到的就是第三點。所以關於第三點真實內容,你們慢慢地下去自然會了解,為什麼這麼重要,實在是太重要、太重要!最後呢有了前面這個樣樣準備好了,那個時候就開始了,說正以引導。 [02′13″]</p>
<p>   問大家一下,師父舉了幾個例子?走路、騎腳踏車、汽車,然後是開飛機。但是我問大家,師父說:「<p> 有一個過來人告訴你怎麼走,然後呢,指示給你這個方法,那個沒有錯,這兩者夠了,你不要其他準備的。<p> 」是不是走路不要準備?「不要其他準備」和「不要準備」是不是同一個問題?所以那就是還要準備,只不過是不要其他準備。因為你不用準備自行車、不用準備汽車,但是關於走路的一切你還是要準備的。我不知道師父這是從哪裡要到台南去,是不是很遠?很遠的話,要準備水吧!可能要準備吃東西,還是要準備。所以說「不要其他準備」不是不準備,而是不要其他的準備。 [03′16″]</p>
<p>   在這一段的時候,我不知道大家聽完注意點會在哪裡?會不會說:「自行車代表什麼樣呀?腳踏車代表什麼?汽車代表什麼?飛機又代表什麼?」你們會不會在想這個?那麼我們要走的路是從哪裡去哪裡呢?從凡夫地到佛地。大家如果看到這些交通工具的話,當然會選坐飛機,對不對?如果是我們所有的人都選坐飛機的話,師父說:不動還滿好的,如果準備不夠的話,一動就出毛病了,到那個時候是性命交關。儘管已經有一個人告訴你怎麼走了,然後這個路也告訴你清清楚楚,如果不準備好的話,就出毛病!師父說:這是千真萬確的事情! [04′10″]</p>
<p>   大家都要問說:那飛機是什麼?汽車是什麼?腳踏車是什麼?走路是什麼?我想問:無論是走路,還是腳踏車、還是汽車、還是飛機,請問要準備什麼?這些都是個譬喻,讓我們注意力放在「準備什麼」。請問:對於我們要從凡夫地到佛地的人來說,我們到底要準備什麼呢?是不是準備那個往往忽略掉了,師父說這一點是非常重要、非常重要的,是「準備」那件事吧?那件事到底是什麼呢?現在有在心裡明現嗎? [04′52″]</p>
<p>   接著師父總結說:「<p> 我們現在有很好心學佛的人,也有圓滿的教法,我現在<p> 」,師父說「<p> 我<p> 」的時候,那個音檔記得吧?頓了一下,「<p> 我<p> 」!「<p> 現在所體會到的就是第三點。<p> 」請問第三點是什麼?那個科判,記得吧?「<p> 如何講聞二種殊勝相應正法<p> 」,就是這個!怎麼樣講、怎麼樣聽。當有了一個心想要去學佛,也遇到了圓滿的教法之後,注意!重點居然在這裡!大家想一想。師父說:「我現在所體會到的就是第三點」,這一點是告訴我們什麼呢?就是這一點上要用功夫! [05′50″]</p>
<p>   接著說:關於第三點的真實內容,慢慢下去自然會了解為什麼這麼重要,師父先說了一個為什麼重要,然後接著說:「<p> 實在是太重要、太重要!<p> 」那一定是怎麼樣講、怎麼樣聽。對於很多同學來說,對我自己也是,怎麼樣聽是非常重要的。那麼怎麼樣聽法,透過這一段文字的了解之後,大家會覺得:「哎呀,怎麼樣聽這件事太重要了!」會生起這樣的決斷嗎?還是在疑惑:「怎麼樣聽有那麼重要嗎?」為什麼師父要用這麼多太重要了、太重要了,實在太重要了,用這麼多強調的詞來形容?而且還直接說:「我現在所體會到的就是第三點!」 [06′46″]</p>
<p>   這一小段對於老學員來說,如果已經學了好幾輪了,那麼最重要的事情有沒有平常往往疏忽呢?就是怎麼樣聽法。比如說思惟聞法勝利、聽法的那幾個軌則,有沒有疏忽呢?不檢查則已,一檢查應該看到到處都是疏忽!如果這一層疏忽了,往後推的話,我們聽法的受用一定會被影響的。 [07′15″]</p>
<p>   那麼聽了師父今天的這一段話之後,雖然現在不是正在講「聽聞軌理」,但是我想問大家:師父為什麼在解釋科判的時候,就用這麼長一個篇幅解釋「如何講聞兩種殊勝相應正法」? [07′31″]</p>
<p>   其實我們聽《廣論》的時候,慢慢會發現,重要的問題師父會在整本《廣論》裡不停地講、不停地講。就像我以前問師父,我說:「師父,供養三寶的問題、集資糧的問題不是已經講過了,為什麼還要再講?」師父就說:「唉!真如啊,我們都是凡夫啊!講完之後,做一段時間就忘了,要嘛就疏忽了,所以要再提醒一下!」對於今天這節課師父在此處對我們的提醒,諸位是否會想把它放在心上?對師父這麼重視的事情——師父這麼有修行,尚且這麼重視這件事情——我想問大家:師父難道不會講法嗎?不會聽法嗎?為什麼這樣一位高僧,還要在第三點上說「我現在所體會到的就是第三點」?為什麼還要用這麼重的槌在打這一點? [08′28″]</p>
<p>   對於過來人講給我們的這一點,大家是否會在心裡邊鎖定一下、思考一下:「為什麼我生不起來覺得這點很重要?」或者「我修學這麼多年,覺得自己進步不是那麼理想......」我們會想一堆問題,通常都會想「我業障重」,但是具體是什麼業障重就沒有去分析了。 [08′53″]</p>
<p>   我們不重視師父所說的第三點,是不是業障重呢?是沒有聽清楚?還是聽清楚了之後不能持之以恆、缺乏毅力?還是常常想走捷徑,不注意具體操作的那些心靈的思想上的步驟?還是總是好高騖遠想要跑後面的?前邊的一忽略之後,後面的全部都虛掉了。到底是什麼? [09′22″]</p>
<p>   我想問大家:今天聽了這一小段,有沒有發現師父還是在治療我們的修行的毛病啊?我們用全部的心力一直朝後跑,但是師父常常說:如果不重視「聽法軌理」的話,聽了很多很多,受用堪慮呀!對不對? [09′46″]</p>
<p>   所以關於這節課,我希望大家能夠總結到一點:有一件事從一開始到中間、到最後都需要重視,就是怎麼樣把自己的聽聞軌理練習到如經論所講的那樣。如果聽聞軌理不常加練習的話,我們終究是用原來的習慣在聽聞。而聽聞佛法有它整套的規矩、一個流程,一旦你不按照這個流程去做的時候,就像一個手術室的醫生進手術室沒有把手洗乾淨、沒有消好毒,那緊接著是可能碰到他就活不過來了! [10′27″]</p>
<p>   這個流程有多重要呢?攸關著整個修行的成敗!整個修行的成敗,意味著我們這一生能不能成功。所以師父用了這麼多重點的話來敲醒我們,我們是否能夠聽到師父提醒我們的話?聽是有聽了,有聽到嗎?有聽到內心深處嗎?有生出決斷力,想要重視怎麼聽法嗎? [10′54″]</p>
<p>   希望這節課研討完了之後,停下來想一想。等到下一次再開始研討的時候,哪怕用幾分鐘的時間思惟一下聞法勝利,你再看一看整節課的聽聞會不會非常不一樣?因為佛法是最不怕實踐的,你越實踐越發現這裡邊講的都是真的;你不實踐的話,反而覺得怎麼會沒有離苦呢?怎麼會沒有效應呢?所以,非常期待大家能夠把今天師父講的這個提醒認認真真、清清楚楚地聽到耳朵裡,要走心!要去實踐它! [11′39″]
<p>   第三個,有這樣好的老師,講這樣圓滿的法,但是我們條件如果不夠,那沒有用。那麼就說明,所以第三個「如何講、聞」——講的人要什麼條件,聽的人要什麼條件,我們夠了應該如何、不夠應該怎麼學。如果經過了這樣,然後我們就可以得到究竟圓滿的法。有了這個條件,最後才正規地把那正分究竟圓滿的法來告訴我們。 [00′40″]</p>
<p>   那麼當我們對這個了解了以後,向後在我們學習過程當中,我們可以常常拿這個標準。淺、這個粗淺,雖然學得粗淺,可是我們能夠用那個粗淺的法,在平常我們去衡準。一方面思惟觀察對我們有幫助,一方面對法我們有步步的實踐當中,能夠提升我們自己。這個不要剛開始的就把它當做文字看,如果我們剛開始不在實際上面努力,漸漸地深入,對我們將來就很難學得好了。正因為我們現在條件差,所以我們淺的地方,跟我們能做到的地方做,當我們漸漸深入的時候,我們就會很有次第地一步一步地跟得上去。 [01′38″]</p>
<p>   師父在新版的《廣論》手抄有這樣一段話,說:「<p> 有這樣好的老師講這樣圓滿的法,但是我們條件如果不夠,那沒有用。那麼就說明,所以第三個『如何講、聞』——講的人要什麼條件,聽的人要什麼條件,我們夠了應該如何、不夠應該怎麼學。如果經過了這樣,然後我們就可以得到究竟圓滿的法。有了這個條件,他最後才正規地把那正分究竟圓滿的法來告訴我們。<p> 」這一段還是在「如何講、聞」加大這個力度。 [02′27″]</p>
<p>   接下來師父又說:那麼當我們對這個了解了以後,向後在我們學習的過程中,我們可以常常拿這個標準。雖然學得粗淺,可是我們能夠用那個粗淺的在平常去衡量。一方面思惟觀察對我們是有幫助的,一方面對法我們也有步步的實踐當中,能夠提升我們自己。接著師父又講一句:「<p> 這個不要剛開始的時候就把它當做文字看,如果我們剛開始不在實際上面努力,漸漸地深入,對我們將來就很難學得好了。正因我們現在條件差,所以我們淺的地方跟我們能做到的地方做,當我們漸漸深入的時候,我們就會很有次第地一步一步地跟得上去。<p> 」 [03′36″]</p>
<p>   很多人可能會覺得:「怎麼聽法這件事,在佛法裡有那麼重要嗎?它應該是比較淺的法吧!而且好像一聽就懂,沒什麼難度啊!」可是就這樣一聽就懂,沒什麼難度,如果缺乏實踐的推動力,那我們是聽懂了嗎?因為佛法最重要的還是聞思,聞推動我們思,思推動我們去修,它是一向連貫的過程。如果我們聽了這個道理一聽就懂了之後,覺得它好像不能做,甚至不用做,那我們真的懂了其中的要竅嗎? [04′20″]</p>
<p>   最重要的是:你覺得淺,但是有實踐力嗎?能把這個好像淺的法實踐在生命中嗎?聽起來容易,做起來是不是也容易呢?如果做起來容易,我們為什麼沒有去做呢?所以師父說:如果剛開始不在實際上面努力、漸漸深入,那對我們將來就很難學得好了。所以「<p> 初一若錯乃至十五<p> 」就是這個問題,一上手就把它當文字看,沒有去實踐,那麼結果肯定不是我們預先想的那樣。但是我們到底輸在哪裡了呢?我們就是輸在起跑線上,最初那兩分鐘、最初那一分鐘!我們就輸在了那裡,就是怎麼聽法! [05′05″]</p>
<p>   所以這個點,師父再再地說:正因為我們條件差,所以我們在我們能夠做到的地方做。這一步做到了就是在實踐佛法,那麼步步都做到了那就成了!所以一定要在沒做到的這個地方把它做到,不要覺得這好像是很淺的法,自己好像不屑修似的。這樣會不會我們內心中也有一種——是慢心嗎?還是師父說的那個——忽略? [05′37″]</p>
<p>   好!希望講這一段,我們大家還是要拿它好好地觀察自己的心續,把它變成是一種行動力。 [05′49″]
<p>   我們今天繼續聽師父的帶子,該到了「今初:總此教授,即是至尊慈氏所造」這一段了。 [00′11″]</p>
<p>   最後呢,有了前面這個樣樣準備好了,那個時候就開始了,說正以引導,這個是為什麼要分這四個。現在這個裡邊呢繼續下去,我們看看這個文:<p> 今初<p>   第一個就是造者殊勝,看文:<p> 總此教授,即是至尊慈氏所造,《現觀莊嚴》所有教授。別則此之教典,即是《菩提道炬》。<p>   整個地來說,現在本論所講的重要的內涵是什麼呢?就是《現觀莊嚴論》。《現觀莊嚴論》是至尊慈氏,就是彌勒菩薩。要曉得佛涅槃以後,佛把整個的責任就交給我們的彌勒菩薩,所以現在來引導我們的最圓滿正確的引導者就是他,就是他。那麼他當然這個本身是圓滿的,那麼內容呢是講的這部書。那《現觀莊嚴論》是什麼呀?我簡單地介紹一下,裡邊一共說八樣東西,叫作:第一個「三智」,什麼三智啊?一切智、道種智、一切智智;第二個叫「四加行」;後面呢「一果」——佛果。 [01′38″]</p>
<p>   換句話說前面那個境,就是說我們應該了解我們所對的境,我們凡夫所對的境,依我們的無明妄識所對,造種種業。現在呢,我們了解為什麼會有這個染汙生死的痛苦,就是所對的境是不認識,那麼不是外面的境有錯誤,而是我們能認識這個境的這個識本身有問題,所以這個實際上還是就我們應該了解的,所以應該把這個東西認識。所以說的「智」——一切智,一切智是了解一切法總相的,一切法總相——空;然後呢,道種智是指一切法的差別相的;然後呢一切種智,就是把所有的這個通達總別一切的這個智。這個三樣圓滿就是佛。那麼要想得到這個東西,那麼內涵等等,修行呢就是四個次第,所謂四個加行;經過的這樣以後,最後圓成一個佛果。 [02′56″]</p>
<p>   好!聽完了這一段,問大家一個問題:現在本論所講的重要的內涵是什麼呢?你們可以一起回答。對!《現觀莊嚴論》。《現觀莊嚴論》的造者是誰呢?至尊慈氏。那麼這整部論——《現觀莊嚴論》,到底在講什麼呢?師父說幾樣東西呀?八樣。哪八樣呢?「三智」、「四加行」,還有「一個果」。師父說的「八樣東西」就是八事,是《現觀莊嚴論》裡最主要的所詮。《現觀莊嚴論》最主要的所詮,也是本論所講的重要內涵。 [03′42″]</p>
<p>   這個八事剛才講了一下。那三智都什麼智啊?一切相智、道智、基智。一切相智是什麼呢?一剎那間現證一切如所有性、盡所有性的究竟智;「道智」,就是現證三種道沒有諦實的智慧所攝持的大乘聖者的現觀;「基智」,就是由「現證一切補特伽羅無我」的這一分安立的,安住於小乘證類的聖者心中的智慧。總之,這三個都是智慧。 [04′21″]</p>
<p>   這三種智慧後面還有四個加行,四個加行是:圓滿一切相加行、頂加行、漸次加行,還有剎那加行。「圓滿一切相加行」,就是修持三智行相的智慧所攝持的菩薩瑜伽;「頂加行」,這個是由「緣著空性的修所成慧所攝持」的這一分安立的,對於修持三智行相獲得自在的那個階段的菩薩瑜伽。這是修道階段性的名稱;接著是「漸次加行」,就是由「為了對三智行相獲得堅固而漸次修持」的這一分安立的菩薩瑜伽;最後一個加行是「剎那加行」:漸次修持三智行相所生的究竟菩薩瑜伽。所以都是說菩薩瑜伽的不同階段。 [05′16″]</p>
<p>   最後是「果位法身」,就是修持三智行相的力量所獲得的究竟果位的無漏功德。 [05′25″]</p>
<p>   《現觀莊嚴論》的主要所詮,也是本論的所詮。希望大家能夠生起廣大的希求心,將來我們一起學《現觀莊嚴論》。這樣的話,再學《廣論》,再詳細地學習怎樣從一個凡夫地到達究竟圓滿成佛的這個次第的圓滿的綱要。大家都知道本論就是從《般若經》中流出的,至尊慈氏完全了解了《般若經》的內涵,造了《現觀莊嚴論》。《現觀莊嚴論》的內涵,也就是《廣論》的內涵,所以我們現在可以學到這一脈相承的《般若經》、《現觀》,還有《廣論》的內涵,是非常非常地有福報、有資糧的一件事。大家可以在內心中真正地燦爛一下,或者說燦爛很久! [06′20″]
<p>   為何《現觀莊嚴論》會宣說這八事呢?宗大師所著的《金鬘論》中說:「<p> 為何確定為八事?一個補特伽羅成佛,數量確定為所應了知的境、修持的道、果三者。<p> 」這句話是什麼意思呢?是說一個補特伽羅從凡夫到成佛,他所應該了知的境、修持的道和果這三者,數量確定嗎?「<p> 其中第一者確定為三智,第二者確定為四加行,第三者確定為法身的緣故。<p> 」這為什麼是八個?一定是八個嗎?不能是其他的嗎?或者少一些嗎?確定這麼多!那你說是誰確定的?就是走過去的人確定的。 [00′50″]</p>
<p>   「<p> 那麼,為何所應了知定為三智?<p> 」就問了:所應了知的一定要是三智嗎?「<p> 譬如商人聽到經商的利潤,就會趣入經商的方法<p> 」,比如說:最近什麼、什麼東西可以賺錢了,然後他考慮考慮這麼大的利潤,想一想決定去做,然後去做了。所以「<p> 最初為了對果位生起歡喜,所以開示具足自他二利的一切相智。<p> 」聽了這個「一切相智」之後,會生起很大的歡喜心要得到它,就像做生意要開始準備了;然後就趣入其方便,所以就開示一切相智的方便「道智」;接著還要了知有沒有什麼岔路啊等等這些問題,了知道智的岔路就觀待於基智,所以在後面就開示「基智」。這個是三智。 [01′47″]</p>
<p>   那麼,後面為什麼修持要確定修四加行呢?僅僅抉擇三智不夠嗎?有三智就夠了,為什麼還要確定四加行呢?說:「<p> 僅僅抉擇三智是不夠的,必須修持三智。其中又分為道的證德在自己的相續中未生者令生,已生者令增長二者,所以確定為四種。<p> 」這個過程確定為四種。 [02′18″]</p>
<p>   「<p> 因為圓滿一切相加行是能獲得未獲得者<p> 」,就是這一段時間你要得到原來沒得到的那種功德,就像你賺錢,要開始賺錢了;然後「<p> 頂加行是獲得的階段<p> 」,是豐收的階段;「<p> 漸次加行是令已得者增長超勝<p> 」,就是利滾利、利滾利就更嚴重了;「<p> 剎那加行就是彼成就的階段<p> 」。 [02′44″]</p>
<p>   「<p> 那麼,一重因果就足夠了,為什麼還要兩重呢?如果沒有自在因果——圓滿一切相加行與頂加行——的話,便無法獲得無勞任運的法身;如果沒有堅固因果——漸次加行與剎那加行——的話,便無法獲得『一法現前時,一切法都現前的一切相智』,所以必須要兩重因果。這是先輩的智者所說的。<p> 」 [03′12″]</p>
<p>   也可以這樣解釋:如果相續中沒有生起證德的話,僅僅了知了能不能降伏煩惱呢?煩惱就是我們的所斷,僅僅了知了是不能降伏所斷的。就像我們知道了聽聞軌理之後,如果不去修行,我們平常那種麻木的、懈怠的、輕忽的心,沒有被降伏的話,還是沒辦法生起聽聞軌理的所證。所以「<p> 僅僅了知並無法降伏所斷,因此,生起證德的方便是圓滿一切相加行,相續中生起之後而自在,這是頂加行的緣故;相續中生起的,如果在心中沒有明現所緣行相的話,僅僅生起,並無法令道究竟。<p> 」還沒有辦法令這個道達到究竟;因此如果想要令這個道達到究竟的話,就必須要漸次加行與剎那加行兩者,因為它們是因果的緣故。因此就可以確定為四種。 [04′19″]</p>
<p>   所以,「<p> 如此聞思的抉擇,以加行修持的果就是一法身<p> 」,它一定會達到那個果,所以它的數量是確定的。 [04′32″]</p>
<p>   我們先了解一下這樣的大概,如果想要詳細地了解的話,大家要聽《現觀莊嚴論》還有《金鬘論》等等。這是現在我們的法師都在學習的,我也有幸在學習,所以大家要發願好好學習! [04′50″]</p>
<p>   在聽聞的過程中,我們追隨著先輩祖師、智者的抉擇,在內心中不停地確立、不停地瞄準那個方向——不停地確立我們要得到三智,我們要修習四加行。這樣的話,我們對佛果的那個期待,就不是一種好像夢幻般的期待,它是一個你第一步怎麼走、第二步怎麼走、第三步達到什麼,非常次第井然的一個生涯規劃。就是如果想要達到佛果的話,就要這樣修,先輩祖師們把路是探得非常明白的,而且也有成功的經驗。所以對我們這些後學者來說,只要把這個經典好好地學清楚,把路徑探清楚,接下來就是要實修。 [05′39″]</p>
<p>   那麼聞思的時候是不是也是修呢?這個在《廣論》後面要講的。也是的,因為它會修改我們的很多知見,很多自以為是的我的見解的部分要變成正知見。在這個部分就可以再再地確立:我們所聞思的佛法不是為了得到名聞利養,不是為了得到一個很會說法的名聲,或者別人覺得你很有智慧。最重要的,是我們能夠降伏自相續中的所斷——那些煩惱和痛苦的東西,達到我最初修學它的目的,就是果位法身。 [06′15″]</p>
<p>   所以如果能常常學習這樣的經論,並且以所學不停地校對內心,那麼每學習一次,我們就會對這條路更加地堅定。而那些現世的八風,就會變得有些飄渺和不切實際,正好就把我們原來的經驗顛倒過來了。所以我們的內心就越來越清晰、越來越堅穩地抉擇何者是解脫、何者是輪迴、何者是大乘的道。所以在每一次聽聞經論,每一次聽聞祖師、佛菩薩的教誡的時候,我們就會對這條路的感受力越來越沉穩,目光也很清澈,不再有那麼多猶疑不定的東西。當然你會不會有疑惑?會的!有了疑惑就去解決疑惑,不至於懷疑這整條路是不是真的,因為那上面所寫的所有都是祖師、智者們證悟過的經驗。 [07′24″]</p>
<p>   所以對我們來說,就是無比地幸運能學到這麼精彩的著述,然後沿著這樣的著述我們就可以了解《般若經》的內義,可以了解佛陀的密意。還有什麼事情比值遇這麼美的教法更值得我們歡喜呢? [07′43″]
<p>   師父在第二段說:「<p> 換句話說前面那個境,就是說我們應該了解我們所對的境,我們凡夫所對的境<p> 」,一直在說這個境。「<p> 我們凡夫所對的境,依我們的無明妄識所對,造種種業。<p> 」這句話是什麼意思呢?當我們開始學習佛法的時候,我們總會遇到心和境的問題。這裡又談到「無明妄識」,就是我們這顆心在沒有進行徹底地調伏之前,它是被無明所障蔽的,一旦是無明所覆蓋的這個妄識,它對境的時候就會造種種染汙生死的業。 [01′02″]</p>
<p>   然後師父說:「<p> 現在呢,我們了解為什麼會有這個染汙生死的痛苦<p> 」,為什麼會有染汙生死的痛苦呢?記得師父說什麼嗎?師父說:「<p> 就是所對的境是不認識,那麼不是外面的境有錯誤,而是我們能認識這個境的這個識本身有問題,所以這個實際上還是就我們應該了解的,所以應該把這個東西認識。<p> 」接著師父就講到了「智」,那些智是做什麼?就是把這個妄識全部翻過來變成智,那麼對境的了解就不是妄識所對了,因為他已經清澈地了解了境之後,染汙生死的痛苦就清除掉了。 [01′59″]</p>
<p>   這一小段話所蘊涵的道理是非常地深刻的,在那麼多年前,師父就講出了這麼精闢的一段話。這段話其實應該拿個本把它抄下來,把它在內心裡背到滾瓜爛熟,非常非常地熟悉。「<p> 不是外面的境有錯誤,而是我們能認識這個境的這個識本身有問題。<p> 」所有是是非非的爭論,如果我們都去討論外境的問題,而忽略了對內心的關注,實際上外境的問題也解釋不清楚,因為那個識有問題。 [02′44″]</p>
<p>   那麼這個識的問題到底是出在哪裡呢?就是看起來那個境上的問題跟我的心對它的安立是沒關係的,境本來就有那樣的問題,和我現在怎麼想是沒關係的。但是佛法恰恰把心和境——心正在對的那個境,它們倆聯繫得是非常緊密的,甚至快樂與痛苦最主要的原因絕對是歸咎於內心的。它不是一直在境上掙扎、境上計較,在境上你死我活、天翻地覆;而是內心的這種理性的觀察,還有是與非的這種搏鬥,就像兩個很強的人在搏鬥一般,它都是在內心的這個見解上自我拼搏的。 [03′40″]</p>
<p>   那麼這個問題之所以深的原因就是:當我們的心開始隨著境劇烈地波動,我們到底是平外境、還是平內心呢?在《入行論》裡說:「<p> 片革墊靴底,即同覆大地。<p> 」如果地上有荊棘的話,拿一個鏟子,我豈能鏟平大地上所有的荊棘呢?腳上穿個鞋不就可以了嗎?那麼是不是每時每刻我們都會想到應該穿個鞋呢?還是隨穿隨扔,就會忘記?因為就是習慣!但凡有什麼事發生,我們一定會去強烈地執著境上的問題,然後完全地忽略了我們這個識是有待於繼續觀察思考再裁決的。我們就直接定義境,比如你的錯,或者定義是非在上面。而大量的時間和精力都去討論境的話,這個心就好像變成了一個陌生者,和自己毫不相關的人,活了很久之後,其實最不熟悉的就是自己的思路。 [04′55″]</p>
<p>   比如說:我們對一個境通常都是怎樣反應的?不去長久地觀察,你是找不到規律的,也不知道一、二、三步驟是什麼,也不知道結尾是什麼。如果長久地對自己的某一個習氣觀察,你就知道:哦!開始是這樣的、中間是這樣的、結論是這樣的。那麼當它再度出現的時候,你就知道:啊,它又來了!但是如果在每每發生事情的時候,我們所有的注意力都撲在境上,境就會引生內心的這種波濤。在這種強烈的起伏狀態中,我們很難理性地去觀察事情,很難去找到這個事情的處理方案。解決方案找不到,大家在一起爭得心裡都不太舒服了,甚至都很痛苦了,都覺得自己說的是有道理。 [05′40″]</p>
<p>   所以我們這個妄識,當有什麼事情發生的時候,它就會對這個境有一個顛倒的認知。這個顛倒的認知看起來是那麼真實、那麼有道理、那麼地現前,但是它經不起正理的觀察。正理的觀察,觀察一會兒之後它就靠不住了,找不出一個真正的理由。就像那天我問大家一個問題,我說:「慈悲和瞋恨,哪個力量大?」當然我們學過教理的都說:「慈悲力量大!」請問依據是什麼?為什麼你說慈悲力量大?那時候法師們就給出了很多理由。你們也可以想一想,哪個力量大?你有什麼理由去說它是大的、它是小的? [06′32″]</p>
<p>   在心對境的這個問題上,師父會在整本《廣論》裡數數地提醒我們。如果大家能把這一段話放在心上常常去琢磨的話,我們觀察的那個力量就會轉向於內心。當我們轉向於內心的時候,可能開始會發現:什麼都看不到!但是當你看到一點點苗頭的時候,你就會覺得很有趣,我們這個內心比看一部電影、看一部神話精彩!因為絕對是你沒看過的東西,可能是無量劫來沒努力過的東西。 [07′08″]</p>
<p>   就像海底能深入到多遠?海底有多少生物、有多少植物,我們也沒法知道。如果潛入到很深的海底的話,把你帶的燈全關掉,你想:現在我享受黑暗時刻吧!可是你帶的燈全部關掉之後,會發現海底世界是有燈的,很多魚會發光!有的魚會發紅光、有的綠光、透明的光、各種顏色,簡直是像燈飾大街一樣,全部都是燈!然後你就說海底世界好美呀! [07′41″]</p>
<p>   但是我們的心裡那一個、一個思路它所帶來的力量,你去尋覓它的依據,它為什麼這麼想?然後你去找,一個思路連著一個思路,然後連著一個行為,這中間是為什麼?你一直去探尋、探尋、探尋,就好像我們在深入海底去找珊瑚礁一樣,美麗的珊瑚,還有各種難以想像的漂亮的魚,比那個實在是有趣太多了!因為心在某種程度上,它的能量好像沒有窮盡的樣子,你可以一直去尋找! [08′12″]</p>
<p>   一旦我們透過教理的薰習和善知識的引領,把百分之百撲在外境上的那個力量收回來看一看內心的話,我們自然會看到無限的風光。可以看到:哦!原來我巨大的潛能都潛藏在內心裡邊;原來我轉動我的思想、轉動我的觀察,將方向瞄準內心,我就可以發現我內在的潛力!那種潛力是你靜下來觀察自己,一定會找到原因,找對了原因,把那個原因去掉,就不用在境上跟人家爭得你死我活了。因為最終清涼的是這顆心、平靜的是這顆心、愉悅的是這顆心、滿足的也是這顆心,所以平定這顆心就可以了,這是一個多麼簡潔的方式!但是無量劫來,我們就是要這麼辛苦地上天入地地折騰,卻沒有在這個心上下功夫。 [09′10″]</p>
<p>   就這幾行字啊!就這幾行字,可能去求法花多少錢、走多少路,也未必能求到這幾行字、也未必能懂得這幾行字。所以,就算是跟師父聽法聽到這幾行字,如果能夠抱著這幾行字晝也思考、夜也思考,進入那種如癡如醉的探索狀態——我就在這個問題中、這個問題就在我中,進入那種合一的探索內心的續流,我們一定會對這一段文字產生非常非常不可思議的感受!那就不僅僅是佛法入門,一定是一個對內心的深入。然後我們就會發現修行是這麼有趣的事情,我自己是這麼有趣的事情,我就不用今天沒有看個東西就覺得無聊。你看自己呀!你看自己的心,然後再對照經論。所以,我們這樣努力地去觀察的時候,自然會發現修行的樂趣。一旦發現修行的樂趣,誰能讓我們停止呢?從樂趣勝樂的這條路,誰又能讓我們返回呢?所以我們一定要加油啊! [10′24″]
<p>   大家好!又到了我們研討《廣論》的時間了。前幾講討論「佛法要向恭敬中求」,恭敬心是要思惟和準備的,現在在研討之前大家準備好了嗎?恭敬心是佛法這個智慧之樹的土壤,如果我們想要那棵樹繁茂高大、生生不息地茁壯下去,恭敬心這個土壤的培育是非常非常重要的!所以請大家好好地觀察一下自己的心續。 [00′42″]</p>
<p>   再思考一下,為了什麼目的我們要來研討《廣論》?是為了令所有的有情都能夠出離生死的痛苦,達到究竟的快樂,我來學《廣論》,種下成就佛果的因。那成就佛果的因是什麼呢?大家可以想一想。「菩提心是佛子因」,那如何獲得菩提心呢?就是要沿著道次第、沿著正規的傳承去修法,我們才能夠生起真實無偽的菩提心。我們雖然現在是聽帶子、討論,思惟如何成佛、在教理上要怎樣地學習,但這是我們邁向成佛之路非常重要的一步,請大家好好地珍惜,不要忽略我們眼前的努力,或者認為學習教理浪費時間、價值不夠——這個今天我們就會學到。 [01′49″]</p>
<p>   好!我們現在就開始聽師父的帶子。<p>   所以雖然是說起來這麼簡單,實際上就是從凡夫地,達到究竟圓滿成佛的圓滿的綱要全在裡頭,可想而知本論是何等重要!是,我們目前可以不一定全部學,但是我們必定要全部認識,為什麼?因為我們究竟的目的就是這個。你有了這個究竟的目的,認識了這個綱要,然後下腳走的時候,的的確確走你該走的。該走的只是一步,但是你眼前跨出去的一步,一定要走對方向。在整個的道路當中,你走對,那麼每一步,然後把一步一步加到最後,圓滿。所以開始走這個一步的時候,你就應該把整個的路線認得清清楚楚,這樣走下去的這條路最圓滿直接,這很清楚明白。 [02′59″]</p>
<p>   這一小段師父說:「<p> 雖然是說起來這麼簡單,實際上就是從凡夫地,達到究竟圓滿成佛的圓滿的綱要全在裡頭<p> 」,請問這是在說什麼呢?你們有答案嗎?可想而知是說本論。是說本論嗎?這是全部的答案嗎?有沒有丟字?「<p> 可想而知本論是何等重要!<p> 」後面有個「何等重要」! [03′39″]</p>
<p>   那麼是要全部學嗎?師父說:「<p> 不一定全部學,但是我們必定要全部認識。<p> 」為什麼要全部都認識呢?剛才有聽到原因嗎?「<p> 因為我們究竟的目的就是這個。<p> 」我們會跟師父一樣,確定究竟的目的就是這個嗎?說要達到圓滿成佛的圓滿綱要全在這裡邊,從凡夫地到佛地,我們有沒有確定這個究竟的目的呢?如果沒有確定的話,我們要確定嗎?那沒有確定,因為什麼沒有確定呢?是有什麼目的比這個更完美嗎?還是目的雖好,我沒有能力達到呢?沒有能力達到,就去想達到的方法! [04′39″]</p>
<p>   所以師父說:「<p> 有了這個究竟的目的,認識了這個綱要<p> 」,會有什麼好處呢?注意!開始下腳走。「<p> 下腳走的時候,的的確確走你該走的<p> 」,這個該走的是自己確定的嗎?還是我們根據教理,認識了綱要之後確定的?所以這裡邊不全然是自己心續原來的那些東西。這裡邊有了什麼?有了知道綱要之後,內心的轉變所確定的東西,所以「<p> 的的確確走你該走的<p> 」。請問要走多少呢?「<p> 該走的只是一步。<p> 」請問大家:為什麼師父要在此處說該走的只是一步呢? [05′41″]</p>
<p>   你說:「如果走兩步,三、四、五、六、七、八步,可以嗎?」有沒有那個能力呢?「<p> 的的確確走你該走的,該走的只是一步。<p> 」沿著下腳處,一定是向前走一步吧!或大、或小你要走一步,因為你要在你立足的地方向前走一步。 [06′06″]</p>
<p>   如果我們向前走一步的話,最重要的問題是什麼呢?是不是朝哪裡走?是方向!所以師父說:「<p> 你眼前跨出去的一步,一定要走對方向。在整個的道路當中,你走對,那麼每一步,然後把一步一步加到最後,圓滿。<p> 」真的每次走一步,而且要把那一步走對,一步一步就能夠走到圓滿嗎?這一句話,我們會覺得事實是這樣否?一次走一步、一次走一步,然後我就能走到最後了嗎? [06′50″]</p>
<p>   這個問題在跟師父學習的時候,也是讓我感觸非常深的一點!因為發現師父在教我們這些弟子的時候,常常會特別清晰地告訴我們下腳處。師父非常重視這個下腳處,因為佛法一定是落到地面上,腳踏實地的一個功夫。如果很虛幻、很神秘的,找不到一個確定感,這樣的話,可能修來修去也不知道修到哪裡去了。所以師父在嚴密教理的指導下,一定會清晰地讓修行的弟子們知道當下的一步是什麼。 [07′35″]</p>
<p>   那麼當下那一步,恰恰是我們的能力能夠邁出去的,不是超越能力的一部分,不是現在你怎麼也達不到的。比如說你明天登初地好了,那達不到。但是你當下如果能對治一下自己的觀過心,對於上師、三寶生起念恩的心,這個對治和觀察應該還是可以做的。所以在我們找到當下的立足點,向前邁一步的時候,修行就看起來沒有那麼困難,而且是顯得那麼力所能及!稍稍用點力。不要老是追求舒適感,稍稍用點力,要向上跨一步! [08′19″]</p>
<p>   師父說:所以開始走這一步的時候,就應該把整個的路線認得清楚。為什麼呢?因為認不清楚的話,方向直接就錯了。第一步雖然只是一步,但是它向著那個方向卻是最後成就的方向。記得師父常常說:「可上可下的時候,要向上一步!」在發生一些事情、大家不知道如何取捨的時候,總會發現師父給我們一個取捨的點。那個取捨的點就是大家能沿著師父這樣的教誡,都向上增一分善行、斷一分過失,肯定會在心上向前邁進一步。哪怕我們事相上推進得非常非常不順利,但是心中不能失去向上跨一步善的這樣真實的腳步。看到這一段的時候,會想起師父很多很多教過我們的那些時光、那些事例,要講的話可能會講很久,以後慢慢有機會再跟大家分享。 [09′29″]</p>
<p>   請問我們大家學完了這一小段之後,要得到什麼呢?這一小段是在說什麼呢?意思清楚嗎?本論為什麼重要?揭示了目的,對不對?達到目的的綱要。如果有了方向、有了綱要,每次跨一步就好了!只要在乎那一步方向是對的,一步、一步、一步增廣,就到了最圓滿的。好像在介紹道次第喔!一定要知道方向和綱要,所以我們需要本論。 [10′08″]
<p>   請問:「我們有沒有確定我們究竟的目的就是這一個?」就是哪一個呢?要究竟圓滿成佛,沿著這樣的道次第。如果我們確定了這個目標之後,最重要的問題是什麼呢?就是該走的只是一步。那一步到底是什麼呢?是否是我現在要向上增進的一步呢?那一步可能是非常小的一個進步、非常小的一個進步。然後一個小的進步、一個小的進步累積起來,每天都在增廣、每天都在增廣。 [00′38″]</p>
<p>   這樣的一個連串,比如第一天在過去不會的一個地方我們增加了 0.01,第二天在這個 0.01 的基礎上,我們再去增加 0.01。這樣地假以時日,如果一年、兩年、三年、十年這樣努力下去,大家可以算算,跟我們原來的起步點已經差了多少?所以師父講的「每次只走一步」,好像很小的感覺,但是它累積起來,結果會是一個不可思議的數字! [01′16″]</p>
<p>   這句話其實也可以安慰我們,因為我們都會覺得調心是非常不容易的,想要跟自己拼搏,戰勝自己的那些弱點,是一個很辛苦的過程。我們常常會覺得怎麼努力也改不過來,那怎麼努力也改不過來,是針對什麼說的?是針對某一個習慣它徹底在相續裡邊不現行、消失了。但是那個結果就是沒出現,比如說瞋心,怎麼打它就是常常出現,沒有打到一種瞋心不出現的狀態,我們就會覺得是沒有勝利的。我們就盯著那個結論:我們是沒有勝利的!當我們沒有勝利的時候,就不會收穫愉悅感和輕鬆感。 [02′01″]</p>
<p>   但實際上師父說每走一步,在當下的時候完成每一天的目標了嗎?實際完成了!因為今天我就完成了這個目標。比如說我們要研討《全廣》,研討了嗎?研討了。那你完成了嗎?完成了每日堅持上課的這件事。那你說研討的質量怎麼樣呢?「有的時候可能不太行,有的時候覺得很受用。」只要是一直在堅持,就百分之百地勝過輟學。只要再堅持下去,一定會在其中有某種改變。所以每次可上可下的時候都走一步,每次都走一步。走一步的話會很困難嗎?比如把你心裡的想法向善的地方再跨一點、向積極的地方再跨一點,不要淹在原來煩惱的現行中,向上突破一點,就叫一步! [02′57″]</p>
<p>   這樣看起來修行很容易呀!每次就走一步。那你說:「每次走一步,得什麼時候才能到達目的地呀?」算一算,每天都走一步,每天進步百分之一的話,一年會是多少呢?有人算過,一年就是原有狀態下的 37 倍。所以這個一步不是簡單的一步,它實際上是完成一個非常偉大工程的巧妙計算,它是一個利滾利、非常輝煌的果實。 [03′31″]</p>
<p>   但是在每走一步的時候,我們常常好高騖遠,想要一下子達成那個煩惱習氣都不現行的狀態,卻不能忍受成績平平,或者修著修著怎麼看起來好像倒退了。境界一強,正念就打得非常辛苦,甚至有的時候崩潰了!師父常常說:「沒關係!跌倒了,再起來,再戰!」就這樣一直堅持下去,每次只有一步、每次只有一步!我們是力所能及的一步,雖然稍稍費力一點,但是仍然是自己可以完成的一步。 [04′10″]</p>
<p>   最重要的概念是:這一步,你自己欣賞自己嗎?你為此高興嗎?你會完全欣喜這個過程嗎?還是你根本看不起自己的努力?一小步、一小步的努力,就是到最終那個輝煌聖殿最重要的過程。如果我們忽略一小步、一小步的這個旅程,我們豈能到達終點呢?最後那一步最輝煌,因為它到頂級了,可是前邊的這些步子不值得讚美嗎?這一路都不值得讚美嗎? [04′44″]</p>
<p>   所以如果我們能夠真實地活在當下,能夠每一天計算一下自己今天的善行上哪怕長進了零點幾,只要有在微動,那明天再微動,我們就沒有停滯,我們就在向美好的方向前進,這樣就是一個進步的趨勢。 [05′07″]</p>
<p>   雖然進步並沒有像我們幻想出來那樣的形狀,但是可能進步本來就不是想像的那樣,它有它的一個真實的軌跡,不是從那個地平線起來,然後直著就升上了高空;它可能是斜線式的,一點一點地上去,上到某個點之後忽然騰躍!比如說初地菩薩跟二地菩薩,那功德不知道要差多少倍,在往上輾轉增上的時候,是一個不可思議的多少次方、多少次方功德的轉變! [05′41″]</p>
<p>   這一小段,每一步、每一步是師父真實實踐過來的經驗。師父常常說:「佛法美啊!僧團美啊!」常常看到師父像是自言自語一樣,在那兒笑著發出由衷的讚歎。這個僧團就是我們現在所屬的僧團。師父也說:「哇,這些廣論班的居士真有善根啊!」就是這樣讚歎的。但是輪到我們自己評價自己的時候就一塌糊塗,我們總是看不到師父看到的那個閃光點。那麼在思路上到底有什麼一些過失呢?會不會是我們太注重結果那一刻的燦爛,而忽略了每一天那個珍貴的、不可或缺的、是唯一的途徑的那一小步? [06′28″]  
<p>   好!我們接著聽下一段。<p>   我還是舉個例,譬如說我們剛才說到台南去。到台南去。可能剛才說走路、腳踏車、汽車,那用的工具沒關係,然後呢,走的路線也有幾條,但是你一開頭的時候絕對不會說:「反正不管了,我出了門再說。」是,這個不對的,你一定要曉得,從我這裡到台南去你走哪一條路線,那個才行。你要出了門再去的話,那我們出去從那門跑出去,然後呢馬路四通八達,你到底怎麼走呀?哪有這樣的事情啊! [00′35″]</p>
<p>   現在我們太多人都是犯了這個毛病,「噢,好了!我不管了,反正念佛、反正參禪!」就是這樣。實際上這個裡邊大有問題啊,這個大有問題!因為你的目的,假定說你的目的,你的目的幹什麼?我的目的就是它念四個字。那沒關係,你只要「阿彌陀佛」就算了,能不能往生不去管它。現在假定你要往生的話,對不起啊!你要看看囉!四個字好,六個字好?還要其他的助行、正行哦!可是我們實際上的目的不在往生,要成佛!為了要成佛。所以眼前最好的方法要往生,要想往生所以要念佛。所以必定是,你整個地要到台南去,為了達到,就我眼前這個目的當中,然後走這條路,這不是很清楚、很明白嗎?對吧! [01′23″]</p>
<p>   而且這個情況之下我還舉個比喻,當然現在我們說到台南哪,這個方便,成佛沒那麼簡單的啦!我們不妨這麼說了,到美國去,譬如這麼說。那麼有人說到美國,美國在哪裡啊?一想:喔,美國在我們東方。夠不夠?對不起,這個萬萬不夠的哦!假定說美國在東方,那麼我出門向東走,你走得到嗎?我保證你走不到!然後你出門,我們這個門口向西的,你說向東你怎麼,向西走你不是走錯了嗎?你向東走碰壁,到後面你怎麼走啊?不行的。所以到哪裡去一定有它的一個完整的方便善巧,轉彎抹角怎麼怎麼走,就算你出了門對了,你向東走跑到花蓮,向前跨一步,對不起,太平洋,下面就死路一條,這很明白! [02′16″]</p>
<p>   所以任何一個地方,你真正要走之前,必須要先把你的目的認清楚,然後達到這個目的,該走你什麼走的路,然後這個路當中眼前你下腳的哪一步。所以不管是念佛、參禪哪一個,那是我們眼前下腳第一步,一定要走的,的確,走你相應的,絕對沒有錯!但是千萬不要說:「我走這個,其他的不管了!」那剛才這個比喻在這個地方。所以我們不要說:「哎呀,這個我們學這個幹什麼啊?」這個是一個很大的障礙。所以他前面也告訴我們了,「偏執暗未覆」——那種具善根的人喏!同樣的道理,為什麼有的人是一生取辦,有的人要轉三大阿僧祇劫,證羅漢果尚且如此;同樣的,有的人往生去上品,有的人往生去下品,有的人去了是邊地,有的人念了半天是念不去,毛病在哪裡呢?就在這裡。這是我們一開頭應該有的認識,應該有的認識。 [03′25″]</p>
<p>   好!我們聽了幾段。大家預習了沒有?事先預習是比較好的。像以前在研討的時候,常常分幾個研討小組,把下一次要研討的事先研討一下,就可以在對照的時候看一看:欸,有一些什麼沒有發現的點?那個時候還是滿令人驚喜的! [03′51″]</p>
<p>   我問大家一個問題:師父在這幾段裡到底要說明一件什麼樣的事情呢?為了說明這個事情,舉了幾個例子呢?第三個,這幾個例子的差別點是什麼?你們可以思考一下。 [04′15″]</p>
<p>   在最後一段還是扣到:從凡夫地達到究竟圓滿成佛,我們目的就是這個。有了這樣究竟的目的,認識了綱要,然後下腳走的時候,的的確確能夠走上我們該走的。所以師父說:「<p> 任何一個地方,你真正要走之前,必須要先把你的目的認清楚,然後達到這個目的,該走你什麼走的路,然後這個路當中眼前你下腳的哪一步。<p> 」這是師父的立宗,對吧? [04′53″]</p>
<p>   那麼有人說了:「<p> 反正不管了,我出了門再說!<p> 」一開頭就是這種。一開始的例子是去台南,對吧?如果讓我去台南的話,反正不管了,我出門就走,我不知道我會走到哪裡去?到時候你們可能要去尋人啟事了。 [05′13″]</p>
<p>   所以我是在想:這個人他一定會走到台南嗎?是他很有把握的意思嗎?他沒確定路線。你說:「啊!那我小的時候,從家到學校這條路我也都是走熟的,已經確定路線了,所以他一定是一個不知道怎麼走的人。」不知道怎麼走的人,為什麼說:「反正不管了,我出了門再說」?這是急躁吧!是不是急躁?是急躁的心嗎?不能忍受在出門之前看地圖、好好學,因為這個沒有用,一邊走一邊問就可以了。會不會?有些人就是這樣安排的。 [05′50″]</p>
<p>   但是師父說:從那個門出去之後,馬路四通八達,你到底怎麼走呀?師父接著有一句話說:「<p> 哪有這樣的事情啊!<p> 」但是我們這樣的事情比比皆是!「哪有這樣的事情啊!」是什麼意思?怎麼會有人這樣子啊?哪有這樣走修行的路,說:不用看方向、不用看次第,直接上去修就對了?所以這是一個像《攝類學》裡的喀計(他宗)——有的人說。 [06′23″]</p>
<p>   師父接著說:「<p> 現在我們太多的人都是犯了這個毛病。<p> 」什麼毛病啊?又一句:「<p> 好了!我不管了,反正念佛、反正參禪!<p> 」師父說:實際上這裡邊有大問題啊!這裡邊的問題,注意!師父說:你是只要念佛就好呢?還是只要往生呢?還是要成佛?注意!它有一個目的性的伸延。如果是為了要成佛,眼前最好的方法是要往生,要往生所以要念佛,他把最究竟的目的看完了之後,腳下的一步選擇是念佛。不是說:「好了、好了,不管了!我開始念。」什麼都不知道。這兩者差別是很大的! [07′13″]</p>
<p>   下面舉那個去美國的就更誇張了!他的門在那邊,他朝那邊走是走不到的,如果他向東走就會走到太平洋,死路一條。像我們去念《心經》的話,說「<p> 無眼耳鼻舌身意<p> 」,那個「<p> 無<p> 」到底是什麼?像一個小孩子也都會問:「我有眼耳鼻舌身意,為什麼釋迦佛那麼有智慧的人說無眼耳鼻舌身意?」有的人就會認為一切空,一切作用都空了。萬一他的承許破壞了業果見,那麼就會有墮落的危險。為什麼他的承許超越了真正的量的邊際呢?就是他應該不了解那個空性的量是什麼、善知識怎麼教的,反正就那樣下去了。 [08′00″]</p>
<p>   師父舉的這些例子,雖然聽起來在現實層面是滿誇張的例子,但是修行人犯這個毛病,師父說比比皆是!那麼我們現在開始想:「啊!那個誰家、誰家的某一個居士是這樣的。啊!某某人是這樣的。」現在師父要我們做的是,看看自己是不是這樣。 [08′20″]
<p>   舉個最簡單的設問:學了這麼多年《廣論》,你會不會認為你的心一點都沒有改變,想到後世去哪裡心裡虛虛的?這是不是你一點兒都沒改變?或者你可以成立:「那學經典有什麼用?了解經典有什麼用?」這些是針對學了很多年的人。這兩個問題怎麼解決? [00′25″]</p>
<p>   說:學了這麼多經典沒有用,是根據什麼沒有用的?是根據我們對後世沒把握、心裡慌張,對吧?在想到念死和後世這個問題的時候,我們感到慌張或者感到恐懼,那接下來該做什麼呢?請問:由於念死無常而怖畏惡趣,接著應該什麼?現起三寶,應該真誠地皈依三寶。用那個所修的善所緣皈依三寶的心,來對治這個怖畏後世墮落,或者沒有安全感、極度地不安的這種心,而不應該停在這種恐怖中,反而說所學的沒用。是不是這樣的? [01′13″]</p>
<p>   因為皈依三寶有一個因就是要怖畏後世墮落,所以這種怖畏是合理的,如果不知道害怕倒是危險的。當我們生起了這種恐怖之後,沒有去緣念三寶,反而回頭否定自己,這樣不是很顛倒嗎?這樣不是險處嗎?努力了這麼多年,要去追悔嗎? [01′37″]</p>
<p>   所以要知道解決方案是什麼,你害怕就要皈依三寶。誰有能力幫我去除對生死的怖畏呢?是佛陀啊!那時候想到佛陀的功德我們去皈依的話,〈皈依三寶〉有寫到完全是可以去除怖畏。像觀世音菩薩就是聞聲救苦、施無畏,遊於這個娑婆世界度化我們。只要把我們那個怖畏的心,去緣念一個真正可以依靠的三寶境就可以了;不用停在那個怖畏的地方,反而否定自己這麼多年的所學。這稍稍連結上就可以了。所以這裡邊不論是念佛、不論是參禪,我們下腳的第一步一定是要走的。師父說:「<p> 千萬不要說:『我走這個,其他的不管了!』<p> 」「<p> 哎呀,這個我們學這個幹什麼啊?<p> 」這句話要向自己問哦!「<p> 這個是一個很大的障礙。<p> 」 [02′39″]</p>
<p>   像有的人雖然學習《廣論》了,但是會不會心情有不好的時候呢?最近如果障礙特別多、諸事不順,所以心情不太好,心情不太好就會想到:「我學佛怎麼學這麼苦呢?佛法對我有沒有作用呢?」 [02′55″]</p>
<p>   這個問題要怎麼解決?再往下一步,就到太平洋了!最近諸事不順,怎麼會導致佛法就沒有用了呢?諸事不順、心情不好之後,你用佛法調了嗎?用佛法調呀!如果諸事不順,這個壞心情、負面作意放在這兒存著、積累著,不去對治的話,那再美妙的法——醫生開的藥再好,你不吃的話怎麼治病啊?所以最重要的是我們能不能知道就是一種壞心情,它增益到自己對教法產生邪見了!這就是跳太平洋,這太嚴重了! [03′35″]</p>
<p>   所以怎麼樣把壞心情變好?考慮考慮怎麼樣提正念,降伏自己的非理作意,或者負面能量、負向的思考,不要讓負面思考淹沒自己,到最後眼裡看出去都是灰灰的、都是傷感。要知道這樣的心是無常的、是可以對治的,它剎那、剎那都在遷流,它不是永恆的,它是可以被對治的! [03′58″]</p>
<p>   一旦我們學教理之後,就會分析我現在的心,怎麼樣去緣念、去對治它,而不會淹沒在那個現行裡只是喊苦而已。我們因為生起了這種苦受,以這種苦受為依據、為因,反而去否定佛陀的教法!自己感到苦,佛法就不真實了嗎?釋迦牟尼佛離開王宮走進苦行林,夜睹明星,悟到緣起性空、悟到不可思議的解脫生死的那些法——因為我心情不好,那些法就沒有價值了嗎?就不是真的了嗎?因為我心情不好,所以一切都是不好的,就是「是顏色都是紅的」那個毛病就發作了! [04′42″]</p>
<p>   這個時候要怎麼辦呢?要現起對治。你想想:我們這些對治法都是哪兒聽來的?全部是教理上聽來的,如果不學教理的話,每走一步都不知道怎麼辦。所以學本論還有學這個綱要,是非常非常重要的!每一步都是實修手冊,都是指導我們怎麼樣從現在陷溺我們的這種負面作意,這種悲傷、無助、惶恐之中跳脫的一個力量,所以大家一定要知道去用它。 [05′12″]</p>
<p>   有的同學問:那我講的這個例子,和「不管了就出門」、「走走可能會走到太平洋」有什麼差別呢?就是這個人學著、學著,他走錯路了!什麼走錯路?就是思路走錯了。比如感覺到心情不好的時候,要趕快去提正念,提起正念來對治這個負面的作意、負能量。如果我們怖畏後世墮落,或者怖畏後世得不到人身、遇不到教法,那麼這種怖畏要去想:誰能救?那就是唯有佛陀能救,唯有三寶是皈依!這個時候應該馬上提起皈依的心,而不能用這樣的心,反而回頭說:「我學這一生有什麼用?」因為現在痛苦、因為害怕,他走了另一條路,可是《廣論》不是這樣說的,《廣論》說當我們生起怖畏後世會墮落的心,開始害怕的時候,要去尋找誰是皈依,這個時候正是要皈依的時候! [06′12″]</p>
<p>   所以你看,那路就反而走岔了。為什麼?就是《菩提道次第》他沒有學通呀!那條通路他通不上去,這個地方之後他突然向後拐了,他那地圖就沒有學清楚,地圖不是這樣走的!《廣論》上的都是我們的心路,你就知道到那個地方師父說該怎麼拐、怎麼拐、怎麼走,都是走向希望、走向正向的正能量。你們認為呢? [06′40″]
<p>   好!我們接著聽下一段。<p>   因為我曾經遇見過這麼很有趣的事情,有的人說:「法師啊,哎呀,現在這個時候念佛要緊,你講這個幹什麼,我趕快去修行啊,然後呢要打七剋期取證啊!」我聽了我非常讚歎,我說:「好啊,你剋期取證,我請問你,念了七天你取證了沒有?」他想了半天,沒有,對吧?然後呢你仔細一想啊,他說:「我不但念一個七天,念了好幾個七,到現在為止還毫無名堂。」現在太多這種人。然後呢自己念不對還勸人家:「哎,你不要去管啦!」然後呢一個七不對、十個七不對、一百個七不對。說實在話,我自己就這麼受了這樣的一個痛苦過來的。啊,大家拼命關在這個地方去念!以後我了解了一個事實:我們真正的目的是學佛,不幸的我們學錯了。學什麼?學我。我在這個地方得說一下,說一下。 [01′04″]</p>
<p>   這一小段字面的意思是非常清楚的,但是我們可以看到一件事情,修行人之間講話,是好朋友就可以直接說。他就直接說:「法師,你講《廣論》做什麼?還不趕快去修行!趕快去閉關剋期取證呀!」然後師父也是直接問過去:「你剋期取證了嗎?」那也沒有,說:「一個七不行,念了好幾個還沒有名堂。」師父說他自己也是受了這樣的一個痛苦過來的。大家都知道晝夜十萬佛號,師父說他輕鬆就可以完成的,師父是修過很多法、閉過很多關的人。師父說:「<p> 大家拼命關在這個地方去念!<p> 」注意!以後我了解了一個事實:我們真正的目的是學佛,不幸的是我們學錯了。學什麼?學我。 [02′07″]</p>
<p>   剛開始我們聽到這一段的時候,對師父一下子轉到這個地方會覺得非常地突然,為什麼一直這樣去念就是「學我」的一個現象呢?師父接下來就會解釋,所以請大家接著聽。 [02′26″]</p>
<p>   我先舉個比喻,當初我看那個倓虛大師的《影塵回憶錄》,他老人家提出一個三個字來,三句話——看破!放下!自在!啊,美啊!世間的所以很多纏的是什麼?說看不破,你看破了嘛就放下了,放下了嘛就自在了。啊,覺得好高興!的的確確這六個字,大部分人一看就懂,然後呢自己覺得對了。不幸,錯了!這話怎麼講呀?這話怎麼講我要解釋一下。現在我們了解的「看破」,這兩個字,你只要念過小學都懂,如果念過中學、大學,那懂得更多。那麼為什麼懂得更多?就是說當你程度越深,你對這兩個字的內涵了解得越深,對不對? [03′20″]</p>
<p>   到現在為止,我們了解這個內涵,說看得破的是什麼?看得破我們對世間,人世間這種是是非非;你在這方面看破了,你在人世間的是是非非可以減少一點。生死當中的是非你看破了沒有?你看破了沒有?這兩個字可沒有告訴你喔,世間用這兩個字沒告訴你喔!所以平常你一天到晚,哎呀,忙這個世間的東西,忙這個東西,哎呀,女兒要嫁、媳婦要娶、股票又要漲,然後這種事情,啊,忙得不得了!一聽見看破:欸,好,看破了。真正地看破呢,你還在世間的量則當中,對前面忙這件事情你是看破了,可是對佛法來說,你還不相應。你自己覺得居然懂了,然後你放下了,你放下的是股票,是稍微放掉一點,兒子女兒的事情,稍微減輕一點,但是心裡面還纏在這個地方。 [04′20″]</p>
<p>   相對地前面這個是稍微好一點,你要想拿這個跳出輪迴,跳得出嗎?我們平常說學,就是學這個。所以這個,仍舊在「我」這個圈子當中,結果你越學,你自己越覺得很得意咧。結果這個我是越學越大,弄了半天,請問你怎麼能跳出輪迴啊?太多人就犯了這個毛病,所以總是覺得:哎呀,這懂了,趕快去!明明萬修萬人去的法門,不幸為什麼現在這麼多人念了半天去不了的原因,都犯在這個毛病。還是說:「哎呀,我七天趕快行!」是!你七天去了,千真萬確的事實,見了佛,自然有最好的教授在。那個地方我們要自己仔細檢點一下呀! [05′09″]</p>
<p>   大家有沒有看過《影塵回憶錄》啊?那個非常著名的「看破!放下!自在!」師父說:「<p> 這六個字,大部分人一看就懂。......當你程度越深,對這個兩個字的內涵了解得越深。<p> 」是對的!可是「<p> 到現在為止,我們了解這個內涵,說看得破的是什麼?看得破我們對世間,人世間這種是是非非,你在這方面看破了<p> 」,看破了之後,人世間的是是非非可以減少一點。 [05′46″]</p>
<p>   接著,還記著師父一下子轉到哪裡了嗎?「<p> 生死當中的是非你看破了沒有?<p> 」然後又問一遍:「<p> 你看破了沒有?<p> 」「<p> 這兩個字可沒有告訴你喔!<p> 」哪兩個字?看破!所以平常一天到晚說什麼女兒要嫁、媳婦要娶、股票要漲,然後忙、忙——看破了!對前面忙的事情看破了,可是對佛法來說,你還不相應。最重要的後面——「<p> 你自己覺得居然懂了,然後你放下了。<p> 」放下的什麼?是股票放下一點、兒女放下一點,但是心還纏在這個地方。 [06′33″]</p>
<p>   所以到現在為止,大家想一想:天天拼命用功為什麼是學我呢?到這兒看破也不對,看破的那些,它是世間的一個量則,還沒有到看破生死。看到這裡我們就想:哦!原來師父是站在生死這樣的角度上,要我們來談學佛這件事。不是把世間的一點事情看輕了、看淡了就解決了,而是要往上攀登啊!要往上飛躍。我們要跨越的是生死這個深淵,不是僅僅爬上一座小坡就可以了。 [07′16″]</p>
<p>   所以師父接著說:「<p> 相對地前面這個是稍微好一點<p> 」,就是沒看破那些世間的是是非非,我們會比沒看破的那些人好一點。但是要想拿對世間的是是非非看破的這個力量跳出輪迴,跳得出嗎?「<p> 我們平常說學,就是學這個。所以這個,仍舊在『我』這個圈子當中。<p> 」結果越學越覺得意,這時候其實沒有看破生死輪迴,沒有基於生死輪迴的觀點在學習,可是卻自己得意囉!注意!結果這個我越學越大,弄了半天,說是能跳出輪迴嗎?怎麼能跳出輪迴!大多數人就犯了這個毛病。注意哦!這到底是個什麼毛病呢?師父接著說:「<p> 所以總是覺得:哎呀,這懂了,趕快去!<p> 」去做什麼呢?趕快去修。「<p> 明明萬修萬人去的法門,不幸為什麼現在這麼多人念了半天去不了的原因<p> 」,就是犯這個毛病! [08′35″]</p>
<p>   所以師父希望我們好好地自己檢查一下。從一開始跟道友討論要學《廣論》、還是修行啊、還是閉關啊,到看破、自在,然後到看破世間的是是非非,還是把生死中間的這個死結能夠看破。大家都知道生死的關要用什麼去破?要用空性去破。所以空性這件事如果不學的話,我們怎麼樣能夠在無明那個顛倒識對境的時候去取證無自性?是不可能的!我們無始劫來纏在輪迴裡的那顆心,會自己緣念到空性嗎?那得宿世有多大善根! [09′23″]</p>
<p>   所以一旦不學教理,就會沒法生起對空性的正確的希求;希求心都可能生不起來,何況去聽聞、去了解,還有實修!所以想要跳脫生死這個願望,在沒有系統地學習佛陀宣說如何才是跳脫生死的法之前,就以為自己懂了,就以為自己看破的是生死關,實際上是世間的是是非非罷了!這是當頭棒喝啊! [09′56″]</p>
<p>   如果我們真是修行的人,看到了這樣一個醒世——醒我們內心中的見解——的善知識語言,哎呀!那不是醍醐灌頂,也差不多吧!然後我們的心會有一種猛醒的感覺:對啊!我要去尋覓了脫生死之道,這些人世間的是是非非看破了,如何是生死的結使我還不知道呢!這件事唯有誰知道?佛陀知道,唯有佛在教典裡寫得清楚明白,所以一定要去學的! [10′27″]
<p>   好!我們來聽下一段。<p>   如果說我們另外一條路,有了圓滿的認識,然後你下腳一步,那一步都走對的,你跑一步、就對一步,跑一步、就對一步。所以祖師都告訴我們,譬如念佛法門,憨山大師說得很清楚,不但是憨山大師,其他的很多祖師。現在的念佛的人哪,到臨終的時候手忙腳亂,其實他眼前他根本不曉得這個念佛的意思是什麼,嘴巴裡面啊佛一直在念,生死的根支一直在長。念到臨終的時候,只是生死的業力在這個地方,一點消息都沒有!真正念佛的,當下都在生死的根支上面斬斷,是刀刀見血,用不到到臨終,當時念的時候你已經很清楚,這句佛號是派上用場的,積得淨業,當然你只要積夠了,到那時候臨終的時候自然去嘛! [00′54″]</p>
<p>   那你怎麼樣才能夠認識這呢?喏,就是這個圓滿教法,非常簡單!你們只要認真地從本論學下去,要不了多少,他就告訴我們:喔,怎麼樣念是念得去的,怎麼樣念是念錯了。你了解了,然後去念,那的的確確是千穩百當,是萬修萬去啊!如果你條件夠一點,你要更升,說:喔唷,我不但是要邊地,不但要下品下生,然後上品上生,也在這個上面;不但是凡聖同居土是上品,乃至於我要進到實報莊嚴土的都有份,還是在這個裡頭啊!所以我說到這裡順便一提。 [01′40″]</p>
<p>   這一段大家有沒有注意到師父的第一句話說:「<p> 如果說我們另外一條路<p> 」,是和什麼比的另外一條路呢?就是前面舉的例子:「不管了!反正趕快用功」,還有就是「上來就開始修」,跟那個不一樣的路就是另外一條路。那麼另外一條路到底是什麼呢?「<p> 有了圓滿的認識<p> 」。請問大家:對什麼有圓滿的認識?如果說想要往生極樂世界的話,應該對於阿彌陀佛的功德,怎麼樣去念,要有什麼加行、助行,還有要怎麼持戒這一系列的,乃至要生幾品、幾品,用什麼樣的發心,都有一個詳盡的教理上的了解。那麼往生極樂世界到底是為什麼?是像阿彌陀佛那樣有悲心和智慧,在因地的時候花七個大劫,用他的修行造出了這樣的極樂世界,功德圓滿了。所以我們要有圓滿的認識,「<p> 然後你下腳一步,那一步都走對的<p> 」。 [02′57″]</p>
<p>   師父說另外一條路,還有另外一點,就是我們到底是為什麼修行的?為了脫生死,還是為了令自他都了脫生死的這個目標,我要去成佛?注意哦!這另外的路,他是從發心開始就不一樣了——不僅僅是為了了脫個人的生死。就像迦陵頻伽鳥的雛鳥還沒有出蛋殼,在蛋殼裡的叫聲就跟其他的鳥是不一樣的。所以在發心的時候就不一樣。 [03′30″]</p>
<p>   如果我們對這條路、對這個成佛之路有了一個圓滿的認識——那我再問大家:對成佛之路有圓滿的認識,怎麼認識?我們聽到師父說到這裡,一定會現起這樣的疑問。但是你接著聽,內心中的疑問慢慢就會有回答。 [03′49″]</p>
<p>   接著師父說:「<p> 下腳一步,那一步都走對的,你跑一步、就對一步,跑一步、就對一步。<p> 」看起來是非常地紮實!「<p> 所以祖師都告訴我們<p> 」,接著師父舉到了念佛法門,說憨山大師說得清楚,而且不但是憨山大師,很多祖師都是這樣講的。  [04′13″]</p>
<p>   為了研究憨山大師到底說了什麼,我這裡給大家念一下《憨山老人夢遊集.卷第七》中這一段。師父對這些論都是讀過、都是研究過的。 [04′28″]</p>
<p>   《憨山老人夢遊集.卷第七》,說:「<p> 念佛求生淨土一門,元是要了生死大事,故云:念佛了生死。今人發心,因要了生死,方纔肯念佛。只說佛可以了生死,若不知生死根株,畢竟向何處念?若念佛的心,斷不得生死根株,如何了得生死?<p>  [05′05″]</p>
<p>   如何是生死根株?古人云:『業不重不生娑婆,愛不斷不生淨土。』是知愛根乃生死之根株,以一切眾生受生死之苦,皆愛欲之過也。推此愛根,不是今生有的,也不是一二三四生有的,乃自從無始最初有生死以來,生生世世,捨身、受身,皆是愛欲流轉,直至今日。翻思從前,何曾有一念暫離此愛根耶!如此愛根種子,積劫深厚,故生死無窮。<p>  [05′54″]</p>
<p>   今日方纔發心念佛,只望空求生西方,連愛是生死之根的名字也不知,何曾有一念斷著?既不知生死之根,則念佛一邊念,生死根只聽長,如此念佛,與生死兩不相關。這等任你如何念,念到臨命終時,只見生死愛根現前,那時方知佛全不得力,卻怨念佛無靈驗,悔之遲矣!<p>  [06′32″]</p>
<p>   <p> 故勸今念佛的人,先要知愛是生死根本,而今念佛,念念要斷這愛根,即日用現前。在家念佛,眼中見得兒女子孫、家緣財產,無一件不是愛的,則無一事、無一念不是生死活計,如全身在火坑中一般。不知正念佛時,心中愛根未曾一念放得下,直如正念佛時,只說念不切,不知愛是主宰,念佛是皮面,如此佛只聽念、愛只聽長。且如兒女之情現前時,回頭看看,這一聲佛果能敵得這愛麼?果然斷得這愛麼?若斷不得這愛,畢竟如何了得生死?以愛緣多生習熟,念佛纔發心甚生疎,又不切實,因此不得力。若目前愛境主張不得,則臨命終時,畢竟主張不得。<p>  [07′49″]</p>
<p>   故勸念佛人,第一要知為生死心切、要斷生死心切!要在生死根株上念念斬斷,則念念是了生死之時也,何必待到臘月三十日,方纔了得,晚之晚矣!所謂目前都是生死事,目前了得生死空,如此念念真切、刀刀見血,這般用心,若不出生死,則諸佛墮妄語矣!故在家、出家,但知生死心,便是出生死的時節也,豈更有別妙法哉!」<p>  [08′31″]</p>
<p>   這一段祖師的語錄是比較白話的,大家可以好好想一想。只不過這裡邊的愛,我們可以從十二因緣的流轉了解一下,它始於根本無明,如果不學習空性的話,也很難斬斷這個根本。所以師父這裡邊說:「<p> 佛一直在念,生死的根支一直在長......,一點消息都沒有!<p> 」真正念佛的,當下你就會知道你造的是個淨業。其實關於這一點,我也問過師父。師父說:「你功夫做得得力的時候,這一聲佛號到底心裡邊有沒有底氣,你自己是非常清楚的。有一些人用功,外面騙騙別人是可以的,但是終究是騙不了自己的,所以這個功夫要紥實地用啊!」 [09′24″]</p>
<p>   這一小段,看一看和《憨山大師文集》裡這一段幾乎是一模一樣的。而且在師父的日記裡談到生死,大概也都是這樣的一個痛切之心。憨山大師是這樣講的,很多祖師也是這樣講的,師父也是這樣講,他也是這樣做的。所以對我們學習的人來說,確實應該先有圓滿的認識——比如說什麼叫生死?怎麼叫了生死?什麼叫能夠淨化這個生死的根本?憨山大師整篇都在講這個,說我們弄不好就全身像在火坑中一般,三界輪迴就是這樣的。所以如果我們不去學整本的道次第,不去了解什麼是生死、生死的過患是什麼,如何脫離生死?如何尋覓空性?如何發大乘心?不學這些教理,我們也還是不清楚。所以師父才勸我們說有另外一條路——有圓滿的認識,然後下腳一步就對一步、跑一步就對一步。這真是對我們的一番痛切之心啊! [10′38″]</p>
<p>   如果大家想要真的好好修行,就不能把師父的話當作耳邊風,還是自己做自己的,認為自己那個比較有道理。聽一聽善知識們怎麼說,再聽一聽祖師、菩薩都怎麼說。我們是要學佛的,那麼學佛和學我的差別到底是什麼?到底我們有沒有懂佛陀是怎麼講生死這回事的?怎麼去了生死的?所以一定要學教理呀!教理就是佛陀講的,佛正法有二——教正法和證正法,要對教正法進行精進地聞思,然後才能夠進入證正法的修證。 [11′20″]
<p>   師父在上一段說,有了圓滿的認識,下腳的每一步都能夠對,然後自己在用功的時候,比較知道——比如念佛,這個佛號是派得上用場的。我們積了一個淨業,積夠了就可以不用手忙腳亂。「<p> 那麼到底怎樣才能夠認識呢?<p> 」師父說:「<p> 喏,就是這個圓滿教法<p> 」。接著四個字——「<p> 非常簡單!<p> 」他說:「<p> 你們只要認真地從本論學下去<p> 」,我們只要學《廣論》,就會認識到圓滿的教法,有沒有發現?那麼不學的話,就不了解佛陀是在講什麼。當然學了之後,你可能沒有聽懂宗大師在講什麼,到最後可能還是在學「我」。關鍵這裡是說「有了圓滿的認識」,我們的認識要清淨圓滿、沿著這個傳承的教法學下來的,不是弄自己那一套。就是要改換頻道! [01′28″]</p>
<p>   然後師父又回到了念佛,說:「<p> 怎麼樣念是念得去的,怎麼樣念是念錯了<p> 」,我們要了解了再去念。接著說:「<p> 那的的確確是千穩百當,是萬修萬去啊!<p> 」說如果條件再夠一點的話,不但是要到極樂世界邊地了,下品下生、下品上生、中品、凡聖同居土,最後就到了什麼呀?到了實報莊嚴土,到了這麼高的境界呀!所以我們都有可能去那裡,因為我們得到了這個暇滿的所依,能夠對佛教生起信心,能夠堅持學下去!所以得一次人身要好好地利用它。每一分、每一秒的時光對我們來說都非常地珍貴,一定要用它來造集非常殊勝的淨業。 [02′32″]</p>
<p>   所以今天學的這些,如果大家能夠再再地想一下,不管我們是剛學《廣論》,還是學了很多很多年了,要隨喜自己能夠遇到這麼圓滿的教法。我們可以完整地、清淨地遵循佛陀的教誨,聽一聽佛是怎麼講的,真正地像師父希望我們那樣去學佛,而不是拼命用功、拼命用功,結果不知道佛法在講什麼,終究是在轉自己的那一個區域的事情。我們的區域的事情就是生死輪迴啊!可是只有佛陀有講了了脫生死的法,不學佛陀的教法,怎麼樣了脫生死呢? [03′25″]</p>
<p>   然後,師父在第二段說:認識圓滿的教法,非常簡單!就是要從這個本論學下去,要不了多久就會學會了。那麼為什麼學習本論就會了解圓滿的教法呢?還記得師父說:「<p> 實際上就是從凡夫地,達到究竟圓滿成佛的圓滿的綱要,全在裡頭<p> 」,對吧?全在本論這裡邊,要學習!那麼看看其他祖師的看法是什麼呢?像《現觀莊嚴論》中有說:「<p> 緣佛等淨信,精進行施等,意樂圓滿念,無分別等持。<p> 」《顯明義釋》對《現觀莊嚴論》的這個偈子有詳細的解釋。貢唐大師的《顯明義釋筆記》提到:「<p> 這個偈子開示了信、進、念、定、慧,就是一位補特伽羅成佛的一切道,都攝為三士道次第,而信、進、念、定、慧含攝了道次第的圓滿道體。以皈依為主,其他下、中士道都是皈依的支分,因此下、中士道攝為信根;上士道就攝入了進、念、定、慧四根當中。『緣佛等淨信』開示了趣入總體聖教之門是皈依;『意樂圓滿念』開示了趣入大乘之門是發心;『精進行施等』開示了進入大乘之後,總學六度的道理;而『無分別等持』等開示了別學後二度的道理。<p> 」 [05′30″]</p>
<p>   另外阿克慧海大師在他的《廣論講解誦授的筆記》中也有提到:「<p> 貢唐文殊說:《現觀莊嚴論》提到『緣佛等淨信』等文,是大乘道次第的總綱。這之中最初需要對善知識的信心、緣著佛陀等的信心、相信業果的信心、相信四諦的信心、對於三學道的信心,以及對於無上菩提的信心之門而發心等。這以上都是信心的法類。<p>  [06′07″]</p>
<p>   <p> 《現觀莊嚴論》一開始對一切智做禮讚,在《辨析》中它有說:『無常等十六行相所攝的是共中士道,因此『緣佛等淨信』開示了共下、共中的道。』在〈慈氏論典〉中也有說:『第一句開示了信心等共下、共中士道,後面的句子則是開示上士道的一切相智、施等六度以及意樂圓滿——發心,冠上『念』的名稱;『無分別等持,知一切諸法,智慧等為五』,將靜慮和智慧別別宣說。《廣論》既發心已學行道理,以及別於後二度學習道理的說法與此是相順的。因此《現觀莊嚴論》與《廣論》的科判是相似的。』<p> 」所以它確實是一個從凡夫地到成佛的圓滿綱要的引導。 [07′09″]</p>
<p>   這是再列舉一下其他的善知識們的教理依據,讓我們對師父所講的「有圓滿的認識」這一點,可以再從其它善知識的教理做一個更廣泛的探討,所以大家一定要好好地珍惜! [07′29″]
<p>   好!我們接著來聽下一段。<p>   那麼這是個大綱,這個《現觀莊嚴論》這是整個的,至於說個別的那麼是什麼呢?說《菩提道炬》,《菩提道炬》是阿底峽尊者造的。<p> 故彼造者,亦即此之造者。<p>   所以造《菩提道炬論》的這位尊者,就是本論的作者,因為這個綱要整個地照著,換句話他的藍圖,他的藍圖。實際上宗喀巴大師的這個內涵,的的確確是完完整整地接受阿底峽尊者的圓滿的傳承。阿底峽尊者的傳承,經過幾方面,最後到宗喀巴大師身上,他有所有的傳阿底峽尊者的老師的,一一都傳到宗喀巴大師身上,這是事實。 [00′56″]</p>
<p>   還有一點要特別指出來的,就是就本論的內涵來說,對於我們應機來說,本論還遠超過《菩提道炬論》。前面已經說過了,不是說本論比《菩提道炬論》好,不是,而是說應我們的機,這一點要很清楚、很明白,這樣。所以對我們現在來學的話,你們不妨把兩個論看看,《菩提道炬論》你看的話,你看了半天莫名其妙,可是本論的話一看,所有的修行的問題都解決——你念佛,念佛成功;參禪,參禪成功;學教,學教成功。這一點我順便一提。 [01′34″]</p>
<p>   好!現在我們看,說:「<p> 故彼造者,亦即此之造者。<p> 」師父說:「<p> 所以造《菩提道炬論》的這位尊者,就是本論的作者<p> 」,這句話大家是怎麼理解的?是說《菩提道次第廣論》是阿底峽尊者造的嗎?是這個意思嗎?還是有人說:「也許他們是同一心續,不同的示現。」六世班禪大師說:「不是《道炬論》的作者就是《道次第廣論》的作者,這是在說:如果《道炬論》沒有出現三士道次第的說法,就沒有這本《菩提道次第廣論》,會出現這本論就是依據《道炬論》才出現的緣故。總之,《道炬論》所說的三士道的次第和本論所說的三士道的次第是同一個。」這樣理解比較好。 [02′49″]</p>
<p>   師父也說:實際上宗喀巴大師的這個內涵,的的確確是完整地接受了阿底峽尊者的圓滿傳承。最後終於傳到了宗大師身上,所有的傳阿底峽尊者的老師的,都傳到宗大師身上,這是事實。 [03′13″]</p>
<p>   接著「<p> 還有一點要特別指出來<p> 」,請問那一點是什麼呢?你們有預習吧?師父說:「<p> 就本論的內涵來說,對我們應機來說,本論還遠超過《菩提道炬論》。前面已經說過了,不是說本論比《菩提道炬論》好<p> 」,不是這樣的,而是說我們看《菩提道炬論》能不能看懂呀?大家可以試著看一下。而是說這個《菩提道次第廣論》更應我們的機,「<p> 這一點要很清楚、很明白。<p> 」誰很清楚、很明白?是自己吧!看書的人會自己明白:看《道炬論》的時候就會沒有像《廣論》看得那麼懂。 [04′12″]</p>
<p>   所以對我們現在來學的話,師父說:「<p> 不妨把兩個論看看,《菩提道炬論》你看的話,你看了半天莫名其妙,<p> 」不知道其中是怎樣,「<p> 可是本論的話一看,所有的修行的問題都能解決——你念佛,念佛成功;參禪,參禪成功;學教,學教成功。<p> 」如果本論的話,看一看所有的修行的問題都能解決,那麼我想問大家一個問題:我們看了《廣論》之後,有沒有解決我們原來在比如說念佛、參禪這樣的過程中產生的疑問?還有師父後面,注意!「念佛成功、參禪成功、學教成功」,這個成功是什麼?是穿越了障礙,對吧?我們有沒有透過《菩提道次第廣論》穿越障礙呢?有沒有把《廣論》上所說的教理和自己的學修結合起來呢? [05′18″]</p>
<p>   比如一個最簡單的問題:聽法的歡喜心。剛開始師父在美國講《廣論》的時候是很艱辛的!講著、講著人就都走了,剩下師父一個人。然後再開始講、再走了!師父就是這樣周而復始地堅持講下來,講到現在有這麼多同學在學《廣論》。對我們來說,我們剛開始接觸《廣論》的時候,有的人一聽之下就是相見恨晚哪!有很多很多那種對於佛法的虔誠、對於佛菩薩的虔誠,由於學《廣論》的原因,就像泉湧一樣出現!但是也有的同學學了一段之後,他這種感覺就不是每天都在增長,然後慢慢平淡,有的時候甚至有點麻木了。那這個時候怎麼用我們在《廣論》裡學到的這些教理,來度過這個有點生不出來感受的階段呢?大家可以想一想。 [06′29″]</p>
<p>   還有我們拜佛有的時候很相應,有的時候就很平淡,還有的時候甚至不想去拜佛。那麼這個過程中該用一種什麼樣的推動力,把自己低落的心讓它昇華起來?用什麼樣的對治法呢?是不是要憶念佛陀的功德,憶念暇滿的勝利,甚至憶念菩提心的勝利,用這樣令心歡喜的法類,試著去對治一下自己那種下沉的狀態? [07′04″]</p>
<p>   注意哦!師父說,學了《廣論》的話,不是說很多問題,是所有的修行的問題都能解決。我們看到這句話的時候,我們會有疑惑嗎?這本《廣論》會解決所有的修行的問題嗎?那請問:三士道會解決所有的問題嗎?那我們所有的問題的根源到底是在哪裡?如果是在無明的話,解決無明可不可以解決所有的問題?這個問題大家可以想一想。 [07′47″]
<p>   我再問大家一個問題:如果我們修行的問題這本論都可以解決的話,那我們生活中的問題這本論可以解決嗎?說:「那不一定!生活是生活、修行是修行,這兩個是不一樣的。」這樣答可以吧?那麼在生活的時候是沒有修行的問題的,在修行的時候也不會碰到生活的問題,所以這兩塊是別別無關的,是這樣的嗎?《廣論》解決了修行上的問題,但是未必能解決生活的問題,是這樣嗎? [00′39″]</p>
<p>   大家往後看就知道我們在《廣論》上所提倡的修行是指二六時中念茲在茲,主要是心中正知正念的提持。那麼生活的時候需要有正念嗎?生活的時候沒有正念會發生什麼事呢?就是會被壞習慣牽著走。我們與人相處、我們對待錢財,比如說你所花的總超過你所賺的,這樣的話你怎麼可能不缺錢呢?賺一個,花兩個、花三個,那怎麼可能不天天掙扎呢?肯定會為這個錢財掙扎。那麼像類似這樣的問題,《廣論》也可以解釋嗎?因為學、學、學,我們會增加智慧,我們就會用這個增加的智慧審視我現在的生活狀態,去看出哪種行為、習慣是對我的快樂有妨礙的,然後我們就去調整。所以一旦能解決修行的問題,是否就可以解決生活的問題? [01′36″]</p>
<p>   還有我們修行人是「生活是生活、修行是修行」,還是「修行就是生活、生活就是修行」?如果這兩者合而為一的話,那是怎麼合起來的呢?因為生活也是用心活著吧?修行也是用心來修行。所以只要關注內心,平復內心的這些波瀾起伏,然後降伏內心的貪瞋痴,是否就是很多問題的解決方案呢? [02′05″]</p>
<p>   那麼是不是所有的問題都透過降伏內心來解決?那就涉及到這疑問了:佛陀要我們覺悟內心,而覺悟內心就等於徹底了結了輪迴的這件事情,這件事是真的、假的?透過薰習教理,然後生死的問題如果能夠解決,人生還有什麼大事情呢?還有什麼東西那麼怖畏,讓我們沉甸甸地放在心上,壓得透不過氣來呢?如果那麼大的問題都能解決,小問題不能解決嗎?一個人能夠搬起一百斤,難道拿不起一斤的重量嗎? [02′44″]</p>
<p>   所以,如果我們慢慢地學會用教理來打開我們在每一件事上所執著的那個點——心會攪在那個地方打一個死結,然後就特別放不下或者特別痛苦,有的時候甚至沒法睡,或者也吃不下,晝夜牽纏著這個苦,這個苦斷也斷不了、放也放不下,真的是非常地難熬;這個時候,去聽一下師父的《廣論》,或者是翻開教典看一下,然後就好像突然出現一個隔離空間,對我們身心像刺一樣正在扎著的那種痛,就好像抽離了一下,突然間就有一個很深的療癒。這是一個療癒的層面。 [03′27″]</p>
<p>   還有的人想要問題解決,一直找不到解決方案,靈感就是不出來,不知道該有什麼解決方案。這時候還是自己慧力沒提升到那個可以穿越困境的高度。那我們一直學教理、學教理的話,就深入經藏、智慧如海。當我們的智慧慢慢攀升的時候,我們就越來越能夠面對每天這些大大小小、林林總總的事情,對我們的身心所產生的撞擊。我們穿越了一個、超越了一個、飛翔了一個,就會更有勇氣和力量去面對下一個。 [04′04″]</p>
<p>   所以,雖然師父沒有說所有生活的問題都可以解決——但是所有生活的問題還是心的問題,對吧?心靈的問題。比如心對教理的認識,心對自心的認識,心對人際關係的認識,還有心對財富、對朋友、對眷屬、對世界觀……,對很多問題的認識。透過學習佛法之後,佛陀就像一個導師一樣,引領著我們在任何事情的抉擇上不要失去正知正念。因為有正知了之後,才不會讓內心的煩惱氾濫和翻滾。我們的內心不會被煩惱佔據的時候,被一個正知正念所引領的時候,才知道哪裡是快樂的、哪裡是痛苦的,才會對當下所面對的問題,拿出一個最好的解決方案。而不是隨著情緒,隨著自己過去的習染去做那樣一個並不理性的抉擇。 [05′02″]</p>
<p>   所以如果所有的修行問題都能解決的話,是不是我們由於值遇了《廣論》之後,我們的生活將會一層、一層、一層地超越原有的藩籬,進入到稍微自由一點的空間?因為這全是智慧提升了的緣故。 [05′19″]</p>
<p>   所以師父說「所有的問題都能解決」這一點,大家是怎麼思考的? [05′26″]</p>
<p>   反過來我再問一下:所有的修行問題都能解決的話,那是不是我們對於修行所產生的疑問,可以在《廣論》上尋找呢?但是如果學了一段時間還找不到解決方案,那是什麼問題呢?是《廣論》上沒有講,還是我不會找?還是我不熟悉?還是發生了問題之後,我不知道該拿哪一段的教理來對治?如果是這樣的話,我不知道拿教理來怎麼對治,就更應該去尋覓:我現在這個心的狀態,該用《菩提道次第》哪一段來對治呢?應該去尋覓,而不是說:「啊!我學了這麼久,好像煩惱沒調伏多少。」然後反而退心不學了。 [06′21″]</p>
<p>   師父說的「所有的修行的問題都能解決」這一句話不是隨便講的,因為《菩提道次第廣論》這裡邊有三世諸佛所講的奧秘,關於如何從凡夫到佛地的所有道次第,這裡邊是沒有缺少的。我們用這麼少的時間就可以學到諸佛的心要,這不是一個很少的福報就能夠感得的一件事情。那我們遇到了之後,是否能夠感受得到《菩提道次第廣論》可以解決我們修行的所有問題? [07′00″]
<p>   好!接著我們聽下一段。<p> 彼復即是大阿闍黎勝然燈智,別諱共稱勝阿底峽。<p>   「勝然燈智」就是他翻譯成功的名字,那麼「別諱」,他的諱叫阿底峽,阿底峽是西藏人的尊稱,翻成我們中國話就是殊勝、最超勝的。比如我們對最最特別的,我們稱他某某尊者、某某大士這一類,那麼這位阿底峽尊者,西藏人通常稱呼這樣,就是說表示對他最尊貴的、最尊敬的一種稱呼。 [00′44″]</p>
<p>   這一小段,師父在解釋「勝燃燈智」,別諱「阿底峽」。說:「<p> 阿底峽是西藏人的尊稱,翻成我們中國話就是殊勝、最超勝的。<p> 」就表示對他最尊貴的、最尊敬的一種稱呼,這句話就是這樣的意思。 [01′09″]</p>
<p>   接下來我們要聽「其殊勝分三:圓滿種中受生事理,其身獲得功德事理,得已於教所作事業。今初」 [01′24″]</p>
<p> 其殊勝分三:一圓滿種中受生事理,二其身獲得功德事理,三得已於教所作事業。 今初<p>   分三部分,第一個呢就是他自己的出身,說「圓滿種中」,他的家世等等,第一個。第二個呢自己的獲得的功德,換句話說,第二個就是自利。這個自利又分兩部分:教、證等等;現證的,以及教理方面的。然後呢得到了這個,最後所作的事業純粹是利人方面的。它分三部分當中,後二者容易懂,說自利、利他。第一點哪,是「圓滿種中受生事理」,這個要說一下。我們平常有一句話,叫「英雄不論出身低」怎樣、怎樣,說這個真正的英雄,不講他的出身。那麼現在這個地方,卻又牽涉到他的出身,這個說他的家世的圓滿。這有什麼關係呢?大有關係,大有關係!因為平常我們說「英雄不論出身低」,那是就世間的衡量標準,世間的衡量標準只看眼前——果;換句話說這個人在世間,所產生的世間的功效:喔,這個人創造時勢是個大英雄!只看這一點,其他的不管。佛法講的是三世因果,而這個三世,從以前的無限,是無量無邊以前,一直到圓滿成就,這個時間是無量無邊。 [03′13″]</p>
<p>   我們也了解,一個大乘佛法的修行,絕對不是短時候可以成功的。雖然《華嚴》上面說:「善財童子以十信滿心,一生取辦。」可是從凡夫到十信滿心,卻是經過很長的時候喔!那麼前面這個修行,因為有了修行的因,感得眼前的果;所以他前面的越圓滿,那麼這一生感得的果也一定越圓滿。而這個圓滿從哪裡開始?從出身開始。這點我們要了解的。所以佛法裡面很多祖師,有很多祖師,雖然是祖師,可是祖師的位次的高下,卻跟他宿生的業因有關係。說凡是越高的,他的出身一定越圓滿;下面的那就不一樣,看他偏重於哪一方面。不過有一個要例外,權位菩薩不算。所謂權位菩薩他本身已經成了佛了,他只是跑得來應你們這些根性,所以他並不顯示他自己的每......只是偏的,只權現那一部分。在這一點來說,這個所現的一定不是圓滿的教法,這也不是我們這裡談的。 [04′32″]</p>
<p>   大家剛才聽到阿底峽尊者從圓滿種中受生的事蹟,還有他自己教證的功德,乃至得已於教所作的事業,分這三個科判。在第一段中,師父就「圓滿種中」說了他的家世。然後又提出了一個問題,說英雄是不論出身低的,你只要做一番轟轟烈烈的事業,沒人在乎你的出身。但是在這個地方又牽涉到尊者的出身,說家世是圓滿的,師父說這個有大關係的!接著就出現了一個標準——世間的衡量標準,大家有沒有記得?是只看什麼呢?只看眼前的果——看「<p> 這個人在世間所產生的世間的功效<p> 」,比如說創造時勢是個大英雄。下面還有一點:「<p> 只看這一點,其他的不管。<p> 」那麼佛法講的和世間講的只看果差多少呢?「<p> 佛法講的是三世因果<p> 」,而這個三世到底有多長呢?師父說:「<p> 從以前的無限,是無量無邊以前,一直到圓滿成就,這個時間<p> 」,在這裡邊講了四個字,叫「<p> 無量無邊<p> 」! [06′08″]</p>
<p>   在這個部分,對「圓滿種中受生事理」的家世圓滿的問題,師父給我們拉開了一個無量無邊的時間概念。既然有無量無邊的時間概念,就會有一個心續在這無量無邊的時間、空間中存在,它會由三世因果這樣的次第一直成熟下去。所以在提到阿底峽尊者「圓滿種中受生事理」的時候,師父讓我們注意到了一個無量無邊的時間概念。說從無限悠遠的過去到現在、到無限悠遠的未來。尊者的家世,居然可以放到這麼悠遠的一個時間的洪流中去讚美!我們可能想到這裡就會斷線了,不知道該怎麼想下去。 [07′08″]</p>
<p>   那麼,為什麼要在這麼長的時間裡邊去讚美阿底峽尊者圓滿種中受生的這個事理呢?大家有沒有想過?想一下,為什麼要放這麼長的時間呢?接著就出現了:一個大乘佛法的修行,絕對不是短時間可以成功的。為什麼需要這麼長的時間呢?因為他是一個大乘佛法的修行者,是用非常、非常漫長的時間在修行。所以舉了《華嚴》上面的善財童子,說:從凡夫到十信滿心,經過了很長的時間,「<p> 那麼前面這個修行,因為有了修行的因,所以感得眼前的果<p> 」。 [08′00″]</p>
<p>   在這無量無邊的時間裡,師父讓我們去看這個「圓滿」兩個字。師父說:「<p> 前面的越圓滿,那麼這一生感得的果也一定越圓滿。<p> 」而這樣的圓滿從哪裡開始呢?居然是從出身開始的!接著師父說:祖師位次的高下,一定跟宿生的業因有關係,凡是越高的出身一定越圓滿。但是如果他已經成佛了就不一定,他會隨著弟子的根機隨宜地示現。 [08′40″]</p>
<p>   在這一小段裡,我想提一個問題:「圓滿種中受生的事理」,其實我們倒很樂於聽一下阿底峽尊者的出身,但是在講述阿底峽尊者受生圓滿的這個事相中,師父把無量無邊的時間放進去,還有把那麼長劫的一個大乘修行者從因到果的圓滿放進去。這樣的話,就讓我們想到:尊者圓滿的受生不是沒有因的。那麼往昔劫這個圓滿的因,到底經歷了多長的時間才達到今世的圓滿呢?這裡邊就充滿了一個大乘行者在因地的時候刻苦修行的點點滴滴,乃至可歌可泣的這些故事。 [09′32″]</p>
<p>   所以這「圓滿種中受生」,並不是像看起來那樣——出生在王族,地位非常地顯赫,好像生來就與眾不同,沒有那麼簡單!如果去看他的因的話,這是長劫累積的修行結果,所以這個圓滿種中受生,我們就會在心裡邊肅然起敬。因為這是一個修行所感得的圓滿,並不是天生就不平等,他生來就是王子。 [10′02″]</p>
<p>   師父在「圓滿種中受生事理」的這一件事上,就讓我們看到:我們看一件事情的角度往往從現世的角度去看,就算過去有因,也不會從無量無邊這樣的時間去看,更不會從一個「他是大乘修行者」的一個角度去看。 [10′26″]</p>
<p>   當我們看到阿底峽尊者圓滿受生的這件事的時候,師父大大地改變了我們對這個事情的觀點和看法。在這一件事中,讓我們看到了時間的遼闊,還有一個生命的巨大轉變。因為他從不圓滿到圓滿,都是在變,而這個變的過程中是越變越精彩、越變越無與倫比,直到走到無見頂相——難以企及的頂峰。我說的難以企及,是凡夫在因地的時候難以企及,如果刻苦修行的話,也會修成那樣的無見頂相。 [11′09″]</p>
<p>   這個章節我也是看了很多次,一直在想:師父在「圓滿種中受生事理」著墨這麼多,到底要告訴我們一個什麼樣的道理?介紹一下阿底峽尊者出生在王族非常地顯赫就可以了,為什麼一定要去找尋有多圓滿、這個圓滿是怎麼出現的?為什麼要解釋這些呢?大家想一想。 [11′39″]</p>
<p>   解釋這些的原因到底是什麼呢?是不是為了讓我們也能夠修集這樣的因?讓我們的心從眼前的這些事上也看一看,實際上我們的生命放在一個時間無量無邊的尺度上——時間無量無邊叫不叫一個尺子呢?無量無邊是尺子嗎?尺子好像都有頭有尾,無量無邊也是一個尺子嗎?如果放在這樣的一個長度,去丈量我們生命的圓滿的話,那我們是不是也可以為自己的生命做一些什麼?因為畢竟那些因都是自己種的,果也是自己受的。 [12′19″]
<p>   在介紹科判的這一段,師父說家世是第一個。第二個是他自己所獲得的功德,師父在這裡邊說自利。這個自利的部分,不用想成是完全的自利,有的是為了利他的自利,比如說你如果想救一個人的話,先學會游泳還是必要的。你說這游泳是自利嗎?當然掉進水裡之後你自己可以游出來,但是看到有其他人的時候,你也可以幫忙他們。 [00′31″]</p>
<p>   那麼問題不是說是不是「完全的自利」,接著想一想師父怎麼講的。說自利又分兩個部分,記得是哪兩個部分嗎?教正法和證正法——師父說現證的以及教理方面的。諸位聽到這一段,或者看到這一段的時候在想什麼?學尊者的傳記,就是為了啟發我們對於上師三寶的信心,然後可以改變我們生命中的不圓滿和痛苦。那麼此處出現了「其身獲得功德事理」的自利,自利的角度,師父說從教、證兩個方面。我想問大家:如果我們想為自己做點什麼事的話,我們會做什麼呢?給自己泡一杯茶慰勞一下自己、讓自己去旅行、去把掙來的錢花掉,還有做一些什麼覺得好像對自己挺好、挺滿足那樣的事情,應該會列一堆吧!就叫「享受」——愉悅感——對吧?我們會做一些這樣的事情,覺得這是對自己有利的,是不是這樣?我們大概就這樣照顧自己。 [01′48″]</p>
<p>   但是在此處師父說:教正法是什麼?是對自己最好的,證正法也是對自己最好的,自利不就是這樣嗎?最佳利益自己的方式。這個和我們平常的概念區分應該是很大的,儘管我們修行很多年了,但是提到照顧自己,我們會用什麼樣的方式來照顧自己呢?會想到最美的自利是教正法的圓滿和證正法的圓滿嗎?這兩個字突然在這一段中跳出來的時候,不知道你們會不會被嚇到?我們幾曾想過用教理完成對自我的最佳保護,用證正法完成對我活這一生的最佳獎賞?可是此處卻赫然地寫著「教正法、證正法」! [02′43″]</p>
<p>   那麼從法的定義上來看——法性悲憫,具有從惡業中救護、從煩惱中救護、從痛苦中救護這樣的功能。那麼看一看我們在世間做種種、種種的事情,還不是讓自己從苦一點的、不那麼悅意的地方到更悅意的地方。可是我們能把自己的苦樂和教正法用一條最短的線連起來嗎?說:「請你休息一下吧!」我們有想過在正法中休息嗎?讓我在我法二執中焦灼和翻滾的這個心放在一個正理觀察的空地上,我們就可以休息。有聽清我講的嗎? [03′30″]</p>
<p>   用教正法和證正法利益自己——利益自己包括保護自己,當自己憂慮的時候讓自己不憂慮等等、等等,把我們的心從負有缺憾的種種現狀中救護出來。而且師父輕描淡寫地,像白雲出岫一般流暢地講出了這句話,可是在我心裡引起了雷鳴般的作用:哦!原來教正法和證正法是最佳自利的一個方式。 [04′04″]</p>
<p>   所以看到此處的時候,大家是否可以靜下來想一想:我們這一生做的最想要利益自己的事情,離師父的這一句話隔多遠呢?我們是否會在這一句話上讓自己徹底地醒覺一下——教正法和證正法可以完成對我自己生命最深刻的、最悠遠的、最究竟的利益嗎? [04′35″]</p>
<p>   如果說:啊!那暫且成立這樣是對的。那麼在我們學習教理的時候,多少都覺得心裡會有一個疑惑:「這是在修行嗎?這是在離苦得樂嗎?」當我們在聽聞佛法的時候,當我們在背書的時候,當我們在辯論的時候,當我們在廣論班裡跟別人研討《廣論》的時候,我們是否會直接感受到:其實這就是對我生命的最佳利益,我就在用最佳的方式利益自己——圓滿自利,走在最正確的利益自己的路上? [05′10″]</p>
<p>   還是我們都有些許的疑惑:我天天聽法這是修行嗎?是不是我得去真正地修行——盤腿坐在那兒念儀軌?或者說打坐才是修行?好像對教正法的聞思就不是修行,不是能夠利益我的生命的。我們心中或多或少都有這樣的一些念頭存在著,是否是這樣呢?如果是這樣的話,那些祖師大德為什麼一定要教誡我們深刻地、認真地學習教理?教理到底跟離苦得樂有什麼關係?指示了我內心怎樣的方向?我真的需要上來就學教理嗎?這些問題大家可以好好地問一下自己。 [06′03″]</p>
<p>   還有學了這麼多年的教理之後,有的人就說:「我煩惱有斷很多嗎?好像沒有實修。」但是在學《廣論》的時候,到底糾正了多少可怕的錯誤呢?我們就沒有去算了!比如說謗法罪,比如說不知道親近善知識的罪,還有親近善知識之後不如法的行為......,自己透過學《廣論》能夠取捨,能夠憶念三寶功德,知道大乘的法必須修菩提心,乃至要出輪迴必須修空性......,這些概念在《菩提道次第廣論》之中幾乎是隨處可見的,好像走進了寶山一樣。我們會覺得獲得這樣的見解是很自然的,因為這是《廣論》教的。可是如果沒有用這麼長的時間學習《廣論》的話,我們到哪兒去尋覓這樣圓滿的見解,用這個見解充盈我們的內心,從而避免走彎路呢?好像修行沒有所成的樣子,但是正知見聽了多少?正知見是什麼?正知見就是眼睛,眼睛是做什麼?就是看路的,會去看哪裡是沼澤不要走,哪裡是深淵不可以跳,然後走一個光明坦途。 [07′12″]</p>
<p>   那先長一雙眼睛重不重要呢?還是馬上開步走重要呢?如果如眼目般的教理是這麼重要的話,那麼為什麼它不是對我們生命的最佳饒益呢?為什麼不是對我們生命的最佳利益呢?所以就不用一邊學教理、一邊懷疑有沒有在修行了,問題是有沒有在認真學呀!我覺得學著、學著我們不要去懷疑自己這條路走得是錯的,一定要從聞、思、修,然後戒、定、慧,一點點地開始。而這也是太多位的祖師為我們示現修行成功的一條——注意我下面那兩個字——捷徑!有些人認為學教理會浪費時間,但是不學教理浪費的時間可不是一劫,不知道是多少劫那樣算的。所以看到這裡的話,就了解到有教功德、有證功德,而證功德是由教功德來的,如果沒有教,是不會有證的。 [08′15″]</p>
<p>   我常常在師父的日記裡看到師父是多麼重視學教理,也看到師父在新版的《廣論》裡面講到:以前看祖師的故事就覺得很有趣,可是慢慢看著看著就覺得有很多修行的扼要在裡邊。如果認真地去閱讀的話,實在對自己的修行是一個最佳指導,全部都是用功訣竅!你看「圓滿種中受生」,放入了大乘修行者的這個因和果,時間拉到無限悠遠的從過去到現在、到未來,所以我們的相續會放在一個無限的時間軸上這樣去看、去安立因果。那麼從個人所獲得的功德——功德是什麼?很多吧!比如說福報,還有智慧資糧等等這些——卻是從佛陀所宣講的教正法,和佛陀親證的證正法這兩點出發的。用現在的話來說:衡量我們的幸福指數。你有多幸福就看你教正法學多深、證正法證多深。你有多快樂是從這兩點直接出發的。 [09′28″]</p>
<p>   學阿底峽尊者傳的時候,剛剛這個科判,師父就把這麼珍貴的種子放在我們的內心,大家會不會覺得師父是一個大善巧者呢? [09′41″]
<p>   我們現在接著往下聽。<p>   所以圓滿的教法他一定有這樣的一個圓滿,所以這個圓滿的話,從他自己的家屬出身開始,他的出身這樣,所以呢福德圓滿,表示他的。第二個呢,要他智慧圓滿,世俗的智慧圓滿,然後呢,世俗的智慧、出世的智慧圓滿,出世的智慧包括出家了。出了家以後呢,理論上面說教、證,佛法主要的兩樣東西。教就講那個道理,告訴你為什麼要修行,修行些什麼,如何修行;你懂得了照著去修行,現證,所以教、證二量。那麼這個是屬於自利方面,了解了還要利人方面。所以真正圓滿的教法必定從這三個方面,這是我們了解的。所以這一方面我解釋一下,至於這個文本身,那比較容易懂,我就不詳細解釋了,不詳細解釋了,所以這個文你們自己得好好地看一遍。 [01′05″]</p>
<p>   還有,如果說大家對阿底峽尊者真正地歡喜的話,我介紹你們一本書——《阿底峽尊者傳》,這個佛教書局有。其實真正要看起來的話,還有一本書《宗喀巴大師傳》,現在佛教書局已經出了一本《宗喀巴大師應化因緣集》,那是用白話寫的宗喀巴大師的傳。因為真正造本論的這個造者是宗喀巴大師,你能夠把《阿底峽尊者傳》跟《宗喀巴大師傳》,兩個都看一看,那時你才曉得:啊,這個造者的殊勝真是不得了啊!所以他們兩位,一個印度,一個在西藏,都被當時,而且後來幾百年當中,都稱他為「第二能仁」,說:「啊,那是佛再來,實實在在的佛再來!」詳細的內容我不講了,不過有一點我可以在這地方說明一下,啟發我們對這兩位尊者的景仰。 [02′19″]</p>
<p>   接下來這一段說:「<p> 圓滿的教法他一定有這樣的一個圓滿<p> 」——福德的圓滿、智慧的圓滿;智慧的圓滿包括世俗的智慧、出世的智慧圓滿。然後在這個地方提到教、證法。注意!我提問題了:「教」講了哪個道理呢?你們有看書吧!可以回答一下。第一個是什麼呀?「<p> 告訴你為什麼要修行。<p> 」那麼接著是什麼?「<p> 修行些什麼,如何修行。<p> 」懂得了之後要做什麼呢?「<p> 照著去修行。<p> 」所以是幾個呀?一連串的修行,第一個:「為什麼要修行?」哪裡告訴我們的?教理。「修行什麼?」誰告訴我們的?教理。「如何修行?」教理告訴我們。「懂得了照著去修行」,還是要教理告訴我們!現在又說了一遍:教、證二量就屬於自利方面;了解了之後,還要從利他的角度再學習。 [03′42″]</p>
<p>   所以在這個地方,大家會認為師父擴展我們的視野的部分又是哪些教誨呢?那為什麼要學教理?比如說你為什麼要做這件事?教理就告訴第一個問題:為什麼要修行?那修行到底有些什麼內容呀?這些內容。那怎麼樣修行呢?這三部曲。接下來,懂了之後就要去修行。所以他是一個人從最初懵懂地對佛法的一個喜好到成為功夫非常非常扎實的、精湛的這樣一個大乘行者,他要經過教正法和證正法的淬鍊,反覆地讓自身的利益達到了一定的程度,才會有本事去饒益他人。 [04′34″]</p>
<p>   所以它是貨真價實的一個功德的修鍊。這個功德不是憑空而至的,而是要花很長很長的時間,從教理的學習到證得這個教理的證德的部分,反覆、反覆地去磨練自己的心,經過很長時間的累積資糧才能夠達到的。所以真的要從內心深處禮敬這些經過了長劫修行來利益我們的師長們。 [05′13″]
<p>   講到這裡的時候,師父說了這樣一句話:「<p> 如果說大家對阿底峽尊者真正地歡喜的話,我介紹你們一本書。<p> 」在這個地方,我又想問問題——因為跟師父學習的時候,常常會舉手問問題——那對阿底峽尊者不是真正地喜歡的話,不能看這本書嗎?大家的回答是什麼?你們怎麼想? [00′28″]</p>
<p>   那我們就想:我們是對阿底峽尊者真正地歡喜的呢?還是不歡喜的?你們研討的時候會在這兒停下來嗎?師父這樣講能理解嗎?應該是學了《阿底峽尊者傳》之後,才會對阿底峽尊者真正地歡喜,那為什麼說如果大家對阿底峽尊者真正地歡喜的話,就去讀這本書呢?你們有答案嗎? [00′57″]</p>
<p>   師父接著馬上說:「<p> 佛教書局有。<p> 」地點告訴你了!接著又一句話:「<p> 其實真正要看起來的話<p> 」,看什麼呢?看書。「<p> 還有一本書——《宗喀巴大師傳》。<p> 」又說了:「<p> 現在佛教書局已經出了一本《宗喀巴大師應化因緣集》<p> 」,而且接著說,「<p> 是用白話寫的<p> 」。有沒有發現?說你要真正地喜歡看《阿底峽尊者傳》的話,還有一本書就是《宗喀巴大師應化因緣集》,而且也在佛教書局、是用白話寫的傳。接著又進一步說:「<p> 真正造本論的這個造者是宗喀巴大師,你能夠把《阿底峽尊者傳》跟《宗喀巴大師傳》兩個都看一看,那時你才曉得<p> 」,這一句結論:「<p> 這個造者的殊勝真是不得了!<p> 」 [01′51″]</p>
<p>   師父「不得了」那個語氣記得吧?那語氣突然提高。那個語氣會讓我們內心留下很深刻的印象嗎?這就是我比較建議大家聽帶子的原因,因為你會把師父講這一句話的語調的感覺記在心裡邊。能不能感覺師父在非常非常歡喜地給我們介紹?而且他說如果大家對阿底峽尊者真正歡喜的話,還是有點客氣,會不會?害怕我們排斥。是怕我們排斥才這樣說的嗎?你們可以自己考慮一下。 [02′28″]</p>
<p>   接著說:兩位一位在印度,一位在西藏。當時乃至後幾百年中都被稱為「第二能仁」呀!實實在在地是佛陀再來。 [02′43″]</p>
<p>   這一小段並不是很多字,我們可以感受到師父非常非常熱切、非常非常歡喜地給我們介紹這兩本書。對於我們學佛的弟子來說,那個時候三十多年前,有聽過《阿底峽尊者傳》嗎?我們應該不知道。我們會對《宗喀巴大師傳》生起想要去學的這種欲樂嗎?師父這樣一句介紹的話——我那個時候聽到這裡就趕快去找這本書,翻遍能接觸到的書店還有流通處,就要去找到這本書。 [03′26″]</p>
<p>   那個時候如果誰有一本《阿底峽尊者傳》,我都想不睡覺把它抄下來,然後一點一點看。因為那個時候這本書實在是很稀有,幾乎找不到的!有時候想如果沒有的話,就大家先把書借來,然後每個人分幾頁抄,免得一個人抄到手都不能動。聽到師父這樣介紹的話就特別特別想看,師父這麼這麼尊敬、這麼歡喜的心,給我們介紹的這位王子出身的祖師,到底有怎樣令人驚歎的事蹟?還有宗喀巴大師到底是怎樣的?那時候這一段真的是讓我們的內心生起了無限的渴仰! [04′08″]</p>
<p>   而且還有一個問題,不知道你們想沒想過?這是介紹《阿底峽尊者傳》,師父在介紹阿底峽尊者的圓滿種中受生的這樣的一段之後,接著就把《宗大師傳》在這個地方介紹出來,在這段裡就介紹了這兩本書給我們。我會覺得在介紹《阿底峽尊者傳》這樣的一個節奏感中,就顯得非常地明亮,我們會從「圓滿種中受生」,而想去了解阿底峽尊者所有的功德;那麼因為本論的作者是宗大師,我們還會想去了解那宗大師是怎樣的。所以對於那些特別特別想了解祖師行誼的弟子來說,師父這兩本書的介紹,無疑就像一個乾渴的小苗突然被師父澆到了水一樣。不然那個想讀書的人讀不到,天茫茫、地茫茫,找不到要找的書,那真是坐臥難安的焦慮感。我會認為解決了很多人很想要去了解《阿底峽尊者傳》的那種渴望。 [05′19″]</p>
<p>   諸位一定也有經歷過,當你特別想找一本書,天南海北到處求人也找不到,可是你也不能把這本書忘記;它就一直在白天裡、在黑夜裡,在你的生命成為一種很強烈渴望的那種痛苦。這個時候如果有一位老師跟你說哪哪哪有這本書,這一句話就跟救命一樣,你看了這本書可以解決很大的問題!有的時候可能生命正遭逢一個很大的風險或者很大的一個坎,但是因為看了這本書的緣故就過了。怎麼過的呢?因為隨喜佛菩薩的功德。隨喜功德非常大!像我們看《阿底峽尊者傳》、看《宗大師傳》,我們就一直隨喜聖者的這種行誼呀!一邊隨喜、一邊造集廣大的善業,可能生命的那點痛苦就徑直飛越過去了。 [06′07″]</p>
<p>   在這麼開始的時候介紹書,大家如果能看,就可以在隨喜聖者的這個過程之中造集很多的善業,可能就把學《廣論》學著學著就中斷、或者沒有信心、或者出一些障礙的這件事就過了,就因為閱讀這兩本傳造集太多善業了!你們認為呢?我認為是一個積資糧的好機會!不是說著、說著說到兩本書,然後就給我們介紹兩本書,不是那樣的,是特別特別隆重介紹的!不是隨意介紹的。 [06′42″]
<p>   大家好!又到了我們研討《廣論》的時間。上次師父給我們介紹《阿底峽尊者傳》和《宗喀巴大師傳》兩本書,不知道諸位回家看了沒?還是希望大家能夠看一下。 [00′17″]</p>
<p>   現在譯經院的法師正在譯一本稍廣一點的《阿底峽尊者傳》,所以對於師父接下來講的《阿底峽尊者傳》,我們就不特別一句一句地討論。最後預計會把新翻譯的《阿底峽尊者傳》仔細地學一下,因為師父希望我們能夠認真地讀一下。 [00′46″]</p>
<p>   好!那接下來我們就繼續聽師父略略地講阿底峽尊者的幾件偉大的事情。 [00′56″]</p>
<p>   這個阿底峽尊者,自己出身他是個國王王子,而且是一個大國,東印度的大國,東印度相當於我們現在孟加拉,就是東巴基斯坦那個地方,那個時候印度當年非常大的一個大國。然後呢他是一個王子,他是個老二,實際上他每一個地方都有它的特別的意義,老二表示的位次,它有一個特別的關係在,這裡不詳細講它。從小就是絕頂聰明,這個說明什麼?說明宿生他的福德、智慧兩樣東西都這麼圓滿。不但是絕頂聰明,而且他從小就要出家。欸,這個人好不簡單哪!那麼然後呢出家,還沒出家之前,他已經就去廣泛地接觸世間、出世間。世間的學問在十幾歲以前已經統統學遍了,無所不通,就像我們釋迦世尊一樣,那世間沒有一樣東西不通的。 [01′59″]</p>
<p>   這裡講一個典型的故事。那時候他有一次,僅僅啊,這個本論上面也說,只有就十五歲,十五歲喔!然後有一次去聽了一趟《正理滴論》,這是因明上的,因明哪,這個因明拿我們現在來說就是理則學,這東西很難學。我想我們接觸過佛教、佛法的很多這個同修們大家都了解,這個因明這是非常難學,教我們往往學了個幾年哪還迷哩糊嚕,裡邊的很多內涵弄不懂。結果這位尊者啊,跑得去聽了一堂,在我們想像,這個聽一堂能聽些什麼,結果它的效果是什麼呢?不妨啊把這個故事講一下。 [02′47″]</p>
<p>   印度當年有這個習慣,這個外道跟這個佛法經常要辯,然後它這個辯的時候有一套正確的方法,不是像我們現在這樣大家抬槓子,大家亂蓋一通。它不是的,由於它完整的方法,合乎這個理則的,大家技巧地辯論,而且有旁邊的人評斷。這個評斷的呢都是國王、長者,都是絕有聲望的人,所以這不能亂來的。那麼輸的一方的話呢,有兩個:要嘛就是我服你了,然後服你了,譬如說我是道士,你是佛教徒,那我輸了,那麼我們的那個道士道冠統統拿下來,改穿和尚服,做你的徒弟,然後呢這個道士廟統統供佛。反過來也是如此。這個很嚴重啊!要不然的話呢,我頭給你,這樣啊! [03′40″]</p>
<p>   結果那個時候,他阿底峽那時候去學的這個老師,他是這個佛教當中一個非常了不起的大師,正在跟一個外道辯論,辯了好幾場還不分勝負。那麼,那個時候又有一次大辯論,結果不幸在辯論之前哪,這個老師生了病了。這個辯論的時候那是要全部精神擺在那裡,精神不好的稍微一個不小心,對不起,這個話柄漏出來了,那就要辯輸掉了!所以啊這個老師有點身體不好,就不敢出去,那麼要找一個人代替,但是誰也不敢,不敢應這個場。因為你萬一你辯輸了,那個所有佛教的廟,好、好,統統搬出去,然後把外道的像搬進來,那個和尚把和尚衣服脫下來,要跟人家走,這怎麼可以啊!結果呢一般狀態當中,當然可以說生病。那人家會說:「你看他辯不過啊,他就是裝病啊!」這個東西對外面來說的話,這個很糟糕的呀!哎呀,大家覺得非常為難! [04′38″]</p>
<p>   那麼,阿底峽尊者正好聽了一趟,他是絕頂聰明,這老師也覺得這個人很行。大家想起:欸,這個人很精彩,何不妨問問他看呢?居然,他就說......問他的時候:「你去辯一辯。」「好!」要我們想這個怎麼可能啊!欸,他去了。不但他去了,而且一辯,辯勝了!你可以想到,簡直是何等聰明!他這樣的決定性的大辯論,好幾次,就把當時的整個的外道一下壓服,可想而知這個人的識見。年紀那時候幾歲啊?十五歲喔!要我們現在十五歲的,什麼都不懂喔,這可以說這個人絕頂聰明!所以你們好好看看,啊,《阿底峽尊者傳》真動人哪! [05′23″]</p>
<p>   師父在這一段介紹阿底峽尊者功德的時候,選擇了十五歲的阿底峽尊者僅聽聞了一次《正理滴論》然後就代表他的老師去辯論,這種事情實際上歷史上是不多見的,乃至可能是沒有的。想一想當時印度的辯論習慣,在場的有國王啊、長者呀都是絕有聲望的人,一輸的話代價會特別大,整個全都反過來。所以這應該是一個非常有壓力的辯論,因為一旦輸了之後,它不是一個人輸了的問題,會影響到後面太多的人!在這麼大的一個責任下,十五歲的阿底峽尊者——其實還是一個少年——老師說行,他就上去辯。他絕頂聰明,又勇敢、又有膽略,很難想像,聽起來有點像神話中的人一樣。 [06′26″]</p>
<p>   師父說:阿底峽尊者小的時候就特別聰明、絕頂聰明,這個說明什麼呢?說明他宿生的福德和智慧都這麼圓滿。而且師父還讚歎一句:「<p> 不但是絕頂聰明,而且他從小就要出家,這個人好不簡單!<p> 」講了這一段的時候,我們可以想一想:這麼絕頂聰明,到底為什麼他能這麼聰明?說凡事都有因,我們學習這些聖者的傳記就要去學習種那個因,將來就能夠得到那樣的結果。 [07′08″]
<p>   阿底峽尊者到底往昔是一些什麼樣的因緣,感得這麼精采的示現?我還沒有讀到往昔因緣的那個傳記,但是在佛經裡講到阿難尊者為什麼是總持的時候,倒有一段這樣的故事,可以給大家分享一下。在《賢愚因緣經》裡邊,佛陀有講阿難為什麼那麼聰明,可以記住佛陀說的每一個字,而且佛陀講了那麼多法,這絕對是一件不可思議的神話故事!聽起來好像阿難天生就記憶力超群、無人能比的樣子,但是凡事都是有因的。我用白話講一下。 [00′49″]</p>
<p>   「我聽佛陀這樣說過」——《賢愚因緣經》的開始。佛在舍衛國祇樹給孤獨園的時候,當時有很多比丘都生起了疑問,說:「賢者阿難究竟有什麼善行獲得如此無量強識博聞,記佛所說一言不差?」然後比丘們便前往佛處問了:「賢者阿難究竟有什麼福德,獲得如此無量的強識多聞呢?希望佛陀明示。」佛陀就告訴比丘們說:「你們仔細聽著!阿難之所以如此,都是因為他有前世的福德。」 [01′35″]</p>
<p>   接著佛陀就開始講故事了。說過去世阿僧祇劫的時候,有一個比丘領著一個沙彌,這位比丘每天堅持用嚴格的方式管教沙彌,令他誦經。每天的課程如果沙彌完成了的話,比丘便很高興;如果不足、沒有做完的話,比丘便苦心責備、教育。因為這樣,這個沙彌也常懷苦惱,心裡很苦——背誦經書雖然還是有所得的,但是要想按照師父教的背的話,往往就耽誤吃飯。因為那時候他們要乞食,如果行乞的時候及時能夠得到食物的話,他就能夠按時把經書都背完,這樣的話他的師父就不用不開心。可是行乞的時候不是一定能夠碰到人家供養,如果不及時,他就可能要走很遠的路,花很長時間,結果所剩時間不夠,便不能按時背誦經書,如果不能按時背誦的話,那往往就會被他的比丘師父責備。 [02′54″]</p>
<p>   有一次,這個沙彌因此內心非常地愁煩,愁到什麼程度呢?就是一邊走路、一邊哭——這是有可能發生的,像我們寺院裡,有一次有一個小朋友在我面前就整個哭出來。我說:「你為什麼這麼傷心?」他說:「背書背不會!」就開始哭,哭得很難過——然後,當時就有一個長者看到沙彌哭泣著走路,就向前招呼問道:「你為什麼愁煩?」應該是為什麼哭?然後沙彌就回答說:「我師父對我太嚴格了!叫我背誦經書,每天都有一定的功課限定,如果按時背誦完畢,師父就會高興;如果達不到要求,他就苦心地責備我。我行乞及時得到食物,就能夠按時背誦完經書;如果行乞不能及時得到食物,就不能按時背完經書。如果是後者,便受到師父的斥責,就是因為這個原因我才愁苦。」 [04′03″]</p>
<p>   這個長者聽了沙彌的這個話,就馬上告訴沙彌:「從今以後你常年到我家,我為你提供食物,請你不要愁食物,專心地背誦經書吧!」沙彌聽到這個話之後,從此不用愁食物的事情了,就開始專心勤勉地誦經。功課的限量不減都能完成,所以天天都很出色,天天如此,師徒都十分地高興。 [04′37″]</p>
<p>   佛又告訴比丘們說:「當時的那個師父是誰呢?現在已經成佛了,就是定光佛,當時的沙彌就是現在的我。」就是釋迦佛自己。「當時提供食物的長者是誰呢?就是現在的阿難。因為阿難在過去世造此功德的緣故,所以現在阿難獲得如此無量強識多聞、沒有忘失。」諸位比丘聽佛說完之後就歡喜奉行。 [05′16″]</p>
<p>   師父講阿底峽尊者這個故事,我總是想起阿難尊者這麼聰明的原因,如果能夠供養聞思的沙彌或者比丘的話,就可以得到強識多聞、一字不差。現在很多居士都在修行這樣的供養,所以可以想見如果沒有什麼事破壞這個偉大的善根的話,以後成熟起來,大家雖然可能不能完美地成熟到阿難那樣一個字都不漏,但是至少博聞強記是一定會獲得,因為佛陀的經典就這樣講的。 [05′54″]</p>
<p>   如果我們成辦一個出家人聞思的因緣,讓他不要為飲食操勞,有更多的時間去聞思教典的話——看那個施主他所獲得的。其實阿難就是前世那個施主,他現在成了出家人之後這麼厲害!所以諸位聽到這裡之後想一想,你們從信佛開始到現在供養了多少出家人了?尤其是那些努力聞思的出家人,還有做各種善行的出家人,你把這樣的善根迴向自己的聞思修,可以感得這樣殊勝、不可思議的慧力。 [06′28″]</p>
<p>   所以師父再再地讓我們去讀《阿底峽尊者傳》,說:「<p> 你們好好看看!<p> 」再再地讓我們去讀,一定是希望我們在《阿底峽尊者傳》中,找出自己能夠努力的因。一旦我們沿著這樣的因去努力的話,也希望在不久的未來——最好越快越好,我們能夠修集到增長福報和智慧像夏日江河般那個猛烈成熟的因。這樣的話,我們在學習佛陀的三藏教典的時候就不會困難。最好就像我們學習的祖師一樣,比如像尊者阿難,那簡直是佛陀大弟子中的一個神話人物,他一個字不漏地記著這些,這個因緣居然是這樣的! [07′19″]</p>
<p>   而阿底峽尊者在十五歲的時候,就代表佛教進行了這樣的辯論,這樣的示現也是歎為觀止的!那麼對於我們學的人,聽了這樣的一些事蹟之後,到底從何處入手呢?比如:恭敬教典,努力地聞思修,對《般若經》能夠恭敬、聽聞、思惟、讀誦、書寫,甚至我們去供養聞思修《般若》的人、聞思修經典的出家人,如果能夠真心去供養,也會成熟這樣的一個結果。聽了這個會不會覺得滿有希望的?找對了因去努力!因為有因必有果,那個果就一定在我們的期待中到來! [08′12″]
<p>   我們接著聽師父講阿底峽尊者的事蹟,今天講到阿底峽尊者的善知識們。 [00′11″]</p>
<p>   然後呢他以後,家裡這麼好,這個條件之好啊,怎麼勸他也勸不住——要我們現在想的話,要怎麼捨也捨不得——換句話他宿生的善根,以後呢他出了家,親近的老師。他親近的老師都是當年最了不起的大德,不管是性宗的、相宗的,是第一位、第一位是勝敵婆羅門,然後呢阿嚩都帝,然後呢一步一步上去,這個明了杜鵑論師,這個大明杜鵑論師是龍樹菩薩的三傳、不曉得四傳弟子,那個時候這樣的人喔,這樣。譬如說現在對我們來說,真正講教理方面是中觀、瑜伽兩派,大家說最高的就是中觀,那中觀的正宗是月稱論師,就是月稱的弟子,親傳弟子哦,這麼高的高人!而且都是證得什麼?至少都是證得加行位以上的。 [01′12″]</p>
<p>   這個加行位這是相宗所判的位次,拿我們中國的祖師們來說起來,我們曉得的有一個人,是天台智者大師的老師——慧思禪師,他是加行位上的人,你可想而知這個加行位何等地高明!現在我們祖師們都是大徹大悟,對不起,大徹大悟有很多很高的喔!佛到最後也是大徹大悟,但是很多大徹大悟的祖師還是凡夫,這我們要了解。不要拿我們的話來說,譬如憨山大師,他當年大徹大悟,人家就問他:「哎呀,你比之於祖師怎麼樣,譬如天台智者大師?」「喔,我怎麼可以跟大師相比,這種人高不可攀哪,我只是了悟心中啊!」喏,你看,一個明末四大師之首,最了不起大徹大悟的,他尚且把他推崇備至。這我們不曉得位次,所以你真的曉得位次,這個加行位上的菩薩是高不可言! [02′11″]</p>
<p>   阿底峽尊者有幾十員大善知識是他的老師喔!他最最起碼是加行位上的,而且最後阿底峽尊者還說,他是說他老師的功德,他一一都具足。從這個上面上去看的話,他超過了所有的老師。為什麼?他具足一個老師,那跟他平,他所有的老師都具足,其他的老師倒不一定耶!拿我們中國具足這個條件的人是誰啊?祖師,佛教當中找不到,世間有一個——孔老夫子。孔老夫子是廣學各家,所以各家的他都有,變成功什麼?集至聖大成。所以阿底峽尊者當年印度也是一樣,他所有的印度的教派宗主就是他。 [02′56″]</p>
<p>   印度當年有個習慣,所有的這個大廟,它有不同的很多宗派,那個每一個廟有它的宗派。譬如說拿我們目前國內來說,這個是禪宗,這個是淨土,那禪宗的又是臨濟、又是曹洞。每一個宗派當中,它有一個我們這一派當中最高成就者,這派的宗主,那麼有一個表示,什麼表示呢?就是這個鑰匙,這個大廟的鑰匙交給這個頭,就這樣。阿底峽尊者到最後他身上掌管的鑰匙,臨離開這個印度到西藏去的時候,不曉得是一百零八把,還是八百把,我就弄不清楚了,這個翻譯上面。總之當年印度大廟所有的鑰匙都在他身上,十八部哪一部最徹底圓滿認識的就是他。所以不管是哪一部,反正有諍論了、有問題了,你只要問到他,他都給你解決。小乘,小乘也是他,大乘,大乘也是他;性宗,性宗也是他,相宗,相宗也是他,他有這麼了不起的喔! [03′56″]</p>
<p>   在我們中國的的確確找不到,你可以說:「喔唷,杜順和尚很了不起,他賢首宗開宗創派的大師。」欸,對不起,天台這不一定哪!只是覺得:欸,這個人很了不起,不一定最佩服他喔!拿我們現在來說,我們現在常常看見,譬如說:啊,民國以後幾位了不起的大師,我們通常說虛雲老和尚啊、印光大師啊、太虛大師啊,乃至於什麼啊!我就曾經聽見過有一個大法師,那個現在這種大法師,都是年紀很老的老法師。我們平常說某某大師,他就說:「印光,這個老和尚......」欸,為什麼?他參禪的,所以他對念佛的人不一定贊成;反過來說,念佛的人說:「虛雲老和尚這個真是了不起,可是啊現在的人不一定合適。」就是我們中國的的確確歷史上面,沒有一個說當代、後代大家宗仰他的。可是阿底峽尊者在整個的印度,是哪一宗、哪一派都是這樣,一直到他後來到了西藏去了,居然還有不遠萬里跑得去,要去問他問題的人。這個詳細的這個內容,我想我不仔細說,不過這地方我把那個大綱說一下。 [05′15″]</p>
<p>   好!這一段我們可以知道這麼精采絕頂聰明的阿底峽尊者,他也是殷勤地追隨大善知識、承事善知識——大家都知道他跟金洲大師學習的那個辛苦過程。他的幾十位大善知識都是傳承祖師級的人物,絕頂聰明的人值遇了這麼絕頂的大善知識,一定是出現一個絕頂的時代,所以他才會成為各宗各派的宗主。 [05′52″]</p>
<p>   師父說印度各大寺院所有的鑰匙都在他身上,有一百零八把鑰匙都掛在腰間,不管是大乘、小乘,性宗、相宗,有問題都去問聖尊阿底峽尊者,達到了這麼高的成就!我們現在學的三主要道,就是他的法流啊!流到了你我的眼前。師父說阿底峽尊者的善知識都是高不可攀的善知識,而且阿底峽尊者具足了他所有的老師的功德,可以想像這是什麼樣的一件事情! [06′35″]</p>
<p>   等到法師翻譯完了稍廣一點的《阿底峽尊者傳》,我們會把《阿底峽尊者傳》再詳細地講一下,那個時候我們可以實踐師父對我們的叮嚀,就是要好好地看一看、好好地學習一下《阿底峽尊者傳》。希望大家能對這麼精采的大善知識——腰間有一百零八把鑰匙的傳承祖師生起淨信,因為師父這樣講就是讓我們能生起淨信。我們要去隨喜他絕頂聰明,十五歲的時候就可以代表佛教辯論;也可以隨喜他有這麼多精采的大善知識;也可以隨喜他居然具足了他老師一一的功德,而且各宗各派的問題他都可以回答,成為所有宗派的最厲害的導師、大善知識。 [07′27″]</p>
<p>   在《般若經》上佛陀都屢次地提醒我們:如果我們能夠隨喜菩薩的功德的話,那麼我們將積聚不可思議的資糧;如果不知道隨喜的話,在《般若經》上講的還滿嚴重的——有可能是你被魔障障蔽了,或者是墮入魔黨。大家可以看《般若經》的那一品。如果聽祖師、佛菩薩的傳記,能在內心中生起渴仰、生起隨喜的話,這樣的一分一秒的時光,我們會累積到不可思議的資糧!我們的資糧累積足夠了的話,那我們想要修的善所緣一定會在自己的心中生起來。所以請大家加油! [08′10″]
<p>   上一講我們講到《般若經》,是在《大般若經》第二會中的〈無分別品第六十三〉。這裡邊前面先不說,你們可以自己去閱讀一下。中間天帝釋散花供養,散花供養之後他就問佛,說了這樣一段話: [00′22″]</p>
<p>    「<p> 世尊!若菩薩摩訶薩已於無上正等菩提心生欲樂,我願彼心倍復增進,疾證無上正等菩提。願彼菩薩摩訶薩眾見生死中種種苦已,為欲利樂世間天、人、阿素洛等,發起種種堅固大願:我既自度生死大海,亦當精勤度未度者。我既自解生死繫縛,亦當精勤解未解者。我於種種生死怖畏既自安隱,亦當精勤安未安者。我既自證究竟涅槃,亦當精勤令未證者皆同證得。<p> 」這是堅固大願,從「我既自度」到「亦當精勤令未證者皆同證得」。 [01′32″]</p>
<p>   然後天帝釋就又問了,說:「<p> 世尊!若善男子、善女人等,於初發心菩薩摩訶薩功德善根起隨喜心,得幾許福?於久發心菩薩摩訶薩功德善根起隨喜心,得幾許福?於不退轉地菩薩摩訶薩功德善根起隨喜心,得幾許福?於一生所繫菩薩摩訶薩功德善根起隨喜心,得幾許福?<p> 」天帝釋在幫我們問佛陀:如果我對初發心的、久發心的、不退轉地菩薩,還有一生補處的菩薩隨喜,到底會得多大的福報呢? [02′25″]</p>
<p>   接下來就講了:「<p> 爾時佛告天帝釋言:憍尸迦!四大洲界可知兩數。<p> 」四大洲有多大呢?用一兩一兩的都可以秤完、都可以知道。「<p> 此善男子、善女人等隨喜俱心所生福德不可知量。憍尸迦!乃至三千大千世界可知兩數,此善男子、善女人等隨喜俱心所生福德不可知量。憍尸迦!假使三千大千世界為一大海,有取一毛析為百分,持一分端霑大海水可知滴數,此善男子、善女人等隨喜俱心所生福德不可知量。<p> 」三千大千世界為一海,那得有多少個海?這樣算一算,好像已經遠遠超越我們的數學知識能運算的邊界了。 [03′28″]</p>
<p>   這個時候,聽完了佛陀這樣的回答,天帝釋又跟佛說:「<p> 時天帝釋復白佛言:世尊!若諸有情,於菩薩摩訶薩功德善根不隨喜者。當知皆是魔所魅著。世尊!若諸有情於菩薩摩訶薩功德善根不隨喜者,當知皆是惡魔朋黨。世尊!若諸有情於菩薩摩訶薩功德善根不隨喜者,當知皆從魔界中沒來生是間。所以者何?若菩薩摩訶薩求趣無上正等菩提,修諸菩薩摩訶薩行,若諸有情於彼菩薩摩訶薩眾功德善根隨喜迴向,皆能破壞一切魔軍、宮殿、眷屬。世尊!若諸有情,深心敬愛佛法僧寶,隨所生處常欲見佛,常欲聞法,常欲遇僧,於諸菩薩摩訶薩眾功德善根應生隨喜。既隨喜已,迴向無上正等菩提,而不應生二、無二想。若能如是,疾證無上正等菩提,利樂有情,破魔軍眾。<p> 」 [05′07″]</p>
<p>   接著佛陀就回答:「<p> 爾時佛告天帝釋言:如是!如是!如汝所說<p> 。」天帝釋說了這樣一個我們聽起來可能很驚悚的事情——沒有隨喜就是墮魔黨類,從魔界中來的!我們可以自己對照一下,對自己那種麻木的心情可能是一個警醒!天帝釋問完了之後,佛陀贊同了他的觀點,說:「是這樣的,正像你說的。」 [05′36″]</p>
<p>   接著佛陀又說:「<p> 憍尸迦!若諸有情於菩薩摩訶薩功德善根深心隨喜,迴向無上正等菩提,是諸有情速能圓滿諸菩薩行,疾證無上正等菩提。若諸有情於菩薩摩訶薩功德善根深心隨喜,迴向無上正等菩提<p> 」,注意聽下面的:「<p> 是諸有情具大威力,常能奉事一切如來應正等覺及善知識,恆聞般若波羅蜜多甚深經典,善知義趣。<p> 」就是能懂《般若》。「<p> 憍尸迦!是諸有情成就如是隨喜迴向功德善根,隨所生處,常為一切世間天、人、阿素洛等供養恭敬、尊重讚歎,不覩惡色,不聞惡聲,不齅惡香,不嘗惡味,不覺惡觸,不思惡法,常不遠離諸佛世尊,從一佛國趣一佛國,親近諸佛種諸善根,成熟有情,嚴淨佛土。<p> 」這後面又講了:「<p> 何以故?<p> 」為什麼會這樣呢? [06′56″]</p>
<p>   「<p> 憍尸迦!是諸有情能於無數最初發心菩薩摩訶薩功德善根深心隨喜,迴向無上正等菩提。能於無數已住初地乃至十地菩薩摩訶薩功德善根深心隨喜,迴向無上正等菩提。能於無數一生所繫菩薩摩訶薩功德善根深心隨喜,迴向無上正等菩提。由此因緣,是諸有情善根增進,速證無上正等菩提。既證無上正等菩提,能盡未來如實利樂無量無數無邊有情,令住無餘般涅槃界。以是故,憍尸迦!住菩薩乘諸善男子、善女人等,於初發心菩薩摩訶薩功德善根,於久發心菩薩摩訶薩功德善根,於不退轉地菩薩摩訶薩功德善根,於一生所繫菩薩摩訶薩功德善根,皆應隨喜,迴向無上正等菩提。於生隨喜及迴向時,不應執著即心、離心隨喜迴向,不應執著即心修行、離心修行。若能如是無所執著,隨喜迴向,修諸菩薩摩訶薩行,速證無上正等菩提,能盡未來利益安樂諸有情眾,皆令安住究竟涅槃。<p> 」 [08′25″]</p>
<p>   我覺得這一段非常地精采,讀了之後很感動。因為師父原來每天都會讀一卷《般若經》。即使在生病,比如有一天胃疼,他也忍著胃疼把那一卷《般若經》讀完,讀完的時候還非常非常高興!也常常看到師父誦完《般若經》之後,笑得非常非常地燦爛。把門打開的時候,師父就坐在椅子上回頭看著我,每次都說:「啊,真如你來了!剛誦完《般若經》。」師父非常非常開心,然後就會跟我講一下在《般若經》上誦到了什麼內容。 [09′00″]</p>
<p>   因為得到了師父的加持,看《般若經》的時候,看到這些精采的內容,就會想像師父的笑臉。像天帝釋請問佛陀的內容,我們都想問:到底能得多少善根?其實佛陀說了,我們也不知道是多少,但是會知道好像無量無邊。隨喜有這麼大的功德!如果能以一個無所住的心、能以一個緣念無自性的心——以後學習〈毘缽舍那〉——去隨喜迴向的話,那就更加地不可思議! [09′29″]</p>
<p>   所以如果我們聽了《阿底峽尊者傳》,聽了佛菩薩、祖師的傳記,能夠深生隨喜的話,不要懷疑它所生的功德,絕對是不可思議的!因為對因果這件事,佛陀就像觀掌中菴摩羅果,他是遍智。對因果這件事,沒有什麼邏輯和推理,就是依靠聖言量,然後生信!比如信三寶、信佛所說的因果,深生敬信,如佛陀所說的那樣修行,我們就能夠得到那樣的果報。我們一起努力! [10′07″]
<p>   好!大家接著往下聽。<p> 獲得功德事理分二:一知見廣博獲教功德事理,二如理修行獲證功德事理。今初<p>   最頭一段是自己的出身,這個出身家世圓滿。第二個呢,然後修學佛法,修學佛法,所以佛法一定有兩個步驟,說佛的法——教、證。教是因,你有圓滿正確的教法認識作為因,照著這個教法去修持結這個果,所以教、證之間是互為因果的。同樣地,這個概念如果不清楚的話,你就出了毛病了,所以大師造本論的時候,前面就說「今勤瑜伽多寡聞,廣聞不善於修要」。就是啊這個因果沒弄清楚,你沒有這個因怎麼感得那個果呢?所以他現在這個造者第一點告訴我們:啊,先教,教是廣博,那時候非常圓滿的;然後這個教當中啊,又是先是世俗的,後來是出世的。然後呢這個出世的當中的話,又分幾個部分:戒、定、慧;這個戒當中又分成功別解脫戒、菩薩戒、金剛乘戒。它每一個部分分得很清楚,它一步一步地上去。 [01′34″]</p>
<p>   好!我提幾個問題大家可以回答一下。第一個問題,師父說:「<p> 這個概念如果不清楚的話,你就出了毛病了。<p> 」剛聽了這一小段,可以知道是哪個概念嗎?這裡邊師父講到了因和果,如果因和果的概念不清楚的話就麻煩了!但此處的因和果是指什麼呢?<p>  [02′04″]<p>   教、證法之間是互為因果的。那麼教、證法之間是互為因果的,又引出了哪一個偈子呢?「<p> 今勤瑜伽多寡聞,廣聞不善於修要<p> 」。師父說這個因果沒清楚的話,就沒有辦法感得「修要」這個結果,因為今勤瑜伽不能寡聞;廣聞要善於修要,正確的應該是這樣。為什麼呢?因為如果我們想要得到快樂——離苦得樂的這個結果,就一定要照著正確的因去努力。正確的因在哪裡有呢?就是在佛陀講的教正法裡有。那麼佛陀的教正法裡為什麼有我們離苦得樂的正因呢?大家想一想。 [02′56″]</p>
<p>   離苦得樂不就是照著我自己的想法、我的一套計劃,然後把那個計劃實踐了,我就得到快樂、就離開痛苦了嗎?為什麼要在佛陀的教法裡邊去找尋快樂的因呢?而且還要在教正法的聞思上廣博,這才是快樂的因,照著這樣快樂的因修下去,我們才能得到快樂的果。為什麼是這樣呢?為什麼不能照著自己的計劃,要照著佛陀的計劃呢? [03′29″]</p>
<p>   我們有很多、很多的計劃,都沒有人為了把我自己弄得越來越苦所以訂了一個、一個的計劃,都是為了希望能夠得到成功,得到像我想像的那樣的快樂。但是,大家知道我們學習阿底峽尊者的略傳,在尊者「獲得功德事理」的部分,第一步是對佛陀教法的教理部分取得了廣博的教正法的功德,然後又在證正法的部分取得了證正法的功德。從這個角度來看,我們如果想要取得像阿底峽尊者那樣不可思議的成功的話,也要像他這樣對教法進行廣大的聞思。那麼對於教法廣大聞思,動力到底來自於何處呢?來自於要離苦得樂。 [04′26″]</p>
<p>   為什麼說佛陀的教法裡邊有得到快樂、離開痛苦的正因呢?其實如果你們先預習了的話,後面的段落是有談到這個問題的。這個先放這兒,我們接著往下聽。 [04′42″]</p>
<p>   我們現在往往有這種毛病,說大乘的啊,說這個小乘的戒不要。這完全錯了!沒有小乘的基本的戒就沒有菩薩戒,沒有菩薩戒就沒有金剛乘的三昧耶戒。你看,阿底峽尊者這麼了不起的一位大上師,他學戒的時候,學得無所不通,當年小乘四個根本部,以及細分二十部派,每一個地方他分得清清楚楚,不相混雜。然後去受了戒以後持的時候,哪怕最細微的戒,絕不有犯。由於這個基礎上面,然後再菩薩戒,然後再密乘戒。正因為他如此,所以印度不管是小乘、大乘、性宗、相宗都佩服他,他也能夠如理如量,解決每一部分的問題。所以戒是這樣,有了這個圓滿的戒,得定,然後呢是慧,這個是自利方面。 [05′48″]</p>
<p>   這一小段我再提幾個問題。師父說在教正法中,會分先是世俗的,後來是出世的。那麼這個出世的當中又分哪幾個部分啊?戒、定、慧。在戒中又分什麼?別解脫戒、菩薩戒、金剛乘戒,每一部分都分得很清楚。現在有沒有注意到一個問題?出世的教法之中就有戒、定、慧,那別解脫戒、菩薩戒和金剛乘戒,都是讓我們從輪迴中解脫出來,以這個目的為根本的戒律,是不是這樣? [06′35″]</p>
<p>   所謂「出世」,是不是從鬧市裡進到山裡就是隱世呢?在滾滾紅塵的大城市裡好像隱不了的,到山裡就能隱,到山裡好像就出世了?不是這樣!它是要看我們所受的戒律,乃至我們對於戒律持守的狀況。所以還是區別於這顆心,因為受戒戒體的產生都是要在這個心上產生,而且戒是「警意之緣」,我們警惕的就是自己的心前後念的覺察。 [07′11″]</p>
<p>   在戒的部分,師父說有一個說法出現了,哪個說法?說大乘的,小乘的戒不要,師父後面接了幾個字:「<p> 這完全錯了!<p> 」注意!不是這錯了,是這完全錯了!全都錯了!沒有小乘的基本戒是沒有菩薩戒的,沒有菩薩戒就沒有金剛乘的三昧耶戒。它是一個一個的基礎,不能說我們修行大乘,然後別解脫戒不認真持,甚至抱著輕蔑的態度,這是絕對不可能解脫的!而且會造罪呀! [07′52″]</p>
<p>   所以師父就又舉說:「<p> 阿底峽尊者這麼了不起的一位大上師,他學戒的時候,學得無所不通。<p> 」大家都知道把戒律學得無所不通,就算聖尊阿底峽那麼聰明,也要花上時間啊!當年小乘的四個根本以及細分的那些戒律,每一個部派他都分得非常非常地清楚,不相混雜。持守戒律的時候,哪怕是最細微的戒,絕不有犯。注意!最細微的戒。 [08′28″]</p>
<p>   在這個部分略略一提,以後我們學《阿底峽尊者傳》還有《宗大師傳》的時候,會講到這些大上師在最小的戒律上都是很認真的。比如說在菩薩戒裡將護有情心——這已經不是一條很小的戒了。他說話的時候,一定是不會傷害別人——不害意樂是絕對的,乃至在臉色上都不讓人不愉快,都不在別人面前皺眉呀、唉聲嘆氣呀,或者帶給別人憂愁。在這些好像平常不會傷害到別人的一個情緒反應中,菩薩都在修鍊不能帶給其他人煩惱和痛苦,何況在更細微的內心律儀的持守上!大家可以看到《阿底峽尊者傳》裡邊很多關於他持戒的部分。 [09′19″]</p>
<p>   正因為戒律學得如此地精通,所以印度那麼多宗派都佩服他,說他能夠如理如量解決每一部分的問題。 [09′31″]</p>
<p>   師父是在持戒上非常非常小心的人,比如說師父在「過午不食」的這條律上一輩子都是兢兢業業,乃至在他身體非常非常弱的時候,他還是堅守著過午不食。還有他的時間是按秒算的,所以他一秒鐘都不會遲到。像大家都知道扣鐘的時候,師父也會聽那個鐘聲——幾秒鐘開始扣的、速度如何。 [10′07″]</p>
<p>   很多大善知識、有一些高僧走路的時候非常地小心,好像怕踩痛了大地一樣。他持菩薩戒持得內心慈悲的程度,不要說去傷到地上的螞蟻,就連沒有螞蟻的土地,好像都怕踩痛了一樣,腳步都是輕柔的。所以常常拿這些律儀來約束自己的內心的話,慢慢整個人就會變得非常地調柔、非常地寂靜,那些粗猛的現行就都不見了。大善知識在我們面前這樣示現,我們就要這樣學習。我們的心就像野馬一樣,要把它拴上一個繩子,不然就會帶著我們的三業跑到懸崖邊上去,乃至會傷害別人。 [10′53″]</p>
<p>   這裡邊講得特別清楚,阿底峽尊者對於戒律的聞思和持守,戒律學得無所不通,在持守方面,最細微的戒都不會有犯;萬一有犯馬上就當天懺悔,絕對不會隔夜或者就馬虎掉了。非常非常值得我們好好地效學,乃至生生世世都要效學這樣一個持戒的典範! [11′21″]
<p>   好!大家接著聽下一段。<p>   有了這樣的自利,才能夠利他,要不然你自己都不能解決,說幫別人,那不是荒唐嗎!尤其是佛法,更談不到。為什麼要這麼說呢?佛法真正說的內涵是,沒有錯,要說解決一切痛苦,得到一切圓滿的快樂,可是同樣地說苦樂,跟世間有個絕大的差別。世間所以不能解決這問題,因為無明,不能認識這個事情的真正的真相,顛倒所產生的結果,明明是苦的,我們把它看成功樂的。所以佛真正出來的一定哪指出世間的真相,說告訴我們世間的真相。 [00′51″]</p>
<p>   現在我們不了解這一個修學佛法必然的次第,所以修學佛法必然次第,了解世間真相苦的,一定是第一個策發厭離心,有了這個厭離心以後覺得......。為什麼有厭離心啊?因為覺得:哎呀,世間原來這麼苦啊!我以前不了解它呀,然後被它迷糊住了啦!被這無明所欺騙了,所以產生了一個大厭惡!所以由於這樣的了解、厭惡,一心跳出來,然後呢自己又推己及人。他說我們這個修行人,修行人講道德,世間普通一般稍微有一點道德概念的人,都不會只管自己,何況是個修行人哪!所以他更進一步推己及人,才想幫助別人。 [01′39″]</p>
<p>   這兩段,我先提第一個問題。師父說:「<p> 有了這樣的自利,才能夠利他。<p> 」請問:「有了這樣的自利」是指什麼呢?前兩段是在講自利的部分嗎?用什麼來自利呢?你不能說自己利益自己就是自利,不能這樣解釋詞。他是用什麼辦法自利的?是不是學習教正法,然後根據這個因來好好地持戒,這是自利的,對不對?那有沒有疑問:持菩薩戒也是自利的嗎? [02′20″]</p>
<p>   那麼現在提出一個問題:說「你對自己好點」,你懂不懂得對自己好一點?當我們提到要對自己好一點的時候,是不是要自己利益自己,可以這樣說嗎?那我們通常都會想一些什麼事情呢?是先想吃的,還是先想玩的?還是先想被照顧?還想什麼?自利是自己利益自己嗎?還是希望他人利益自己?自利應該是自己利益自己對不對?也希望他人利益自己。所以我們在開出來的對自己利益自己的這一個方向,有沒有說好好學習佛陀的教法,然後依照佛陀的教法好好地取得證正法、好好地持戒,實際上是最對自己好的,到現在為止會不會直接產生這樣的概念呢?大家可以考慮考慮。 [03′16″]</p>
<p>   「哎呀!你好好照顧自己呀!你別那麼傻呀!」怎麼樣、怎麼樣......我們有時會這樣勸人。那好好照顧自己用什麼來照顧呢?是用佛陀的教正法和證正法來照顧。佛陀的證正法怎麼樣照顧我們呢?就是我們學了佛陀的教法之後,依據佛陀的教法,按著道次第獲得那樣的成就。所以最後取得一切遍智,應該是完成最徹底的自利,對不對?在發菩提心有一個防止不退的方法,如果你退心了的話,自利也是不圓滿的。 [03′51″]</p>
<p>   所以在這個地方,值得我們來觀察自己現行的部分,就是當我想要對自己非常好的時候,或者我想對自己做一個最大的照顧的時候,在這裡邊是:教正法和證正法的學習,才是最好的自利。 [04′13″]</p>
<p>   師父說:「<p> 有了這樣的自利,才能夠利他,要不然你自己都不能解決,說幫別人,那不是荒唐嗎!<p> 」所以幫別人的前提,是自己能夠幫得了自己的情況下才能幫別人。師父說:「<p> 尤其是佛法,更談不到。<p> 」為什麼呢?因為「<p> 佛法真正說的內涵是<p> 」,是什麼?聽完之後還記得嗎?要「<p> 解決一切痛苦,得到一切圓滿的快樂。<p> 」可是同樣地說苦樂,世間不能解決問題,原因是什麼?要認真聽才能答上喔!因為無明,不能認識世間的真相。結果呢?把那個苦和樂弄反了,苦的反當成樂的,樂的可能是更顛倒,無法看清楚世間的真相,所以永遠得不到最圓滿的快樂。 [05′12″]</p>
<p>   接著師父就在第二段裡講了:要了解世間的真相是苦的,一定策發厭離心。請問厭離心是厭離什麼的?厭離什麼的?世間痛苦、輪迴,它們是由什麼造成的?煩惱呀!所以這個厭離不是說:「啊!我討厭這個世界,我找個地方關起來,厭倦這個世界了,我去關起來。」不是厭倦的意思。厭離是徹底地看清楚了一件事情——我這樣做下去是沒有好結果的,而且永遠得不到好結果,所以改變了!從自己的內心上開始找出自己痛苦的那個因到底是什麼——我這麼痛苦不是從外面找,要從我自己的內心去找。然後就會找到煩惱、找到無明,把這個東西解決了之後,我的生命才會得到快樂。 [06′06″]</p>
<p>   所以你說厭離世間也好、厭離輪迴也好,輪迴的根本是什麼?無明。最可怕的潤那個種子的力量是什麼啊?就是煩惱。所以要認識到煩惱的根本就是無明,對自己內心上的無明和煩惱產生了厭惡之感,然後想要把這個自己所厭惡的東西對治掉。然後自己獲得了這種經驗,成功了之後推己及人。對不對? [06′39″]</p>
<p>   有沒有發現,在這裡邊看到了阿底峽尊者他自利的部分,居然是用教正法和證正法自利的?然後利人的部分是用什麼呢?也是自己成功地學習了教、證法,獲得了經驗之後,把這個經驗推己及人完成了他利。所以從這兩點上,可以說一切的利益就包括自利和他利,都是從佛陀的教正法和證正法中所出生的。可以這樣講嗎?是不是這就是我們學佛的根本的目的?因為很顯然,如果有比佛陀的教法和證法更高明的離苦得樂的辦法,我們也不用在這兒學,對不對?因為沒有比這更清淨、更徹底的離苦得樂的辦法了,所以佛陀把這個教、證法講得很清楚,沿著這樣的因去修,就會切斷痛苦,種下快樂的因。 [07′30″]</p>
<p>   那麼那個時候想幫助別人的時候,他就感覺到,以自己的心曉得:「哎呀,這個世間這麼錯誤,大家迷糊啦,然後貪著難捨啊!」那時候勸別人:「哎呀,你要認得清楚啊,不要貪著,結果你的痛苦所以不能解決因為不認識啊!」那時候才是大乘。假定我們不認識這個,自己對這世間的事相不認識,還貪著難捨,你去勸別人,你勸些什麼啊!這不是很清楚嗎?這個世間好得很欸!我自己都捨不得,你叫別人家說捨掉它,那不是顛倒嗎?這個大乘從何談起呢!實際上我們有太多人說這種事情。 [08′12″]</p>
<p>   這一小段,師父還是在強調一個利他的前提,對不對?說自己要把這個事情解決,然後才能夠完成利他,如果自己都沒有清楚的話,怎麼能夠談到大乘呢? [08′31″]</p>
<p>   如果別解脫戒不好好持守的話,菩薩戒能夠持得很清淨也是不可能的,因為別解脫戒完成的是什麼?自利。如果你不是用大乘發心去攝持別解脫戒的話,就是為了照顧自己不要陷溺在痛苦的輪迴之中所持守的律儀。如果他沒有持守的經驗,那麼他也無法幫助另一個人擺脫輪迴,因為持別解脫律儀就是超離輪迴的一個最快的方便,對不對?當然還要學空性,但是如果不重視戒律、不信因果去學空性,連資糧也不會有。連因果見都沒有,如何去獲得空性呢? [09′13″]</p>
<p>   師父再扣到前面的主題,說有人說:「我是大乘呀,小乘戒不用持啊!」這個說法是根本沒有依據的。正因為是大乘,大乘的核心就是要幫忙他人、利益他人;而利益他人不能只有一個利益他人的心,要有一個最正確的方法——那個最正確的方法一定是戒律本身。 [09′34″]</p>
<p>   所謂的戒律是什麼?戒律就是一個軌道。就像火車的軌道一樣,尤其現在有磁懸浮列車,它在軌道上用一個非常快的速度衝,很快就衝到目的地;如果脫離軌道就走不到目的地了,而且可能會造成很大的傷害。所以一個人如果沒有獲得持別解脫的經驗,說能夠持守更細微、在心念上防守的菩薩律儀,我覺得這是不太可能,因為菩薩律儀會比它更加地精細。 [10′05″]</p>
<p>   所以師父從戒律的角度、從利他的角度,讓我們更要重視這個厭離心。別解脫戒就是「軌成出離之道」,對不對?從哪裡出離呀?從輪迴裡出離。輪迴的根本是什麼?無明。一直潤澤業的那個增上緣就是煩惱,一直讓我們苦的種子不停發芽的就是煩惱。煩惱的種類非常多,貪、瞋、痴、慢、疑,這都是煩惱。 [10′34″]</p>
<p>   所以注意!說了很多很多,都是在心上解決!正因為是在心上解決,所以每個人都有解決煩惱的能力,你不用花很多錢,也不用做什麼儀器,就在心念上自己處理就可以了。它完全是一個心靈的工程師,沿著佛陀教我們的教理,對我們的心進行一個重新的規劃,規劃成一個沒有痛苦、只有快樂的運行軌道。並且努力地讓思路沿著這樣的軌道運行,運行成功其實就成功了。 [11′07″]</p>
<p>   所以在這裡再再強調:如果你沒有從苦惱中出離,看到這個苦惱的傷害性去厭離它,而且成功地獲得這種經驗,無法當個菩薩去真正地幫忙他人。是非常腳踏實地的! [11′25″]
<p>   不過有一點我們要了解:我們不要了解這個東西隨便妄加批評別人。這個佛菩薩到世間來,一定示現我們世間共同的量則,跟我們哪,所謂同事,他也跟你一樣,跟我們混在一塊兒,然後呢慢慢地接近,引導你。我們應該有這個正確地認識,然後有了正確認識,自己衡量自己,努力爬上去。所以剛才這種道理,是用來衡量我們自己,只有修學佛法,你能夠拿這個標準衡量自己就對了,不要看別人,看別人的話你就錯了。所以處處地方佛經上面都告訴我們哪,你要了解這個,要了解這個,這個是非常重要的! [00′46″]</p>
<p>   很快地就聽過了,聽過之後我提問題能答上嗎?第一個問題:師父說:「<p> 不過有一點我們要了解<p> 」,那一點是什麼?能答上吧?說:「<p> 不要了解這個東西隨便妄加批評別人<p> 」,這是不是說不能批評別人,對不對?「不能隨便妄加批評別人」,前面還有條件嗎?「我們了解了這個東西,不要隨便妄加批評別人」,我們了解了什麼呀?了解了教正法、證正法、戒律之後,不能隨便妄加批評別人。接著師父指出一個原因,什麼原因啊?「<p> 佛菩薩到世間來,一定示現我們世間共同的量則。<p> 」什麼意思?好像跟你差不多,對不對?就是可能跟我們同事啊!然後師父還用了一個「<p> 跟你一樣,跟我們混在一塊兒<p> 」,所以如果學了點佛法的教理,亂去批評別人,有可能批評到旁邊那個同事,他是佛菩薩你不知道,對不對?這樣的話罪過就大了! [02′08″]</p>
<p>   所以「<p> 我們應該有這個正確的認識<p> 」,什麼是正確認識呀?哪個正確認識?是教正法還是證正法?還是我們了解了一個東西不要妄加批評別人?哪一個?你們可以想一想。有了正確的認識之後要怎麼辦呢?有了正確的認識怎麼辦,還記得嗎?你們要仔細地看教理才能答。現在能答上嗎?還是一片空白?肯定有的同學大腦空白,對不對?「<p> 有了正確認識,自己衡量自己,努力爬上去。<p> 」所以這正確認識看起來是指什麼?教正法,對不對?你拿教正法衡量自己。注意哦!佛法的中心,師父用那幾個字說出來——「自己衡量自己」是什麼意思?「衡量」是秤自己有多重的意思是吧?看看是怎樣的。就是拿這個教正法一直對著自己的身語意,然後「努力爬上去」。注意!「爬上去」前面還有兩個字,記得哦,叫「努力」爬上去! [03′23″]</p>
<p>   「<p> 所以剛才這種道理,是用來衡量我們自己,只有修學佛法,你能夠拿這個標準衡量自己就對了,不要看別人,看別人的話你就錯了。<p> 」這幾句話好理解嗎?好理解哦?一聽就明白!師父說拿了教理之後,不要去衡量別人,衡量別人直接就錯了!有這麼嚴重嗎?衡量別人就會錯了,然後看自己的話就對了,是這樣嗎?看別人的話就錯了。「<p> 所以處處地方佛經上面都告訴我們哪,你要了解這個,要了解這個。<p> 」了解什麼呀?拿這個教正法是要在自己的心上改變自己的,不是讓我們拿這個佛法的標準去批判世人,甚至走到哪兒都說別人錯,這個就是把佛法全部都用錯了,因為佛法是要在內心上去實踐的。 [04′27″]</p>
<p>   聽了這樣的教理要在內心上實踐,就照著那個教理一步一個腳印地做,就好像你蓋一個莊園,然後你怎麼修路、怎麼種樹、怎麼畫圖、哪裡有游泳池,有的人就蓋這樣的莊園。你不是拿了這個完美的莊園的圖之後,四處去說:「你那個破房子、你那個破房子......」不是這樣的!你要動手蓋自己的這個華麗的莊園。所以自己要開始努力改善自己,才是佛陀希望我們做的。 [04′55″]</p>
<p>   在很多律典裡也有講:戒律的精神實際上不是拿這個戒律的繩子把別人綁起來,戒律的精神是律己的。弘一大師也非常強調這一點,就是要律己。談到律己,這個「律」字,不知道大家會不會覺得好像就代表約束?其實戒律的真正的名字是解脫,解脫就是把我們從煩惱和痛苦中解脫,恰恰是解開繩索的意思。但是理解錯了,就以為戒律是一個繩子把我綑起來。No!戒律是剪斷痛苦繩索的一把利劍,讓我們得到解脫,所以才叫別解脫戒。它直接是釋放我們的,不是綑起來的。這個佛陀的教理,必須要向內心看才可以的。 [05′42″]</p>
<p>   講到這兒,可能很多老師心裡就嘀咕了:「我是老師,那我就得管小孩......。」一邊管小孩也可以管自己,管小孩管得錯誤的地方自己也可以知道,也可以每天進步。因為在跟隨佛菩薩的過程中,我們都是一個學生、都是一個弟子,不管是什麼身分、什麼地位,好好地修行,拿教理來約束自己、改善自己,完成最佳的自利,然後才能利他,這才是一個最美的旅程。 [06′16″]</p>
<p>   所以在這一小段師父告誡我們的,再複習一遍:「<p> 拿標準衡量自己<p> 」,後面接著什麼?「<p> 就對了,不要看別人,看別人的話你就錯了。<p> 」我再問大家一句:「看別人就錯了嗎?」如果我看別人的功德呢?會錯嗎?不會!這裡邊師父是說你看別人的恩、看別人的功德都錯了嗎?不是!是總是批判別人,而且是隨便地就妄加批判別人,一有什麼事情發生,要找一個罪魁禍首的話,一定會找到別人。總之都是別人的錯、天下的錯、世人的錯,就是沒有找到自己心上的無明的錯,師父說這叫大錯特錯了!看別人的話,一定是從觀過的面去看的。 [07′09″]</p>
<p>   大家知道我們自己或者別人都可以內心有個衡量,如果你旁邊有一個人,從早到晚整天說你不好的話,你真的是很難快樂的;你做了一件事情希望能夠讓他高興一點,說一點讚美的話或者說一個認同的話,可能劈裡啪啦就一頓批評。其實常常聽到批評、常常聽到否定、抱怨、發牢騷,很多人的生活會被這些語言攪得一團亂,甚至過得非常地低迷,很難快樂。 [07′46″]</p>
<p>   很簡單!你喜歡天天被人批評嗎?你喜歡天天被人指責嗎?如果不喜歡的話,那就不用這樣去指責別人。拿教理的鏡子來照自己,拿戒律來衡準自己,加強自己的修為,我覺得這是佛法最真實的利益。師父會在整本《廣論》的講解裡邊一直提醒我們:千萬不要老去批評別人,提到別人的時候要懷有感恩心。當我們這個心看向別人的時候,是懷著感恩,或者他有什麼地方我能夠學習的一個謙卑的角度。然後發生什麼不好的事情的時候,從自己的身上找找原因,不要都說是別人弄的。這個聽起來很簡單的原則,如果我們會去操作的話,會從一個痛苦的人變成一個感恩的人,感恩的人就幸福多了!如果都是別人的錯,別人沒那麼容易改,那我們何時能夠幸福呢?全天下的人都對不起自己,自己怎麼可能幸福?自己就是那個被傷害得最深的人,是無法獲得快樂的。 [08′50″]</p>
<p>   可是我們一旦懷著感恩的心對別人,總覺得自己對別人做的還是不夠的,那我們就會覺得我們受恩於很多、很多人,那個人已經給我太多、太多了,我怎麼報答也報答不完!所以就無從去對別人發牢騷,或者說:「我這麼不幸都是因為你」,就不會得出這樣的奇怪的理論。因為自己不為自己的因果負責,推在別人身上,這是不信因果吧! [09′18″]
<p>   在開始研討之前,大家調整一下自己的動機:不是為了個人的解脫,或者為了自己得到學習佛法的利益,不僅僅是為了自己,要為了利益盡法界、遍虛空界的一切如母有情都能夠成辦離苦得樂的利益,所以我們必須去希求佛果。如果想要得到所有的痛苦都遠離、所有的功德都圓具的那樣一個果位,我們必須知道那樣的果位是有因的,要循因而修才能夠成就。那麼如何是一切遍智的因呢?就是要跟隨善知識聽聞教法。所以我們要調整自己的動機,成為嚮往大乘的動機。 [00′48″]</p>
<p>   好!今天我們接著聽。<p>   你如果不了解這個,修學佛法了以後得不到好處,反而有害處。為什麼呀?因為你沒有修學佛法,你這標準是世間的標準,世間的標準嘛大家本來是雜染的,馬馬虎虎也就算了,彼此彼此。現在你修學了佛法,了解了佛法,佛法的標準高得很欸,它是佛的標準欸!然後你拿這個高的標準,拿得來不自己淨化自己,然後就拿著來看別人,這是個照妖鏡,一看哪!嗨,天底下所有的人是妖魔鬼怪!這不是很簡單嗎?因為這個所有的大千世界只有一個是佛,佛也已經涅槃了;既然佛涅槃了,現在生在世界上面,當然沒有一個圓滿的,所以每一個都是妖魔鬼怪。只有一個人沒照到,誰呀?我。本來要這個東西淨化你自己,照你的,你不幸照錯了。因為你看見別人都是妖魔鬼怪,你責備別人哪,結果害了,自己下地獄了,諍論!所以末法的時期叫鬥諍堅固,這點我們要了解的。 [01′53″]</p>
<p>   所以剛才這個道理,是了解了是淨化自己的,別人都是佛菩薩。所以這個佛菩薩都用種種不同的境界——我們常常拿普陀山,普陀山哪,哎呀,各式各樣的人都有的,的的確確有佛菩薩就在示現,他告訴我們哪,你不要隨便看別人喏!佛菩薩就示現這種量,他慈悲所以示現這個量。你了解了這一點哪,我們自然不管別人,管自己。所以如果說我們自己心裡面放不下,千萬不要說:「喔唷,我這個是大乘,小乘才管出離喔!」這個錯誤的,那我們要認得。一定要自己有了厭離心,然後進一步策發菩提心,然後呢再繼續下去。 [02′40″]</p>
<p>   好!這樣聽一遍,不知道你們預習了沒?我提問題你們會不會迅速地都能夠答出來?第一個問題,師父說:「<p> 你如果不了解這個<p> 」,請問「你如果不了解這個」的「這個」指什麼?應該是前一講的,對吧?不了解「這個」——我們有了正確的認識,然後拿這個認識自己來認識自己,努力地爬上去。那麼「不了解」的狀態是什麼呢?就是看別人,看別人的話就錯了。 [03′26″]</p>
<p>   再問大家一個問題:「不了解這個」,我們剛才已經都回答「這個」是指什麼,但是如果不了解這個有什麼過患呢?「得不到好處,反而有害處。」原因是什麼呢?為什麼如果我們不了解佛法是衡量自己的,修學佛法之後得不到好處,反而會有害處呢?為什麼?下面有,對不對?說沒有學習佛法之前,世間的標準就這樣了,但是了解了佛法之後,佛法的標準高得很。有多高呀?它是佛的標準。如果拿這個標準不看自己,來看別人的話,那天底下就都看成妖魔鬼怪了! [04′20″]</p>
<p>   我問大家一個問題:佛法是佛的標準,佛陀有沒有用佛陀的標準看世間?如果佛陀不拿佛陀的標準看世間的話,為什麼要勸大家修習出離心、菩提心、空性呢?因為跟世間人離苦得樂之道完全是反的,世間的都是無明,我們就要翻無明為智慧。佛陀證悟了真理之後,四十九年說這麼多法,都是把他講的法來看這個世間,然後讓我們抉擇出這兩者的差別——什麼是真正的苦因、什麼是真正的樂因。一直希望我們了解。那麼為什麼我們學了佛陀這個標準之後,一看別人就變成照妖鏡了?這是怎麼回事呢? [05′10″]
<p>   這個人學教典之後,學到了一個高的標準,但是其實他起步點的標準是什麼呀?是佛法要拿來看自己的,對不對?這是不是一個佛法的標準?其實他這個標準是沒有學到的。我們沒有完成淨化自己的這個過程,開始直接拿這個標準來說別人的話,就會起反作用。為什麼呢?因為我們說的東西我們也不知道是什麼,我們自己在心裡沒有體會過。沒有體會過,可能會變成空口說白話,無始劫來我們會有一直向外看的這個習慣。 [00′45″]</p>
<p>   沒有經過自我淨化的人,然後就拿著標準去要求別人。要求別人之後,他不會教給這個別人「第一個其實就是淨化自己」,因為他就沒有淨化自己,所以會天下大亂。其實他這個標準拿出去之後不是佛法,所以就變成了害處了。所以學佛法以後得不到好處、反而有害處的原因,不是說佛法有害處,而是說他學的不是佛法。因為佛法最基本的就是淨化自己,這是基本入門的要求,聽懂了就是「<p> 自淨其意,是諸佛教<p> 」。而「<p> 諸惡莫作,眾善奉行<p> 」,這兩個都在心上「<p> 自淨其意<p> 」才能完成。 [01′26″]</p>
<p>   如果學了這麼多,連自淨其意這件事都不知道,也不願意去練,反而去說別人的話,那應該不知道修的是什麼。他去照別人的時候,會照到他自己也非常地痛苦,然後別人也非常地煩惱,變成天下大亂,所以就會有害處。為什麼會有害處?因為他不是在弘揚佛法。 [01′51″]</p>
<p>   所以,聽了法之後有沒有聽明白呢?其中最重要的一點就是:會不會拿佛陀教我們的這個真理來淨化自己——自我完成對自我的淨化、自己修行。也就是前面講過的「律己」,這個有沒有學會?有沒有知道佛法的一入門就是要看自己的? [02′15″]</p>
<p>   但是比如說佛陀給我們講法,不都是他在苦行林裡修行、靜坐,然後夜睹明星、開悟了真理,然後就講給我們?那也是他悟到的道,他講給我們。我們很顯然不是在佛陀領悟的那個境界之中,佛陀也把他領悟的東西講給我們,那為什麼不會傷害我們呢?為什麼?因為佛陀自己親自實踐了這個真理,他知道所有的次第應該怎麼辦。他也知道這些沒有看到真理的人有多麼地痛苦和可憐,所以他絕對不會拿一個標準來要求別人,然後生起傲慢、鄙視,甚至對不懂的人造惡業、會看不起。不是這樣的! [03′07″]</p>
<p>   就像一個慈母對小孩一樣,他是有深刻的慈悲心的。比如說這個小孩有胃腸病、那個小孩肝怎麼樣,然後母親就會善調各種食物給這個小孩吃,而不是幼兒園的一個小朋友餵另一個小朋友。所以一定是一個有慈悲心的媽媽,知道什麼對身體好、什麼對身體不好,這個階段該餵什麼、下個階段該吃什麼,調好了那個藥,才不會傷害服法藥的我們,對不對? [03′37″]</p>
<p>   所以為什麼自己不能一上手就拿這個鏡子照人?因為連自己還不會照,你照人的時候沒有經驗,會把這事情都弄亂套,它這有嚴格的次第。大家認為呢?所以師父在這裡邊說:「<p> 本來要這個東西淨化你自己,照你的,你不幸照錯了。<p> 」因為看見別人比原來看的還慘,更加妖魔鬼怪,然後就開始,注意!後面師父說那句話:「<p> 你責怪別人哪!<p> 」學了佛法之後沒有學到慈悲心,慈悲心就是心胸非常地寬容——法界有情為量,都是如母親一樣的敬意喔!如果把有情看成如母親一樣,我們就會想要孝敬、報恩,會有這種心態。可是沒有學過慈悲心,拿法鏡照人就責備別人,注意——結果自己下地獄了! [04′33″]</p>
<p>   那我問大家一句話:責備別人就一定會下地獄嗎?為什麼?這會不會師父說得太嚴重了呀?我天天責備別人就會造那樣的業嗎?先別說一定,那有可能嗎?為什麼有可能?理由是什麼? [04′56″]</p>
<p>   所以師父的下一段就是在解釋這個問題——為什麼會有可能造下下地獄的因?師父就舉了普陀山對吧?說普陀山有各種各樣的人、各種各樣的示現,有的就是佛菩薩的示現。有認真聽嗎?大家都知道觀世音菩薩就曾經扮演一個乞丐坐在路上跟大家要錢,其實他是觀世音菩薩,對不對?還有文殊菩薩的種種示現,比如可能會示現成一個為你煮飯的;還有一些善知識會示現成為你扛行李的,對不對?他有各種示現,你根本不知道他的本地風光是什麼!所以這種狀態下,如果你不了解的話,就是非常非常麻煩的!所以為什麼我們拿這個標準去責怪別人之後容易下地獄?萬一我們用一個瞋心對到佛菩薩的話,就有可能造下這個地獄業,所以還是懷著恭敬對別人比較好。 [06′01″]
<p>   好!下面我們接著聽。<p>   所以大師就是個典型的例子,他由於這個次第很明白、很清楚,所以他絕對不會說:「啊,這個出離心是小乘的,所以小乘戒不管。」你看,他對小乘戒守得這麼嚴密啊,那一點都不能錯!然後在這個上面才能夠建立菩薩戒,然後再,密乘更是如此。現在是更糟糕了,很多人學大乘的,哎呀,我是個大乘的,小乘不要;學密乘更是糟糕了,反正是密乘最好,又可以吃酒,又可以吃肉,又可以結婚,說起來最高的。唉,真正的教法哪裡是這個樣的! [00′40″]</p>
<p>   所以這個地方我們能夠正確地認識,有一方面固然自利很重要,一方面萬一有人弄錯了,你認識了這個,你去衡量的話,大概也不會走上錯路去,這一點也是非常重要的!所以一方面固然是說明造者殊勝,讓我們曉得怎麼去找善知識,一方面從這個例子當中,也讓我們明確地認識,不要被眼前莫名其妙的這種事情所騙。那麼這個是自利,下面呢,在第六頁上面是利他。 [01′24″]</p>
<p>   好!那我提一個問題,師父說:「<p> 不要被眼前莫名其妙的這種事情所騙<p> 」,這個莫名其妙的事情所騙是指什麼呢?這裡邊有舉例子嗎?有,是吧?你們的答案是什麼?「莫名其妙」的這一點,應該主要是指對戒律的看法,比如說他認為這個出離心是小乘的,所以小乘戒不管,他自詡為學大乘的,對不對?但是阿底峽尊者的示現不是這樣的,他對小乘戒守得是非常非常地嚴密,對吧?一點都不能錯。然後在這個基礎上建立了菩薩戒,然後才密乘戒。這裡邊莫名其妙的事情就是那種看法,說:密乘好啊,又吃酒、又吃肉這種看法。師父說:真正的教法哪有這個樣子的!對於密法不要持這樣的看法。 [02′27″]</p>
<p>   大家都知道密法是在出離心、菩提心的基礎上,還要學習空性,所以密乘戒是要求地非常非常嚴格、越來越精細的,不是到上面反而拋棄戒律,不是這樣的!所以這個「莫名其妙的事情」,我們在這裡邊可以理解為對於戒律胡亂地解釋,還有那種沒有在持戒的行為,就是莫名其妙。 [02′51″]</p>
<p>   這裡邊有告訴我們:修學佛法尋覓善知識的時候,一定要注意善知識最基本的一個德相,就是他對戒律的持守,那是最基本的德相。因為戒律是軌成出離之道,我們才能夠學到律己呀!戒律最基本的精神就是律己,然後降伏煩惱得到清涼啊!如果連這個基本功都沒有的話,我們靠近他是不會得到利益的。那我們尋覓善知識有什麼範本可以依靠嗎?其實就像阿底峽尊者示現的這樣。 [03′24″]</p>
<p>   所以我們對於那些莫名其妙的這種現象,至少內心裡可以有個正確的認知——對戒律這樣的態度是錯的,我們也不會去走這樣的路。看到有這樣的人,我們也知道心裡有個正確的看法,就是不隨逐。也可能還可以幫忙一下,比如說讓他學一下道次第,學了之後就不會有這樣的看法了。 [03′47″]</p>
<p>   所以師父給我們介紹《阿底峽尊者傳》,就用這麼短的時間強調戒律的重要性——從阿底峽尊者的示現,到我們學佛最基本的就是一定要學會拿這個佛法的標準來衡量自己、來律己,先淨化自己。請問什麼叫淨化自己呢?淨化什麼?淨化煩惱,也包括淨化我們一直要管別人的這種習慣,對不對?一直上手就要說別人,什麼事都要說別人、批評別人。而說別人的時候很少是懷著慈悲心,多半都是懷著瞋心、慢心、很多各式各樣的心,總之可能很少相順於慈悲心的。 [04′35″]</p>
<p>   這樣負面的、觀過的,甚至造很強烈的瞋心的業,我們去說別人其實對自他都完全沒有好處,會造墮落的業。所以師父再再地提醒我們:當我們學習了佛法,千萬注意到腳下的路,腳下的路要走得踏實!這個踏實的路,一定是拿佛法的標準來律己的。那你說:律己的話怎麼幫人呢?其實這一群人中如果大家都律己的話,是不太會有大的問題的,就怕有人不拿標準律己,老去說別人,以法繩人,這樣的話就會有矛盾產生。 [05′16″]</p>
<p>   所以師父為什麼說:「諍論、鬥諍堅固」呢?就是這個佛法沒有拿來淨化自己,你說我、我說你,大家就亂了。如果都拿來淨化自己的話,和合也不會有太大的問題,因為遇到問題了我們總會去尋找:啊!可能是我哪裡哪裡有些問題。一旦變成這麼謙虛柔和的態度,人們也不容易鬥諍堅固。 [05′42″]</p>
<p>   師父在《廣論》裡——現在是講《阿底峽尊者傳》——在字裡行間都是在規勸我們要改掉老是看別人、說別人這樣一個習慣。這樣的習慣對於一個凡夫來說、對一個初業行者來說不是好習慣,會讓我們造很多墮落的業,因為看出去的世界實在是太糟了!沒有一雙會尋找美的眼睛,看到的都是醜陋的,都是不如自己的,甚至是恐怖的,看不到美好的東西! [06′21″]</p>
<p>   那如何能夠看到美好的東西呢?要先把這種一直在看外面的目光,先移回來注視自己在說什麼、自己在想什麼。甚至看一看自己的表情,知道自己常常皺眉嗎?知道自己跟別人說話常常聲音太大,或者對別人講話不是很客氣嗎?知道自己說話很失禮嗎?沒有尊重別人嗎?這些都要自己看了自己才知道,不然也不知道。因為我們這一輩子最大的陌生人就是自己了,眼睛長在外面、嘴一輩子都說別人,沒法跟真實的自己相遇。所以學佛最起碼的一個要求,就是要學會習慣性地看自己,就是所謂的「活在當下」,誰的當下啊?自己的身、語、意正在造什麼業自己要知道。 [07′20″]
<p>   我記得在哪一講講過一個照妖鏡的問題,現在師父又講,後面還會講。你就會發現跟著師父在隨學的過程中,師父一直要提醒我們這個問題。因為向外看是一個習慣,然後向內看也是一個習慣。很顯然剛學的人向外看的習慣太嚴重,向內看的習慣沒有,所以必須跟著老師、跟著善知識,跟著僧團,大家要學習艱難地開始向內看。 [00′31″]</p>
<p>   有些人向內一看,黑洞洞的,什麼也看不到,總覺得自己有道理——我能看到一大堆合理的道理,一看別人就看到一大堆不合理的道理。但是我們可以越過這些東西,再看。還有的人非常害怕看自己,當他看自己的時候,可能是不知道會發生什麼,所以一看到自己就覺得非常緊張。其實這些都可以慢慢地穿越,因為你看到不好的你就改掉它,看到好的你就增廣它,每個人的心裡也都有美好的東西,不然我們就不能成為人了,對不對?生為人還是有條件的,所以也不要那麼害怕。但是養成一個向內看的習慣是非常辛苦的,大家一定不要拒絕這種修鍊,不要拒絕這種練習。 [01′15″]</p>
<p>   發現在商量問題時,商量、商量,我們那個鋒利的東西就出去對別人了!當然有可能現在學了教法之後,我們是見解上的討論。但是當我們這個態度開始變鋒利,開始變得非常生硬的時候,自己能不能有一個警鈴開始響起來:「欸!我又開始對別人犯老毛病了!」這時候要不要深呼吸一下,調整一下,說:「對不起,給我一秒鐘的時間。如樹應安住,我調整一下。」然後你可能就再勉強地微笑一下,不要用那麼可怕的臉對別人。因為我們這個臉非常奇怪,只有照鏡的時候是面對自己的,不照鏡的時候都是面對別人的。我們到底呈現出一張什麼樣的臉讓別人看?很少人自己知道吧!對不對?是這樣嗎?還是你們都知道你們給別人看的是什麼臉?就照鏡子的時候會遇到自己,平常都是別人會遇到你的臉。所以盡量給別人一個稍稍柔和一點、和藹一點的臉色,這個也是要修鍊的。 [02′14″]</p>
<p>   所以,非常非常地希望我們能夠珍惜師父對我們這種提醒。你看,在《阿底峽尊者傳》提到戒律的時候又提到這個問題。因為我們不會向內看的話,我們就沒法達成戒律的要求——對自己的心念了了分明,對自己的語言了了分明,你非常知道前一刻說了什麼,哪一句話是說錯的,下一念就改了。我們跟不上我們的心念,心念太快了!電光很快吧?風很快吧?流星很快吧?流星那麼快,我們還能看到呢!當那個樹在搖擺,或者雲在飛的時候,我們知道可能風在運行,可是我們的心念呢?「逝者如斯夫」,像洪水一般流過去的心念,有幾個心念是能夠抓住的呢?你只要在念密集嘛的時候,看看你清清楚楚念的有幾個就知道;或者念幾句觀世音菩薩,接著走神了,能知道是在第幾句走的嗎?然後又什麼時候拉回來的? [03′11″]</p>
<p>   所以這樣想一想:我們最不了解的就是自己的心、自己的語言、習慣,甚至是自己的審美。出去看別人是用審美的觀點在看,還是用一個到處看不好的、看恐怖的觀點在看?——因為沒有審醜這個詞——用什麼樣的目光在看?我們看出去的和我們內心的世界是吻合的,沒有審美,就會看到醜陋的東西,我們不會看光彩之處,因為沒有養成習慣。 [03′41″]</p>
<p>   師父在這一段講《阿底峽尊者傳》,講到阿底峽尊者連最細微的戒都守得這麼好的這件事時,又提到了這個——千萬剛學的時候,不要拿這個標準去到處看別人啊!要「<p> 有了正確的認識,自己衡量自己<p> 」,還有那句話——「<p> 努力爬上去<p> 」。這是個爬坡,爬坡是不輕鬆的;掉下去很輕鬆,但是也沒命了。所以向上爬每一步都很艱辛的,就是要擺脫你的舒適圈。當然你爬兩步到一個風光的地方,可以稍稍看一下,也是會有這種境界。但是你必須要向上爬,每爬一步都要努力,努力才會有收穫!所以希望大家好好地堅持法鏡內照,看自己的心念在想什麼、聽自己在說什麼,甚至猜一下你的表情是什麼樣,猜一下!這對我們是很有好處的。 [04′39″]</p>
<p>   收攝一下。先想一想:我們所處的環境如果都是一個向內看的環境,我們就會改變這個習慣;如果我們所處的環境是一直相互指責的話,我們先忍、忍、忍,有一天也會忍不了,也開始指責。所以這個修行環境是很重要的!如果這修行環境大家都覺得不要指責別人,指責別人是錯的,不要讓別人痛苦。你不希望別人指責你,你也不要指責別人;當你有慈悲心的時候,你就勸勸別人。 [05′10″]</p>
<p>   所以我看到這個修學環境的重要性。我們在這個環境裡是會學好的,我們不會跟原來一直一直說別人過失、說別人過失這樣的人聚在一起,口業的那幾種——離間語呀、說是非,天天講這個,講久了之後,耳濡目染我們就慢慢變了。可是如果我們在一個觀功念恩的環境,一個都向內看的環境,每天修鍊自己的話,注意!假如給你十年,這兩者你想想會差多遠?十年之後,生活在這兩種環境的人,他們會相差多遠?這就是修學環境的重要性,就是廣論班的重要性,就是僧團的重要性! [05′53″]
<p>   好!今天我們開始學習《四家合註入門》裡邊「造者殊勝」的解釋,請大家把《四家合註入門》翻到 92 頁。看文: [00′15″]</p>
<p>   <p> 第二、正敘所說:<p> 由是菩提道次第引導,分四:<p> 一、<p> 為顯其法根源淨故開示造者殊勝;<p> 二、<p> 令於教授起敬重故開示其法殊勝;<p> 三、<p> 如何講聞二種殊勝相應正法;<p> 四、<p> 如何正以教授引導學徒之次第。今初:所言<p> 根本及直接<p> 造者:<p>  [00′50″]</p>
<p>   <p> 總此教授,即是至尊慈氏所造《現觀莊嚴》所有教授。別則此之<p> 〔<p> 教典<p> ,令意正安住故,名為教典,如燈照明闇中黃金等,此亦照顯菩提道故,<p> 即是《菩提道炬》。<p> 〕<p> 故彼造者,亦即此之造者。<p> 是語顯示此二上師同一心續。究竟而言,固為同一心續,然此文義是謂此《菩提道次第》所詮說之根本教典或如根本頌者,即為覺窩傑所造《道炬論》,故彼造者理應亦為此道次第之造者。下文所說法殊勝,亦即宣說《菩提道炬論》之殊勝,其旨實同。﹝<p> 彼復<p> 往昔勝者降世之時,於王舍城中示現長者相,名曰賢護菩薩。以卓壟巴云:「於勝者前名佛子賢護。」綽普譯師云:「昔於佛世尊汝名賢護」故。﹞<p> 即是大阿闍黎<p> ﹝<p> 迪邦<p> 為燈,<p> 嘎惹<p> 為作,<p> 師利<p> 為吉祥,<p> 迦那<p> 為智。﹞<p> 別諱共稱勝阿底峽。<p> 此中有上師謂由具增上意樂,故名曰阿德雅峽;眾聲明論師謂為至極寂靜之義;然如傑仁波切云:「傳稱最勝三百十」,阿底峽應為超勝或殊勝之義。<p>   這是《四家合註》解釋。 [02′44″]</p>
<p>   現在我們看 93 頁的「講記」。要認真看書喔!在講記裡邊說:「<p> 第二、正敘所說<p> 」,正敘所說開始了。語王尊者的箋註已經圓滿地結束,這應該是妙音笑大師的箋註。接著就是菩提道次第門引導,分幾啊?「<p> 分四<p> 」,這是《廣論》的什麼?科判。哪四個會背吧?「第一、為顯其法根源淨故開示造者殊勝」,就是這個法的源頭是非常清淨的。怎麼個清淨呢?就要講一下造這本論的人是有多殊勝。「第二、令於教授起敬重故開示其法殊勝」,就是我們對這本論給我們的教授能起一個殷重之心,怎麼樣能夠得到這殷重之心呢?就要開示這個法有多麼地殊勝。「第三、如何講聞二種殊勝相應正法」,怎麼樣講、怎麼樣聽。「第四、如何正以教授引導學徒之次第。」然後「<p> 今初<p> 」就是「<p> 所言<p> 根本及直接<p> 造者<p> 」,這四個科判其實包含了從一開始親近善知識軌理,直到最後的雙運果位——成佛中間的所有道次第,是沒有缺少的。 [04′08″]</p>
<p>   第一個,「為顯其法根源淨故開示造者殊勝」,這裡邊的「根本及直接」的「根本」到底是指什麼?這個根本就是《廣論》的根本。《廣論》的根本是什麼?就是《道炬論》。那麼《道炬論》的造者,就是覺窩傑具德阿底峽尊者。《道炬論》所說的教授是什麼呢?其實就是至尊慈氏所造《現觀莊嚴論》的所有教授。《現觀莊嚴論》是誰造的?是至尊慈氏所造的。那是怎樣的一本論呢?這個論能讓所化機非常容易地了知廣、中、略三種《般若》的一切內義,也就是《佛母》的內義。這本論聽起來滿神的——用我們的話來說非常地神,它能把甚深的《般若波羅蜜多》廣本、中本、略本的內義都讓我們——注意那個「易」字——更容易了知,就像莊嚴一樣,所以叫《現觀莊嚴》。 [05′25″]</p>
<p>   當中統攝了《般若經》裡次第超脫、不合之處,並攝集了廣、中、略三部《般若》的內義。次第超脫,這個「超脫」是從藏文直譯過來的,就是說好像有點不合次第那樣的。但是譯成「超脫」有待考慮,是這樣嗎?因為看了「超脫」不知道是什麼意思。所以在《般若經》裡我們看起來:啊,好像次第不是這樣的!不合之處如果讀了《現觀莊嚴論》就非常地容易理解。看來是我們非常非常需要的一本論,不然我們沒辦法讀懂《般若經》。 [06′04″]</p>
<p>   那麼《現觀莊嚴論》中宣說了什麼呢?宣說了隱義現觀次第和顯義空性次第兩者。請問這兩者在《廣論》中是指哪個部分和哪個部分呢?大家知不知道?可以想一下。在〈奢摩他〉之前是完整無缺地宣說隱義的現觀次第,〈毘缽舍那〉則是宣說顯義的空性次第。大家都知道《般若經》是講空性的,但是它的隱義是宣說道次第,顯義是空性。 [06′42″]
<p>   那麼什麼是隱義現觀呢?「隱義」顧名思義就是隱藏的意涵,隱義是相對於顯義來說的。《般若經》的所詮可以分為顯義和隱義兩個部分:顯義就是指空性,我們在讀《般若經》的時候,從字面上很容易看到《般若經》是在宣講空性的內涵,所以空性就是《般若經》的顯義;而隱義就是《般若經》裡所含的現觀的道次第,現觀的次第隱藏在《般若經》裡,隱藏在開示空性的經文的內涵裡面。 [00′48″]</p>
<p>   現觀次第是什麼呢?就是指修道的整個過程中要修什麼——先修什麼、再修什麼、後修什麼。比如說它的體性、數量、次第決定等等,這些內涵就是屬於現觀的次第。通常我們一般的話,不容易一讀《般若經》的經文就能夠明了現觀的道次第,一般人是做不到的,必須要有善知識的傳承教授才能了解,所以現觀的次第才被稱之為「隱義」。 [01′31″]</p>
<p>   那麼隱義的現觀和顯義的空性能為我們帶來什麼勝利呢?隱義的現觀次第是指完整的修道次第,一個凡夫要怎麼修行才能夠最後到達佛地,這樣整個修道的過程,超越所有的菩薩——成佛。在這個過程當中必須要修學空性,才能夠斷除煩惱的根本,徹底地脫離輪迴,乃至成佛。所以我們透過學習隱義的現觀和顯義的空性,能夠了解如何修行,沿著佛陀、祖師、菩薩教導我們的次第循序漸進,最後能夠徹底地遠離所有的苦、得到一切的快樂。我再說一遍:是徹底地遠離,那種痛苦不是說把它打退了之後,過了一段時間再回來;是消滅掉,是永遠不會再生起痛苦。而所有的快樂也不用費力地得到,就像湧泉一樣,是圓滿的、一切的快樂。 [02′43″]</p>
<p>   按照《廣論》的次第來說,我們必須要先學習隱義的現觀次第,因為那是趣向空性的基礎。有了前面的基礎,我們才能夠更進一步地學後面的〈毗缽舍那〉,在〈毗缽舍那〉的章節裡我們就會學到空性。所以,隱義是顯義的基礎。 [03′09″]</p>
<p>   像以前在聽師父講的時候,有一天早晨的時候,我去請問師父。師父那時候剛讀完《般若經》,師父就很高興捧著《般若經》,然後就問我說:「《般若經》有沒有《菩提道次第廣論》的次第呀?」又接著問我說:「你有沒有讀到道次第?」然後師父把剛讀的那一段《般若經》,說:「你念一遍。」然後我就念了一遍。念了一遍,師父說:「那你給我講一遍。」當時就很驚訝,說:「師父,你讓我講嗎?」然後師父說:「你給我解釋一遍。」當時我在心中祈求了一下,請師父加持,因為師父讓我講,我就開始照字面意思那樣,在師父面前講了一下。 [04′04″]</p>
<p>   那一段寫的其實就是道次第,那也是一個緣起吧!希望以後能講《般若經》中的一段,我是會沿著祖師的釋去講。敬請期待! [04′20″]</p>
<p>   下面我們看《四家合註入門》的 94 頁:<p>   「<p> 別則此之教典,即是《菩提道炬》<p> 」,所謂的「教典」是什麼呢?就是「<p> 令意正安住故,名為教典<p> 」。「令意」,就是令我們的心意,怎麼安住呢?前面有個詞叫「正安住」,就是讓我們的心非常非常舒適清涼這樣的教授,就是教典。這是巴梭法王的箋註。 [04′57″]</p>
<p>   這個教典如果有個譬喻的話,就像什麼呢?這個《菩提道炬論》像什麼呢?「<p> 如燈照明闇中之黃金等<p> 」,如果有個屋子裡桌子上堆滿了黃金,那個金磚或金塊,能想多大都可以。可是我們也不知道這是什麼,看不清楚,可能是以為一些鐵呀或者銅塊,甚至是木盒子什麼的。可是這個時候,如果房間裡的燈突然亮起來,我們會發現說:「哇!這桌子上堆的原來都是黃金啊!閃閃發光的黃金啊!」所以這個「照」,是照什麼呢?照這個金子,就是照顯菩提道——如黃金般珍貴價值的菩提道。有了這個教典的燈,我們才能夠認知、才能夠看到。如果黑暗裡沒有光明的話,放了黃金也看不到、也不知道;如果在裡邊點燃了火炬,那我們瞬間就能看到:哇!原來這是寶藏、這是金子! [06′12″]</p>
<p>   同樣地,因為有了《菩提道炬論》,才能完全清晰地看見什麼樣的道路呢?趣往佛地的道路。這樣的教典是什麼呢?「<p> 即是《菩提道炬》<p> 」,就是阿底峽尊者造的《菩提道炬論》。「<p> 故彼造者,亦即此之造者<p> 」。這裡說的「此」就是指《菩提道次第廣論》。 [06′49″]
<p>   還是看《四家合註入門》的 94 頁。「關於造者方面有許多的問題。」因為這裡邊說:《菩提道炬論》的作者,就是《菩提道次第廣論》的作者。很顯然《菩提道炬論》的作者是阿底峽尊者,《廣論》的作者是宗喀巴大師,為什麼說是他呢?所以關於造者有很多問題。如果阿底峽尊者是造者的話,那麼是否宗喀巴大師就不需著作《廣論》了?因為造者阿底峽已經著作的緣故——他已經寫過了。這樣的疑問很多。 [00′37″]</p>
<p>   關於這點,接下來語王尊者的箋註「<p> 是語顯示此二上師同一心續<p> 」,有些人說宗喀巴大師和阿底峽尊者兩位是同一心續,就是同一心續的不同示現。那這句話就意味著宗喀巴大師要表達自己是尊者的化現,但是語王尊者會認為這樣不合理,並不是這樣。「<p> 究竟而言,固為同一心續,然此文義<p> 」,語王尊者他並沒有說不是同一個心續,但是這段文的意思是說:《菩提道次第》所詮說的根本教典或者根本頌,即是覺窩傑所造的《道炬論》。《道炬論》的造者就是阿底峽尊者,「<p> 理應亦為此道次第之造者<p> 」,這裡的造者只是從義理上說,並沒有說文字的造者。因為《廣論》就是在解釋《菩提道炬論》,所以阿底峽尊者理應是此論的作者,是大師的意思。 [01′39″]</p>
<p>   怎麼知道呢?語王尊者的說法中提到:「<p> 下文所說法殊勝<p> 」,接下來會講述法的殊勝,在講到法的殊勝的時候,就是在說《菩提道炬論》的殊勝,從這裡就可以推知這個結論。 [01′56″]</p>
<p>   那麼如果換成是提問的方式,再來思考這個問題的話,會不會這樣想:佛薄伽梵宣說了廣、中、略三種《佛母》——就是《般若》,既然已經講了《般若經》了,就等於講了《現觀莊嚴論》。因為此論的內容在廣、中、略三種《佛母》裡面都有,所以可能還會產生疑惑:「這樣的話,著作《現觀莊嚴論》不就沒有意義了嗎?那麼,既然已經作了《現觀莊嚴論》,著作《菩提道炬論》不就沒有意義了嗎?因為它一切的教授都在《現觀莊嚴論》中有了。而尊者已經著作了《菩提道炬論》,其中的內涵和《廣論》也是一樣的,那麼著作《廣論》也就沒有意義了。」對不對?不知道大家會不會現起這樣的想法?有的話,事實並非如此,每一部論都有它各自殊勝的意義。這樣想了的話,除了《般若經》,其他的教典就都不應該寫了,因為佛陀都講完了。佛法佛陀都講完了,祖師也不用再造論了,因為再造論也是解釋其中的意思。 [03′01″]</p>
<p>   攝集廣、中、略三種《佛母》一切扼要於一處的,就是《現觀莊嚴論》,這就是著作《現觀莊嚴論》的意義所在;明了《現觀莊嚴論》的話,就能夠通達廣、中、略三種《般若》所說的一切內涵。注意!佛陀雖然講了《般若經》,但是我們能不能看到其中有隱義的現觀道次第?沒有《現觀莊嚴論》,可能我們都是讀不懂的。有了《現觀莊嚴論》,如果不著作《菩提道炬論》的話,在《現觀莊嚴論》中,並沒有按照各自的次第安立出下、中、上士三種士夫這樣的一個框架。對不對?在《現觀莊嚴論》裡沒有直接這樣安立,《道炬論》裡才有。 [03′48″]</p>
<p>   開創三士夫道軌的應該就是覺窩阿底峽尊者,以前在印度應該是沒有的。後來《道炬論》造完之後,送回了印度,印度的這些大班智達們說:「哎呀!覺窩傑去西藏是件很好的事,如果不去西藏的話,就不會作出這樣的論著。」藏人把阿底峽尊者從印度請到西藏,他們一定是心痛了很久,這事一直在心裡都想不開。然後直到阿底峽尊者寫了《菩提道炬論》送回去之後,得出這樣的結論。因為在印度不需要造這部著述,很多的大智者就能夠通達。後來也有來自印度的祈請,希望能有此論的自釋。依次宣說安立三士夫的行相,這就是著作《道炬論》的目的。 [04′42″]</p>
<p>   而《道炬論》的文字大家看過吧?極為地精要,圓滿完整地含攝顯密之道。這樣的話,除了上等根機的補特伽羅以外,下等根機的補特伽羅無法證得其中的義理。就是因為太精要了,所以看不懂,因此也非常需要著作《道炬論》的解釋。所以「<p> 故彼造者,亦即此之造者<p> 」,就是指《廣論》的內涵的造者是具德阿底峽尊者,並不是說文字的造者是阿底峽尊者。有在聽嗎? [05′21″]</p>
<p>   這樣層層的推理會發現:其實我們看《般若經》應該也看不出三主要道,對不對?看《現觀莊嚴論》也看不出來。這裡邊的道次第的安立,可能並不能從《般若經》直接地讀懂或者學會。 [05′41″]</p>
<p>   所以就很感恩這些祖師、菩薩能夠造這樣精闢的論典,讓我們這樣的後學透過學習《廣論》來了解《道炬論》、《現觀莊嚴論》,進而了解《般若經》,這是讓我們非常感恩戴德的一件事情! [06′00″]</p>
<p>   想到此處,會不會想頂禮這些造論的祖師們?因為沒有《廣論》,我們也沒法知道阿底峽尊者《道炬論》的內涵,也沒法了解《現觀莊嚴論》、《般若經》。所以也感恩師父能夠這樣逐字地為我們解釋,還有把《四家合註》翻譯過來的譯經院法師,給我們講《四家合註》的仁波切。沒有這一些大善知識,還有所有傳法的上師們,我們是沒法了解這麼精采、清淨圓滿的傳承教法的! [06′39″]
<p>   今天我們會學:「<p> 於聖教所作事中分二:<p> 一、<p> 於印度所作事理,<p> 二、<p> 藏中所作事理。 今初<p> 」。請大家認真聽師父的帶子。 [00′17″]</p>
<p>   那麼換句話說,純粹利他部分。利他部分第一個在印度,第二個在西藏。這個內容我不詳細說了。總之,他由於阿底峽尊者出來了以後,把印度以及西藏整個的教法,錯的改過,不圓滿的圓滿,因為這樣的關係,所以如日中天維持了很久。實際上呢,宗喀巴大師又一次,所以宗喀巴大師改革到現在六百年來,他在西藏的狀態,很長一段時候如日中天,雖然後來慢慢地下去了,但是呢始終保持著很好的。反觀我們目前,我們國內一塌糊塗,原因就是說,原因就在這裡,這是我們要了解的一個事實。 [01′17″]</p>
<p>   這一段,我很想知道在研討班各位班長到底會怎麼帶這一段?比如說大家的著力點會放在哪裡呢?這一段可能很多同學各自有各自的側重點,但是請大家看:「於聖教所作的事中:於印度所作,於藏中所作」,這是由地域的原因,阿底峽尊者對聖教所作的事業。那麼對聖教所作的事業是什麼呢?就是令聖教振興、饒益有情,所以師父說是純粹的利他部分。純粹的利他部分是什麼意思呢?就是徹底地饒益眾生的部分。然後師父說內容是怎麼饒益的不詳講,「<p> 總之,他由於阿底峽尊者出來了以後,把印度以及西藏整個的教法<p> 」,注意!「<p> 錯的改過來,不圓滿的圓滿,因為這樣的關係,所以如日中天<p> 」,不僅僅是如日中天,還有「<p> 維持了很久<p> 」這樣的狀況。 [02′35″]</p>
<p>   那麼我們就看這一小段。阿底峽尊者應化在這個世界上,為我們到底帶來了什麼利益呢?就是印度和西藏的佛法又開始如日中天。教法開始如日中天之後,那會對眾生產生什麼樣的饒益呢?就是在他的弟子們中會出現很多成就者,然後有數不清的眾生會和這個教法結緣,比如說十善業會很廣闊。所以佛教如日中天的這個盛況,正是對眾生完成最深切的利益,這就是阿底峽尊者的功德。 [03′21″]</p>
<p>   我想要請大家注意到的是:注意!這裡邊只是說由於阿底峽尊者出現了之後——就是一個上師——令佛教如日中天,饒益了從印度到西藏這麼多的有情。怎麼令佛教如日中天呢?詳細內容我們會去看《阿底峽尊者傳》。但是尊法師翻譯的《阿底峽尊者傳》是節選,不是全部的。現在譯經院的法師們正在翻譯一個完整的版本,到那時候再詳細地講。那麼現在談到阿底峽尊者的功德的時候,注意!就跟佛教直接連繫在一起,所以佛教如日中天就是對眾生最深切的饒益。這裡邊涉及到把不清淨的傳承改過來——錯的要改過、不圓滿的圓滿。不圓滿的可能是次第不全,所以把一個凡夫一直到成佛所有的次第、內容都能夠圓滿。 [04′30″]</p>
<p>   接著說:實際上,宗喀巴大師又做了一次!宗喀巴大師改革到現在六百年了,也是如日中天,雖然現在有一點下滑,還是非常好。這也是我們能夠學習到宗大師教法非常殊勝的因緣,可以接觸到這麼清淨圓滿的教法。當我們學到這個教法的時候,我們一定要記住:是阿底峽尊者深切的饒益!他本來是孟加拉的王子,費盡辛苦地出家,又跟金洲大師求法,渡海就花了那麼多年,後來西藏人拚死拚活把他請來——我們要感謝那個請法的人。 [05′12″]
<p>   我有時會算,比如孟加拉的海拔是多少?然後阿底峽尊者是從阿里王朝那個地方開始進入西藏的,那個地方的海拔應該是三千八吧!而他的出生地孟加拉的海拔好像只有四米;住持的印度止迦摩囉室囉寺,約海拔五十二米,然後一到阿里王朝那個地方就三千八百。 [00′26″]</p>
<p>   因為我也去過藏地,我知道海拔一高之後其實吸不到氣,走路都很辛苦、晚上休息很辛苦、吃飯也很辛苦。總之做什麼都會花費非常大的力氣,走路的時候就像跑步一樣會喘。我們可能會認為阿底峽尊者非常有修行,海拔對他應該沒有問題。但是大家也都知道阿底峽尊者捨壽二十載,到底是怎麼捨的?可以想像:他本來是一個王子,經歷這樣的一個海拔;還有印度是很熱的,而到了阿里那邊其實是很冷的;再加上飲食習慣;再加上很多人都不是跟他說一個語言的,都說藏文,原來熟悉的朋友和上師們都不在,就他來到這邊,他可能只能跟他的幾個翻譯對話。所以到了一個這樣的地方。在這種狀態下,把西藏的佛教如日中天,他自己本身要承受多大的困苦的壓力,大家可以想像一下要承受多大的力量。 [01′31″]</p>
<p>   要穿越海拔、水土不服、背井離鄉,到了一個氣候、風光完全都不一樣的地方。原來阿底峽尊者很喜歡聽大象的叫聲,到了西藏沒有大象,想念大象的叫聲。所以從那樣一個他已經熟悉了、腰間掛了一百零八把鑰匙的佛教頂嚴的位置,到了西藏這樣完全陌生的地方,可能也沒有多少人認識他,然後在這樣的地方完成這樣一個偉業,把佛教振興起來。大家可以想一想:難度會有多大啊!幾乎是白手起家重新來過。 [02′12″]</p>
<p>   我們可以理解為:啊!那沒關係,他是佛菩薩。但是他也要喝水、要吃飯,到了三千八百米的地方......。像我們以前去西藏求法聽經,有一次有一個藏人,他待過三千多米的地方。當我們開車到下一個寺院的時候,就會開到五千米的地方,他說:「我就不相信會有高原症!」所以他就從車裡下來,找一個路口的地方就開始跳,他說:「我是常年經歷過高原,我不怕!」就開始跳、跳、跳......,跳、跳,他嘴張著就不說話了,因為已經講不出話也喘不出氣來,完全處在空白狀。後來旁邊的人就去幫他,發現他不行了,如果他再跳下去可能就得送醫急救了。其實他本身是個藏人,他說:「你們這些平原來的為什麼會有高原症?」他不太理解,說我跳給你們看,結果到五千米的時候,他發作了高原症。我們都沒發作,他發作了,為什麼呢?因為膽子太大了,他在那兒跳! [03′11″]</p>
<p>   那一次不知道是不是在五臺山,我也經歷了那樣一個很高的高原。那時候幾乎是沒法思考問題,耳朵會自然耳鳴,出來一走的時候就覺得好像是眩暈狀,往前走的時候好像是在轉圈一樣,走兩步有的人沒辦法就直接躺在草地上了,旁邊都是野花,還有露水,就直接躺下去。為什麼呢?因為他就是極度地眩暈。以前我也看到有人去拉薩之後,在屋子裡走那個走廊而已,他要把手張開像翅膀一樣,必須要兩手張開扶著左右的牆才能向前移動,不然他就隨時會暈倒。所以這個高原症的問題,會讓人非常地麻煩!然後還有劇烈的陽光,會把你的皮膚曬破,曬破了之後,再曬破、再曬破,可能就發炎。然後可能醫藥系統啊,什麼飲食習慣都不一樣、住宿的環境......。 [04′08″]</p>
<p>   大家有沒有去過聶塘寺?不知道那個時候我們參訪的和古代的一不一樣?那聶塘寺是很小的一間寺院,阿底峽尊者就駐錫在那裡。可以想一想當年他駐錫的那個寺院的規模,那麼多大上師,裡邊有好幾個王子出家,那個繁榮的力量,建了那麼大一個寺院;然後來到西藏,就住在那麼小的一個聶塘寺裡面。所以,阿底峽尊者如果是為了自己能夠享一點福,他完全不可能離開印度來到西藏。 [04′39″]</p>
<p>   有在聽嗎?我們現在只看到師父說:「<p> 錯的改過,不圓滿的圓滿......如日中天維持了很久。<p> 」這幾個字就這樣看過去,要想他隻身來到這樣一個地方,達到這樣的一個成就,他要付出怎樣的代價?大家可以設身處地地想一想。這樣想一想之後,才知道阿底峽尊者是用什麼樣的一個心來到了西藏。 [05′09″]</p>
<p>   現在我們只能看到佛教史留下這些記載,但阿底峽尊者到底受了多少苦?沒人詳細地去看一看他每一步是怎麼活過來的。所以我就發願:等到法師翻譯完了稍廣一點的《阿底峽尊者傳》,我一定要好好講一下!要讓我們記得阿底峽尊者他振興了西藏佛教,然後現在傳給我們。我們好好地珍惜!好好地努力! [05′40″]
<p>   大家好!很高興又到了研討《廣論》的時間。我們研討到這一講的時候已經快到十一月了,十月末。加拿大的楓葉都紅了,很紅!其他的有一些不知名的葉子也在秋天變紅了。我覺得紅葉就很像修行人,用功的時間越長,到了秋天的時候它綻放得越為燦爛,所以大家平常一定要好好用功,不要浪費時間! [00′32″]</p>
<p>   那麼在研討之前我們可以調整一下自己的意樂,把自己從平常的續流中稍稍轉移一下,想聽法的機會非常地難得!那麼為了什麼樣的目的和結果我們要聽法呢?就是為了把如虛空般的如母有情從六道輪迴的這個苦海中救出來,救到一個成佛的彼岸去,所以我們現在要種成佛的因;因就要先知,知道因的話就要聽法,所以聽法的時候就要端正自己的意樂,並且要儘量地斷除昏沉和散亂、器倒覆等等,就可以開始學習了。 [01′18″]</p>
<p>   那麼今天我們要學習的部分,是阿底峽尊者「<p> 於聖教所作事中分二:<p> 一、<p> 於印度所作事理,<p> 二、<p> 藏中所作事理。<p> 」我們前面學過了第一段,下面我們再來聽第二段,聽師父的帶子。 [01′37″]</p>
<p>   那麼最後我也說一兩個簡單的這個故事,來說明一下,用這個事例引發我們對他的認識。當年呢,譬如說以印度這個情況來說,那蘭陀寺的大善知識有好幾十位,好幾十位,像大明杜鵑論師、像阿嚩都帝等等。還有呢,對,現在想起來了,現在我們目前有一本很流行的書——《密勒日巴尊者傳》,我想很多人看過這個書。這個密勒日巴尊者是西藏人,他這個老師馬爾巴尊者是西藏人,然後馬爾巴尊者到印度去求法的,他這個老師帝洛巴尊者,那個尊者成就非常高,他是印度人。那個帝洛巴尊者,就是阿底峽尊者老師之一,喔!不是帝洛巴,那洛巴尊者。帝洛巴是這個那洛巴尊者的老師。這個那洛巴尊者自己本身,他也是印度一個國家的王子,王子,然後呢他不願意在家,不願意在家,想盡辦法出家,最後居然被他出成,他也是絕頂聰明。然後呢學的東西也是,同樣的是在世間的學問上面,出了家以後在佛法的教理上面,也可以說雄霸當時,這樣了不起!他最後呢見到他的老師以後,在證量上面也達到最高的程度。<p>   當年在阿底峽尊者印度的時候,有這樣成就的人好多、好多!結果啊,嘿,在所有的這些老師當中,他幾乎一一都學遍了,他所有的老師的長處,阿底峽尊者都有,最後呢他卻是代管印度所有大廟的鑰匙——宗主,你可以想之,這個只是在自利。 [03′43″]</p>
<p>   我們先聽到這兒。師父在介紹阿底峽尊者對聖教所作的事業之中,在這裡邊講到了阿底峽尊者的老師。大家可以看到大明了杜鵑啊、阿嚩都帝啊,還有那洛巴尊者,都是佛教史上赫赫有名的大上師、了不起的大成就者,阿底峽尊者就是這些赫赫有名的上師們的弟子。 [04′12″]</p>
<p>   我們可以看到阿底峽尊者不可思議的成就,但是也會看到他追隨善知識的辛苦的路程,比如說去參訪金洲大師,就是我們都眾所周知的一個例子。在這裡邊說:他所有的老師的長處阿底峽尊者都有,比如說金洲大師修菩提心、成就菩提心,尊者就十二年不離不棄,一直辛苦地在那邊學。歷史上留下來這樣的記載,可能也還有沒記的,我們也不知道。總之,一個非常了不起的成就者,他首先是那些非常了不起的上師們的虔誠的弟子,一個不會作弟子的人也不可能成為一個了不起的上師,因為他沒有經驗作一個弟子的話,也沒法教弟子們怎樣作弟子。 [05′12″]</p>
<p>   說:「<p> 所有的老師的長處,阿底峽尊者都有。<p> 」過去生就可能都忘了,在這一生修行的人都知道,如果你曾經認真地或者正在非常認真地依止自己的善知識,你一定會清晰地發現自己的善知識那些非常超勝的功德。那些超勝的功德,有的時候是自己可望不可及的,但是要腳踏實地地去跟著學,還有一些可能是沒有發現。那麼就我們能夠看到善知識功德的部分要想想我們自己,阿底峽尊者這樣地示現,就是為了教育我們、教導我們要好好地實踐依止法。 [05′55″]
<p>   師父他就非常強調佛法一定要結合內心、向內調伏。向內的調伏其實也最主要的被戒定慧三學所攝,大家都知道調伏這顆狂心,一定要用戒律鉤住那個瘋狂的馬,用戒律之繩鉤住它,接著再用禪定的力量壓伏它,最後才用智慧寶劍把它的根本拔除掉。所以像師父就特別強調一個修行的次第,比如說《菩提道次第廣論》,將一個補特伽羅成佛的修行次第全部都編排在一起,然後他自己是非常認真地在沿著這個道次第修行,引導弟子也是這樣做的。 [00′49″]</p>
<p>   要向內調伏煩惱,就比如像我們餓了需要食物,如果肚子很餓的時候做了很多美味大餐,但是不吃的話,對止息饑餓是毫無幫助的。會做美味的食物,就好比是能夠清楚地了解教典的內容;對這些完全不去做修持的話,就好像會做好吃的食物,做好了卻不食用,如果不吃的話是沒有幫助的。那麼用抉擇慧觀察,了知何者是、何者非,然後各別去分別判斷之後,全部要集中起來化作自心的修持。 [01′30″]</p>
<p>   那麼什麼叫修持呢?就是能夠壓伏自心的煩惱勢頭,成為對治煩惱的一個方便。像在大大小小的境中,師父都會提醒我們歷事練心,就是要對境調伏煩惱。師父常常說:「你能騙得了別人,是騙不了自己的。」自己的那個功夫到什麼程度,調伏煩惱的力度就是那樣子。所以師父在向內調伏、壓伏煩惱的這個宗風,也非常合乎於道次第的「一切至言現為教授」,就是全部都可以拿來向內調伏。在師父修行的示現中比比都是這樣的例子,這是在師父的功德之中非常耀眼的一個! [02′19″]</p>
<p>   另外師父的生活非常地簡樸,也非常希望僧團的法師們少欲知足,尤其是對於高科技產品的強力防範。現在我們僧團也在延續這個宗風,就是儘可能不用的就不用,然後把精力用在教典上、用在研究三學、向內調伏,甚至是承事大眾。這一點師父的教授是非常、非常明晰的。 [02′50″]</p>
<p>   那麼還有像仁波切的教授之中,恭敬僧的這個部分就是非常顯耀的!你可以在很多、很多的事例中,看到他實踐皈依學處,就是恭敬僧的這個部分。因為仁波切也常常教育我們說,恭敬僧就是從身邊的人開始恭敬——如果你身邊都是出家人的話,你就要從身邊的人開始恭敬;不是眼前的僧眾在眼前都不去恭敬,然後去恭敬天邊的、不認識的出家人,就是你熟悉的這些人! [03′23″]</p>
<p>   像我就有幸親眼得見在那些年齡很小的沙彌面前,如果上師他去供僧的話,他都是跪下來。他是一個大上師了,就像有一些弟子說:「啊,上師您是我的頂嚴!」但是他會在可能看起來很小的沙彌面前跪下來,然後把那個鉛筆呀什麼都捧過頭頂來給他們。有一次到了一個寺院,那個寺院天色已經漸晚了,一群小沙彌圍成一圈在背經,仁波切在很遠的地方他就開始對他們大禮拜。那個有點夜色,如果不是跟在旁邊是有點看不清楚他是誰,沒人知道他是誰。他走在我們這個隊伍的最前面,他就直接磕大頭,禮敬那些正在背經的小沙彌。 [04′14″]</p>
<p>   還有我的善知識,我也曾經看到我的另一位上師,他絕對不會從出家人的鞋上邁過去!這個以前我有給你們講過,不知道還記得否?就是我的上師的上師叫他,他正在給我們上課,他馬上就要去見他的老師,在樓上,可是門口有很多出家人的鞋子,他就彎下腰來——那時候他的腰腿是不怎麼好的,正在治病——他彎下腰來,用飛快的速度把那個鞋非常恭敬地撥到兩側,其實他一步是可以邁過去,他沒有選擇邁,然後留出一條小路他自己走過去。邁著非常急促的步子走過去,但是非常恭敬地撥開了出家人的鞋子。 [04′56″]</p>
<p>   這些鏡頭,作為弟子的我看了之後都會深深地刻在自己的心中,上師是怎麼樣示現的,弟子就要如是地行。所以在這一段中,看到了阿底峽尊者把他所有的老師的長處都學會了,這是一個何等的修行!像我們的善知識那麼多的功德,我們一個都學不會,拼死拼活地都很難學,所以這是何等了得的事情! [05′26″]
<p>   好!接下來我們要繼續向下聽師父講阿底峽尊者的利他方面。<p>   利他方面,有一點事情:那個西藏這個佛法,因為那個菩提光,那個是藏王,兩代要想振興佛法,到印度去請。那麼,說印度真正成就的人很多,你譬如像剛才這個那洛巴尊者,但是說真正要想圓滿能夠把這問題徹底解決振興佛法的,那也只有這個人。哪一個?阿底峽尊者。大家就想去請,但是印度人一聽見有人來請的話,喔,那個消息馬上封鎖。不但是廟裡面,裡裡外外、上上下下大家都封鎖。一曉得這西藏人來了,就「好了!」在他面前絕不開口。居然找了很多年,請得去的人找了很多年,找不到阿底峽尊者在什麼地方;實際上阿底峽尊者就在眼前,碰見了誰都不告訴他誰是阿底峽尊者。可想而知,這個人在印度人心目當中地位之高,地位之高! [01′14″]</p>
<p>   最後終於被他認識,然後要去請的時候,當時不知道哪一個廟,我現在忘記了,這個廟裡的那個大上座,尸羅寺還不是哪一個寺,那是印度最大的一個大廟。大廟這個上座就給那個來請,希望邀請阿底峽尊者的那個西藏人說,他說:「你要曉得,我們印度是佛教的宗主國。」這話怎麼講呢?「就是佛在印度出生的,而且圓滿的教法都在這裡,所以它維持這個宗風是非常重要的。如果阿底峽尊者一走的話,我們那個印度的佛法就完了。」那個時候有這麼多了不起的大善知識,居然說阿底峽尊者一走的話,這個印度的佛法就完了!你想像,你可以想像阿底峽尊者何等了不起! [02′12″]</p>
<p>   在這一點我們想不通,這怎麼可能?譬如說,我們眼前一個廣欽老和尚,或者李老師,喔唷!很了不起,但是算算的確不如阿底峽尊者。然後歷史上面天台智者大師、慧思禪師,都是很了不起,居然一個人,像這樣的人留在這裡,沒有辦法把那個教法圓滿。所以你可以想像得到阿底峽尊者,在印度自利、利他方面的成就,這是所以為什麼人家尊他為「能仁第二」啊! [02′47″]</p>
<p>   在這一段裡可能大家要了解:其實把阿底峽尊者請到西藏是一件極為艱難的事情,菩提光王為了請阿底峽尊者所付出的一切。到了印度之後,誰也不告訴去請的人誰是阿底峽尊者,所有的印度人都在保護阿底峽尊者,凡是知道阿底峽尊者的都不希望他被請到西藏去,所以可以想像這個求法的艱難程度啊!就是沒有人支持你、沒有一個人肯幫忙你,都在阻攔你,應該是這樣的吧!所以連個消息都不知道。你想想!這是非常艱難的事情,說碰到了誰,都不告訴他誰是阿底峽尊者。師父在這個事例上得出說:「<p> 可想而知,這個人在印度人心目當中地位之高,地位之高!<p> 」應該說捨不得阿底峽尊者離開印度。 [03′57″]</p>
<p>   然後又舉了說:「<p> 印度是佛教的宗主國......就是佛在印度出生的,而且圓滿的教法都在這裡,所以它維持這個宗風是非常重要的。如果阿底峽尊者一走的話,我們那個印度的佛法就完了。<p> 」所以有這麼多了不起的大善知識,居然說阿底峽尊者一走,印度佛法就完了!師父又說一句,說:「<p> 你想像,你可以想像阿底峽尊者何等了不起!<p> 」 [04′30″]</p>
<p>   其實每當我讀到師父在講阿底峽尊者的時候,我就很想把阿底峽尊者的傳記好好地讀一遍。因為他在印度有這麼高的成就,印度的這麼多寺院都是奉他為宗主,這麼高的一個位置,居然被西藏人請到西藏來,我覺得這件事可能就是神話級的。 [04′59″]</p>
<p>   所以譯經院的法師從去年開始翻譯《阿底峽尊者傳》翻譯一年,現在正在大會校,就快翻譯完了。翻譯完了之後,我很想跟大家一起學一下,它比尊法師翻譯的那個《阿底峽尊者傳》的譯本要更全。我覺得我們這些學到這個教法的人,是應該銘記阿底峽尊者的悲心啊,還有他的各種功德;也很想要了解他在求法的時候、追隨善知識的時候、在修行的時候,乃至他在西藏弘法利生,都經歷了怎樣的艱辛,有怎樣的功德,很想了解這些!所以等到譯本出來的時候就給大家講。 [05′48″]</p>
<p>   可能我開始講的時候你們還沒有書,因為剛譯完我這邊可能就可以講了,會校結束之後。不知道你們會不會想了解?會不會想聽呢?我自己是很想好好學,因為那裡邊一定有很多修心的教授,很多很多可以幫到我們的現行的。比如說遇到了這個境我該怎麼辦?開始想上爬,爬不上去,遇到了這個問題、這個障礙,就是怎麼努力都上不去的時候,那些成就者在他們的傳記裡,其實都有一個很好的譬喻,或者說一個例子。然後從那個例子裡反思一下自己,可能就想到突破的辦法了。 [06′32″]</p>
<p>   有的時候由於我們讀誦佛菩薩示現的高僧、那些大成就者的傳記,可能有的時候會——有可能生起出離心嗎?因為都有可能生起菩提心啊!就是讀誦那個佛菩薩的傳記,心生撼動,然後發誓說:「我也要像他一樣!」都有可能就因為這個發心了。 [06′54″]</p>
<p>   因為阿底峽尊者的示現是很不尋常的,印度的佛教是靠他,然後西藏的佛教再次地振興又是靠他,所以這是一個不可思議的示現。在這樣娑婆世界的短短的一生中,他做了這麼偉大的成就!所以那裡邊可能有很多的用功秘笈,我們可以來結合自己好好地用心。如果能對阿底峽尊者生起一個信心的話,比如說我們背書有困難的,可能就會突破了;辯論有困難就突破了,還有一些家裡的事情、健康狀況......,當我們的心力振奮的時候,其實困難都不是困難。但是心力一不振奮的時候,所有的困難都很嚴重,甚至平常別人說自己幾句話呀,有點什麼非常小的委屈,都必須要進入那種睚眥必報的程度,必須要報復、要打個平手,甚至要壓服別人,自己才會墮入現世滿足的這個深坑裡邊,唯有積累惡業。 [07′57″]</p>
<p>   但是大善知識們的傳記,如果你去讀的話,會發現他們用非常皎潔的動機去做一切的事情,尤其在涉及到要向內調伏的時候,那是絕不留情地向內調伏的。因為他們都示現深知我愛執的過患、深知無明的過患,所有的問題都出在自己內心對境的顛倒安立上,並不是境那邊獨自顯現的那個問題。所以他一定都是把問題最關鍵的解決方案找對,不會在旁支上一直怪別人、研究這些。想要解決生命的困境,一定是在自心上解決的。 [08′38″]</p>
<p>   像認真地跟過師父修行的人都知道,師父一定會特別強調要源自內心地去調伏煩惱,什麼事情要在自心上解決。所以師父是從不說人是非的、從不說人是非,都向內心好好地調伏。那麼很認真地追隨著師父學習的時候,當自己的習氣又出來了,又開始說人家的不好,如果受菩薩戒的話就可能犯到根本墮。以什麼心啊?以名聞、利養的心幹什麼?自讚毀他,這個就是犯到菩薩的根本墮。所以平常的時候如果有這樣的習氣,老說別人不好、說自己好,覺得自己是最超勝的,其實連皈依學處也是守不好的,很多都是很麻煩的。 [09′26″]</p>
<p>   我們很多毛病在學習佛菩薩的傳記,或是在學習經典的時候,就是世間也有一句話嘛!說很多惡習,在每天閱讀好書的狀態下,就像烤麵包的油一樣,老是烤、烤,它就化掉了,不會那麼堅固地在自己的心續裡一直長的,它也不是常法,這緣起之法是可以對治掉的。 [09′48″]</p>
<p>   我抱著很高的熱望,希望能夠跟大家一起好好地學習《阿底峽尊者傳》,也希望你們能夠好好地希求,因為翻譯這本書並不容易,大家都是在很忙的時候拼命地把它譯完。尤其是現在又開了那個學習止觀的課程,譯經院的法師們又要開始翻譯《四家合註》的止觀部分,都是很忙的。那麼這些忙碌的所有的一切,如果大家都能夠認真地學,能用來調伏內心,能夠增長善、遏止惡,在我們這個有限的一生中把自己生命的暇滿的義大發揮到極致,那再辛苦點不是也很開心嗎? [10′30″]</p>
<p>   所以禮敬傳承祖師!禮敬付出了這麼大的艱辛來到了西藏,把教法傳持給我們的阿底峽尊者和所有的善知識們! [10′43″]
<p>   今天我們繼續學習阿底峽尊者的傳,我們要看《四家合註入門》。請大家把書翻到 96 頁,看第 2 段。<p>   接下來是介紹尊者的傳記,是語王尊者的箋註。「<p> 往昔勝者降世之時,於王舍城中示現長者相,名曰賢護菩薩。以卓壟巴云:『於勝者前名佛子賢護。』<p> 」說阿底峽尊者在過去導師佛薄伽梵降世的時候,於印度王舍城受生為示現長者的賢護菩薩,這是尊者多生以前的一世。這個說法不僅僅是噶當派的卓壟巴大師這樣說,綽普譯師也這麼說。這上面就是語王尊者的註釋。 [01′09″]</p>
<p>   接下來,正文說:「<p> 即是大阿闍黎迪邦嘎惹師利迦那,別諱共稱勝阿底峽。<p> 」這就是覺窩傑的名諱。那麼迪邦是什麼意思呢?就是「<p> 為燈<p> 」,嘎惹就是「<p> 為作<p> 」,師利就是「<p> 為吉祥<p> 」,迦那就是「<p> 為智<p> 」,即為吉祥燃燈智,另外的名號就是阿底峽。阿底峽是什麼意思?有幾種說法:有人說阿底峽是天尊菩提光王取的名號,印度是沒有人稱「阿底峽」的。西藏國王天尊菩提光迎請尊者至西藏後,尊稱為阿底峽,於是奉上「超勝」的名諱。可是語王尊者的箋註裡說到:「<p> 此中有上師謂由具增上意樂,故名曰阿德雅峽<p> 」,因為具有清淨的增上意樂的緣故,所以稱為阿底峽。這又是一種說法。 [02′26″]</p>
<p>   下面還有一種,說:「<p> 眾聲明論師謂為至極寂靜之義<p> 」,就是聲明學者們認為是指相續非常地寂靜,所以稱為阿底峽。但是宗大師怎麼樣認為?宗大師不是這樣說的,箋註說:「<p> 然如傑仁波切云:『傳稱最勝三百十』<p> 」,宗喀巴大師的承許是「超勝」的意思。因此語王尊者認為應該依宗喀巴大師的說法,所以「<p> 阿底峽應為超勝或殊勝之義<p> 」。這是介紹阿底峽尊者的名諱的意思。 [03′18″]</p>
<p>   那麼接下來我們就看 97 頁的下面,說:<p>   <p> 其殊勝,分三:<p> 一、<p> 圓滿種中受生事理;<p> 二、<p> 其身獲得功德事理;<p> 三、<p> 得已於教所作事業。今初:如那措大譯師所造《八十讚》云:「<p> 金剛座之<p> 東<p> ,有廣大境域名邦伽羅,其境域之支分中,有諸印度人稱為薩賀,藏語中稱為<p> 撒賀<p> 之<p> 勝境,<p> 此說與《種敦巴遊記》所云:『印度東方撒賀境,有城名為邦伽羅』及『周有十萬戶』不同。然《洛札巴窩教法史》中亦作前說,《桑郭瑪遊記》等似與彼同。此復,種敦巴所造〈傳記祈請文〉有『富饒之地邦伽羅,貴冑撒賀王種姓』之說,亦與前同。此為箋註探疑。<p> 其<p> 境域<p> 間有<p> 諸多<p> 大城,<p> 其中最大者乃〔<p> 比<p> 為儼然,<p> 札瑪尼<p> 為次第,<p> 布<p> 惹<p> 為城<p> 。<p> 〕傳稱其與卡切次頓相當,其中有兩百四十或兩百七十萬戶,此讚下文即云:<p> 廿七十萬戶。<p> 其中有<p> 稱為<p> 王都<p> 之<p> 宮殿極廣博,<p> 此宮殿<p> 名為有金幢。<p> 傳說當今名金頂者即此。遊記中有謂:『印度東方薩賀境,有城名為邦伽羅』云云,故應觀擇。<p> 受用位饒盛,等支那東君。<p> 此義或謂有象黃之象名為君,千象之中方得其一。彼王有此象千頭,故為至極富饒之義。有謂於千輻金輪之一一輻上,各置一饌,來奉王前,轉動其輪,王但能噉其前之食,不堪更食,故名為君。雖見眾說,然余勝上師云:『支那國王名曰東君者,實命名者隨意立號,更無餘因;如稱光王及燒熱性為火,亦別無他由也。』<p> 其國王善勝,妃名吉祥光。父母有三子,<p> 太子<p> 名蓮藏<p> ,次子<p> 月藏,並其<p> 幼子<p> 吉祥藏。王<p> 太<p> 子蓮華藏,有五妃九子。長子福吉祥,現時大善巧,稱為陀那喜<p> 吉祥米札,為近事班智達,通曉一切波羅蜜乘教授<p> 。<p> 三子中<p> 幼子吉祥藏,苾芻比<p> 惹<p> 贊札<p> 精進月<p> ,<p> 有說此師善巧密咒教授,能化出真實壇城。曾赴藏地,於堆隆措昧施降冰雹,後至雅隆。於昂雪之龍寺示寂<p> 。<p> 善勝<p> 次子月藏者,即現至尊<p> 覺窩<p> 師。」<p>  [07′04″]</p>
<p>   接下來我們看,我上面唸這一大段的仁波切的講記。每次拿起《四家合註入門》的時候,我都會覺得我們的書是印得非常好的。我很早的時候去香港請經典,在香港哪一家書店我忘記了,看到了和裕出版社出的經典,哇,實在是太精美了!當時我就發願說:以後我要印經印成那麼精美的。等到《四家合註》和《四家合註入門》開始印的時候,比如說字紙有好幾號顏色的選擇,然後字體確定為什麼顏色......。還有我們這本書一開始有宗大師的像,還有仁波切的像。仁波切的這個像,就是在為我講《四家合註》的時候拍的,都非常地有紀念意義、有加持力。所以大家要好好地珍惜這本《四家合註入門》這個解釋的問世,要拿來看、拿來拜讀,依教修行。 [08′13″]
<p>   好!接著我們下面看仁波切的解釋:無論是稱呼為具德燃燈智,或者稱呼為阿底峽都是可以的,這位上師的名稱已遍揚於大地。他的殊勝分三個科判:「<p> 一、<p> 圓滿種中受生事理;<p> 二、<p> 其身獲得功德事理;<p> 三、<p> 得已於教所作事業。今初:如那措大譯師所造《八十讚》云<p> 」,覺窩傑的傳記,宗喀巴大師主要是依著那措大譯師所造的讚文來講述的。說印度「<p> 金剛座之<p> 東<p> ,有廣大境域名邦伽羅,其境域之支分中,有諸印度人稱為薩賀<p> 」,指邦伽羅當中的一個小地區的某座城市的名字,印度人把它叫做薩賀。「<p> 藏語中稱為<p> 撒賀<p> 」,撒花的撒,撒賀。<p>  [01′05″]<p>   「<p> 此說與<p> 」覺窩傑的弟子「<p> 《種敦巴遊記》所云:『印度東方撒賀境,有城名為邦伽羅』<p> 」講得不太一樣,這裡邊的撒賀和邦伽羅正好是顛倒過來的。因為以現在我們的說法,邦伽羅是一個國家,薩賀是這個國家的城市。這段是妙音笑大師的箋註,也提到了很多說法,這是其中一種,就是這個國家的名字和城的名字說法不一。「<p> 及『周有十萬戶』不同<p> 」,現在的說法在前面箋註裡提到邦伽羅的地方,有座撒賀城,和這句邦伽羅被十萬住戶所圍繞的說法不同。「<p> 然《洛札巴窩教法史》中亦作前說<p> 」,所以應該以這個為是。那麼還有「<p> 《桑郭瑪遊記》等似與彼同<p> 」,這應該都沒有漢譯本,是不是?都沒有漢譯本的。這個《桑郭瑪遊記》也跟這個一樣的。 [02′11″]</p>
<p>   接著仁波切說:無論如何,妙音笑大師說在種敦巴尊者的說法裡面,邦伽羅是國家、撒賀為城市的說法也是可以的。為什麼呢?因為「<p> 種敦巴所造<p> 」覺窩傑「<p> 〈傳記祈請文〉有:『富饒之地邦伽羅』<p> 」,這個地方是邦伽羅;「<p> 貴冑撒賀王種姓<p> 」,撒賀王就是指撒賀城的國王。 [02′41″]</p>
<p>   那麼接下來就是請問了,我就收攝一下。大家可以看一看,關於這一小段,主要是宗大師依據那措大譯師所造的《八十讚》。《八十讚》在這本《四家合註入門》印出來的時候,還沒有翻譯。最近譯經院的法師已經把它翻完了,是如法法師主譯,還沒有出來,以後大家可以拜讀。 [03′09″]</p>
<p>   依著那措大譯師所造的《八十讚》,這裡邊引了《種敦巴遊記》,還有什麼?《洛札巴窩教法史》、《桑郭瑪遊記》,還有一個〈傳記祈請文〉,對吧?依據了這麼多來討論這個地方。所以可見寫《四家合註》的祖師們是一個地方都不能馬虎的,他非常嚴格地去找尋各種依據,就像現在我們討論到一個問題的時候,通常一個問題的探疑,有的時候一兩個月、半年都也進行不下去,原因就是有各種說法。能不能閱盡天下的書呢?通常還是不知道哪裡還有不同的說法,只能就現在已經出現的這些版本去找它的依據。 [04′04″]</p>
<p>   綜上所述,仁波切在 100 頁說:最後認為可靠的說法,覺窩傑出生在邦伽羅境內的撒賀王種姓——邦伽羅是個國,撒賀是個王種姓,這個是種敦巴尊者的第二種說法。除了種敦巴尊者這樣說,像妙音笑大師、巴梭法王,這三位的承許都是一樣的。那麼那措大譯師的讚文之中也說:「<p> 東撒賀勝境,其間有大城。<p> 」這個問題大概就這樣交代完了。這是交代什麼地方啊?就是阿底峽尊者的出生地。對不對?他出生地是哪裡呀?邦伽羅。對吧?邦伽羅境中的撒賀王種姓。 [04′57″]</p>
<p>   在那措大譯師對大覺窩的讚文中說:「<p> 東撒賀勝境,其間有大城<p> 」,在這當中最大的城市是「<p> 比札瑪尼布<p> 惹<p> 」。這裡邊有巴梭法王的一個箋註,說:「<p> 傳稱其與卡切次頓相當<p> 」,這個「卡切次頓」也是一個城市,「卡切」就是喀什米爾的意思。在喀什米爾有一個名叫「次頓」的城市,這個大城與次頓城大小相同,其中有多少戶居住在那裡?說:「<p> 有兩百四十或兩百七十萬戶<p> 」住在那兒。接下來看紅字:「<p> 此讚下文即云:<p> 廿七十萬戶<p> 」,在那措譯師所造的《八十讚》中也有說,有兩百七十萬戶。那個城還是滿大的。 [05′52″]</p>
<p>   然後提到:「<p> 其中有王都,宮殿極廣博。<p> 」現在注意!先進了一個大城,看了一下這個城市有多少萬戶的居民,接著該去看這個王宮。在這個城市的中間,「<p> 稱為<p> 王都<p> 之<p> 宮殿極廣博<p> 」,就是這個宮殿可以用廣博形容,是非常大的宮殿,可能占地面積很大。這個宮殿有個名字叫「有金幢」。接著巴梭法王的箋註說:「<p> 傳說當今名金頂者即此<p> 」,就是這個宮殿又稱為金頂。然後巴梭法王在此引前面種敦巴尊者的《遊記》為註:「<p> 遊記中有謂:『印度東方薩賀境,有城名為邦伽羅』云云,故應觀擇。<p> 」說巴梭法王認為這裡的城市、地域沒有各別說清楚,所以要再再地觀察。 [06′56″]</p>
<p>   所以談到歷史的話,如果記載的各家說法不一樣,這個事情就成為了一個謎,請大家探索。但是每一個學法者都遵從上師的看法,上師抉擇按照誰的想法,就是按照誰的想法。現在我們從這個城的記載,可以看到它這個王都占地遼闊,有非常大的宮殿。它的王宮叫什麼呀?叫有金幢,對吧?還有說當今名金頂者是也。 [07′29″]
<p>   接著應該再介紹這個王宮的主人,就是國王。這個國王「<p> 受用位饒盛,等支那東君<p> 」。講到支那東君了,支那東君是什麼意思呢?又有很多說法,巴梭法王的箋註裡就有很多。說這個國王的地位和支那的國王一樣。什麼是「支那」呢?藏語的「支那」和「支嘎」中的「支那」,現在我們指的就是中國。關於「東君」也有很多疑點、有很多說法,有人說「東君」是漢語,就是「東貴」——東方的貴人,這是一種說法。還有人說是「東漢」,但這個說法時間是對不起來的,為什麼呢?因為譯師造這個讚的時候,覺窩傑阿底峽尊者進入藏區那時候大約是宋朝初期,所以應該不是「東漢」。 [00′54″]</p>
<p>   藏文裡邊「東君」的「東」,就是我們數字裡的「千」的意思。巴梭法王在這點上又寫了很多註釋。那麼現在關於「東君」到底什麼意思呢?有很多說法。「<p> 此義或謂<p> 」,說這是一種說法,並不代表絕對正確。「<p> 有象黃之象名為君,千象之中方得其一<p> 」,就是在千隻大象之中,會有一頭具象黃的大象,而這個國王有一千隻這樣的大象,所以稱為「東君」。這個說法,就是以擁有多少象來形容這個國王富饒的程度,所以稱為東君,就是指這樣的富盛。 [01′44″]</p>
<p>   有人會覺得不是這樣的,「<p> 有謂於千輻金輪之一一輻上,各置一饌,來奉王前,轉動其輪,王但能噉其前之食,不堪更食,故名為君。<p> 」又一個說法!這個說法好像有一個精美的設計,就是關於國王是怎麼吃飯的。這個國王到底有多富呢?說看看他的餐桌、是怎麼吃飯?國王的餐桌上有千輻金輪——用金子做的千輻金輪,形狀有點像千瓣花瓣那樣子,看起來是很精美的藝術品,有千瓣花瓣。那個千瓣花瓣是幹什麼呢?在每一朵花瓣上就擺放著各種各樣的美食,這樣吃一餐。這個「千」應該是一個計數詞,可能很多。 [02′39″]</p>
<p>   國王用餐的時候,這個千輻金輪還會轉,可能像我們現在的旋轉餐桌一樣。現在的旋轉餐桌已經各家都有了,那時候這個國王他的那個餐桌是金子做的,而且是像有很多花瓣構成的金輪。當那個金輪旋轉的時候,旋轉一個菜到這個國王面前。說請國王隨意享用,因此就叫「東君」。但是巴梭法王又說上面所說都不正確!聽到這裡你們會怎麼想?哇!聽得這麼高興,結果還是不對的。 [03′15″]</p>
<p>   那接下來是什麼?「所謂東君,就是這個國王的稱謂而已」,因為就是國王的一個名字稱呼他,就是最初命名者隨意取的名字,並沒有其他意思。比如說具有熱性而會燃燒的東西叫什麼呢?叫火。那為什麼叫「火」呢?不知道你們小時候有沒有問過這個問題?也沒有什麼理由,就是一個最初隨意取的名字。我們說為什麼叫「水」?為什麼叫「火」?天為什麼叫「天」?地為什麼叫「地」?還有我小時候問什麼呢?「爸爸,為什麼會叫你『爸爸』?」我爸爸就會講一堆。然後這個問題會被一直重複地問。 [03′56″]</p>
<p>   巴梭法王在這裡邊認為:這東君沒有什麼特別的意思,就是隨意稱取的一個名字而已。「<p> 然余勝上師云:<p> 」「這是國王自己的名字而已,而不是其他的意思」,這個說法也不是巴梭法王自己說的,是巴梭法王的上師告訴他的。就像我們前面說的,最後弟子還是聽上師的承許這樣傳承下來。 [04′24″]</p>
<p>   所以那麼「東君」到底是什麼意思呢?你可以想他很富,因為王宮很大、廣博。到底是有沒有一千頭大象呢?一千頭有象黃的大象;還有吃飯的時候轉動金輪;還有說就是他的名字,這幾種。你可以展開你的想像力。總之,這位國王還沒見到,就已經可以想像:哇!這是非常非常有權勢的、非常非常富貴的一個國王! [04′54″]</p>
<p>   下面就該到了國王的名字——「<p> 其國王善勝<p> 」,國王的名字為善勝。「<p> 妃名吉祥光<p> 」,王妃的名字就叫吉祥光。注意!為什麼要介紹國王和他的王妃呢?因為我們在介紹阿底峽,這是阿底峽尊者的父王和母后的名字。父母有三個兒子,就有三個王子;大兒子、大王子名為蓮花藏,次子名為月藏,小兒子就叫吉祥藏。 [05′35″]</p>
<p>   那麼大家可能想:啊,到底這三個王子中哪一個是阿底峽尊者呢?寫到這兒之後,就開始介紹太子:「<p> 王<p> 太<p> 子<p> 」就是蓮花藏,對吧?剛才有說。「<p> 蓮花藏,有五妃九子。長子福吉祥<p> 」,蓮花藏太子有五妃九子;這個太子的長子福吉祥,他是跟阿底峽尊者什麼關係呢?應該是阿底峽尊者的侄子,對吧?他的侄子。為什麼單單介紹了他呢?「<p> 現時大善巧,稱為陀那喜<p> 」,這個長子應該是一位居士、優婆塞身。傳說他非常地博學,就像班智達們所通達的那樣,無餘通曉一切波羅蜜乘教授。所以他雖然身是「<p> 近事<p> 」,他是近事的班智達,他不是出家人。那麼這個介紹了應該是國王的孫子對吧?王孫。 [06′44″]</p>
<p>   接下來要介紹善勝國王的幼子,太子介紹完了,然後就幼子。「<p> 幼子吉祥藏,苾芻比<p> 惹<p> 贊札<p> 」,是位比丘。「比<p> 惹<p> 贊札」譯為「<p> 精進月<p> 」,月亮的月。這個名字其實滿美的!精進月。那為什麼取名字叫精進月呢?不知道是不是能想像:這個月亮穿雲破霧,要給黑暗的人帶來光明,所以它很精進地一直在天空中照亮。我很喜歡月亮,所以看到精進月很生歡喜心! [07′26″]</p>
<p>   「<p> 此師善巧密咒教授<p> 」,他善巧密咒乘的教授到什麼程度呢?「<p> 能化出真實壇城<p> 」,他獲得密咒的殊勝成就,能憑著自己的能力將壇城真實地變現出來。這位精進月比丘,就是這個小王子,他之後也來西藏了,曾在拉薩附近的「<p> 堆隆措昧<p> 」這個地方做什麼了呢?他使用咒術降雹,那是表演神通嗎?大家都知道密勒日巴尊者也降雹,但是這個降雹不知道是做什麼,要以後看看《阿底峽尊者傳》。之後又到過「<p> 雅隆<p> 」,在「<p> 昂雪之龍寺示寂<p> 」,就是示寂在西藏。這是國王善勝的小王子。 [08′20″]</p>
<p>   那麼王太子介紹了、小王子介紹了,因為國王總共有三個兒子,中間的那個就是二王子——「<p> 善勝<p> 次子月藏者,即現至尊<p> 覺窩<p> 師<p> 」。二王子就是阿底峽尊者,他原來叫月藏,月亮的月。 [08′44″]</p>
<p>   到此我們可以想一下:阿底峽尊者的父母親的名諱,乃至他出生的王都有多大,國王富庶到什麼程度,國王世系的族譜,然後就出現了。你看他們家裡邊,阿底峽尊者和他的弟弟都是成就者,對吧?都是大成就者。而且阿底峽尊者和他弟弟都去了拉薩,這個可能以後在傳記裡看一看,他的弟弟為什麼去藏地的呢?還有王太子的其中一個兒子也是大善巧者,通曉一切波羅蜜多乘。所以這個王族,看來他們的王子還有王孫們很多都精通佛法,而且都不是一般的精通。可以說「<p> 圓滿種中受生事理<p> 」,這個「圓滿」二字,說「富貴學道難」,在此就不是這樣寫的了。他們很富貴,但是他們都是成就者。所以禮敬在圓滿種中受生的阿底峽尊者,還有來到西藏的弟弟。在歷史上有很多祖師都是王子出身的,對不對?所以我們要努力地修行。 [10′02″]</p>
<p>   大家可以想像一下,阿底峽尊者出生在這麼富貴的地方,在王宮裡邊,他的父親富成這樣子,但是他以後出家,到了西藏窮成那樣的一個地方。大家都知道,他最後都是住在聶塘寺,聶塘寺我們去朝禮的時候覺得是很小的,不知道阿底峽尊者來的時候大不大?看起來是很小的。所以從這樣富庶的王宮,然後經歷這樣的艱辛和挫折來到西藏,只是這個生活外境的一個轉換,他本人要跨越何等一個適應程度的艱辛,我在前一講有講過。所以越是看他「圓滿種中受生」的這個故事,你要想到他來西藏為了把教法傳持下來,應該說奉獻了他自己的一切。 [11′02″]
<p>   好!今天我們接著往下學。學到阿底峽尊者的功德,就是「<p> 獲得功德事理,分二:<p> 一、<p> 知見廣博獲教功德事理;<p> 二、<p> 如理修行獲證功德事理。<p> 」在這之前我想問大家:還記不記得講《阿底峽尊者傳》的時候,說阿底峽尊者在佛世的時候是哪位菩薩?賢護菩薩,對吧?關於賢護菩薩,可以略略地講一下。 [00′34″]</p>
<p>   在佛世的時候,他是一位在家菩薩,他還有一個名字叫善守。在隋朝的闍那崛多譯的那個《大方等大集經.賢護分》中有記載:在佛世的王舍城中,有一位優婆塞,名為賢護,為大眾中的上首,受持五戒,具足威儀,長久以來行菩薩道,往昔已曾供養無量諸佛,種諸善根,於法敬重聽聞受持。最精采的是他常行頭陀行——他是一個在家菩薩,常行頭陀行,教化諸位菩薩。他隨意可以得見一切諸佛,發廣大願行深妙行。他的菩提心非常非常地堅固,猶如金剛一樣,廣大妙行不可稱量。 [01′40″]</p>
<p>   在闍那崛多所譯的《大寶積經》中有記載:佛在王舍城時,有一個巨富長者,這位巨富長者之子就是賢護,由於往昔的福德因緣,他的身形殊妙柔軟,受用的資財跟帝釋天比,都勝過了帝釋天王。另外,還有後秦鳩摩羅什所譯的《大智度論》中說:「善守菩薩是王舍城舊人,白衣菩薩中最大。」像《般舟三昧經》,還有《大佛頂首楞嚴經》等,都有描述這位菩薩的功德。這就是阿底峽尊者的本生,就有記載的本生。 [02′34″]</p>
<p>   接下來我們開始一起學獲教功德事理和獲證功德事理。「<p> 獲得功德事理<p> 」中就分了兩個科判,一個是「<p> 知見廣博獲教功德事理<p> 」,還有一個「<p> 如理修行獲證功德事理<p> 」,在宣說阿底峽尊者教證兩種功德。一般而言,佛陀的教法不出於教證兩種正法,而覺窩傑具德阿底峽尊者具足全部的教證功德,所以成為全佛教的教主。 [03′06″]</p>
<p>   我講這些是在《四家合註入門》的 103 頁,接下來我們要往下看這一段。<p> 今初<p> 、學習共通明處者<p> :如《讚》云:「二十一歲中,善巧<p> 共通<p> 六十四,技術及一切,工處善構言,及一切諸量。」謂於二十一歲以內,學習內外四共明處:聲明、因明、工巧業明,及醫方明,善巧究竟。特如大卓壟巴云,十五歲時,僅聞一次《正理滴論》,與一黠慧戲論外道興辯,令彼墮伏,美譽遍揚。<p>  [03′50″]</p>
<p>   在一開始的時候說:「<p> 今初<p> 學習共通明處者:<p> 如《讚》云<p> 」,這個《讚》還是那措譯師寫的《八十讚》。關於那措譯師到底是誰呢?他是噶當派的祖師,在公元 1011 年到 1064 年這個中間。他本名戒勝,生在阿里地區的種迦拉東,那措就是他的族姓。出家後成為藏地有名的律師。他非常地幸運,二十七歲到印度迎請阿底峽尊者——二十七歲是有些同學完成五大論的年齡,他去印度迎請阿底峽尊者。從此如理依止阿底峽尊者十九年,並且擔任阿底峽尊者的翻譯。所以藏地現有的阿底峽尊者所傳的大部分傳承,都是透過他才獲得的,因此對藏人具有無比的恩德。 [04′58″]</p>
<p>   所以,《八十讚》就是那措譯師他寫的,是讚歎阿底峽尊者的頌文,總共八十偈。前幾天說以前還沒有漢譯,現在已經譯完了。主要是他依循阿底峽尊者的生平,描述尊者的戒、定、慧三學的成就,以及在印度西藏所作的廣大事業。 [05′21″]</p>
<p>   在那措譯師還沒有造這個《八十讚》之前,地藏班智達也曾著作過文筆類似的讚頌,所以傳言此師——有這樣一種說法,是依據地藏班智達所著的讚頌而作的讚頌,但是這是一種傳言。還有一種想法,我看到這的時候在想:因為他依止阿底峽尊者十九年,二十七歲到印度去迎請阿底峽尊者,而且擔任翻譯,所以這裡邊的「如理依止」一定是生起了很稀有的信心,在這種狀態下他對於尊者的功德一定是了解很多的。但是祖師們的作法通常都是很注重傳承,會看先輩祖師怎麼寫,然後就他理解而作的。所以無論說法如何,我們能夠看到那措譯師寫的《八十讚》——這麼親密地依止阿底峽尊者十九年的一個人,他寫的《八十讚》——會覺得三生有幸,實屬難得! [06′30″]
<p>   上次我們講到「<p> 學習共通明處者<p> :如《讚》云<p> 」,這個《讚》,和作讚的譯師。然後翻到 104 頁,看仁波切的講記,說:「<p> 今初<p> 」,就是「<p> 學習共通明處<p> 」的道理。「<p> 如《讚》云:『二十一歲中,善巧六十四,技術及一切,工處善構言,及一切諸量。』<p> 」這全部都是共通明處,無論內外道都學習,所以是「<p> 共通<p> 」的。那麼首先我們就會接觸到「六十四技術」,這裡邊說各式各樣的技術,那我給大家稍稍講一下這個六十四技術。 [00′45″]</p>
<p>   古代印度的這個藝術技能、工巧明的這個技術三十種,列舉一下:文字、手藝——不知道是不是跟中國的那個手藝是一樣的,各種各樣的手藝。數目、計算,還有梳妝,這也是一大藝術。還有步武,步伐的步、武術的武。接著好像是到了兵器的部分——使鈎,就是怎麼樣使用鈎子,舞劍,還有拋繩。 [01′20″]</p>
<p>   接下來就是射箭、前刺——往前刺,後引、砍殺、撕裂、穿戳、遠射中的、中的出聲、射中要害、射成不治——武林高手打人的時候,他都有分寸,如果你練成了功夫,把人打死是非常容易的,把人打到重傷也很容易,但是要打輕的是很不容易的,那個就是要控制你的發力。比如說想教訓一下那個欺負人的人,或者品行不良的人,但是出手不能致命或者不能造成重傷,而那個力度的拿捏通常都是非常難練的武功。所以你看這裡邊有射中要害、射成不治、射成重傷,這都有分寸。 [02′10″]</p>
<p>   接著就是跳躍、拳擊,拳擊——不知道是不是現在那種拳擊,還是古印度那時候什麼拳擊?接著賽跑,現在全世界運動大會都在進行賽跑;接著游泳。阿底峽尊者就是王子,你看,他在二十一歲以內這些全學! [02′30″]</p>
<p>   渡越,這個渡是三點水的渡,不知道是不是划船還有涉水什麼的?乘象,我們現在沒有生在有很多大象地方,大象那麼高,爬上去坐在上面,牠慢慢地走,要不掉下來可能也要練一下,可能是古代的人還要練習在那個大象上射箭,還有做各種動作。乘象、騎馬,還有造車,接著還有造弓箭、角力,共三十種。 [03′01″]</p>
<p>   在演唱、樂器的技術有十八種:演唱、樂器舞蹈;擊鼓,鼓就有這麼多——擊鼓、打腰鼓、擊小鼓、擊大鼓;還有敲鑼、彈單弦、打單面腰鼓、擊鐵鈸、擊銅鈸、彈三弦——不知道是不是跟中國的三弦一樣的?還有擊木古達鼓、鐃鈸伴奏、擊小鈸、合奏——可能是很多人要陪著王子一起練;還有彈琵琶,然後吹管樂,共十八種。 [03′41″]</p>
<p>   大家可以想想,這些要安排在一個王子的學習之中。因為他出生在皇族,可能當代最出色的老師都會雲集在王宮教他,應該這樣吧?因為是那麼有福報!光是一個射箭學完,就要很久! [03′59″]</p>
<p>   接下來到了聲樂技術七種,這裡邊有六合、仙曲、繞地、中令、五合、奮志、近聞,共七種。舞蹈技術共九種,這裡邊前面也講過舞蹈,要再分:媚態、英姿、醜態三種為身技;猛厲、嬉笑、威脅三種為口技;還有悲憫、憤怒、和善三種為心技。它分身、口、心。四種技術總合起來就是「六十四技術」。我們大家可以想一想:二十一歲以內把這麼多東西學完,非常地忙碌啊!會不會?大家覺得呢?六十四種技術都學完了! [04′43″]</p>
<p>   「工處」就是種種眾多的工巧,「善構言」就是指梵語,「量學」也是共通的,外道徒也會學量學。在二十一歲中就已經把這些——注意——全部學完了,這是譯師在讚文中說的。後面宗喀巴大師也就解釋說:「<p> 謂於二十一歲以內,學習內外四共明處:聲明、因明、工巧業明,及醫方明,善巧究竟。<p> 」 [05′16″]</p>
<p>   「<p> 特如大卓壟巴云<p> 」,在十五歲的時候就聽一次《正理滴論》,「<p> 僅聞一次《正理滴論》<p> 」——就是阿底峽尊者聽了一次《正理滴論》,就跟一個外道辯論,把外道辯敗了。 [05′31″]</p>
<p>   那麼《正理滴論》到底是一本什麼書前面我有講過了,大家有沒有記得?七部量論中有如主體一般的有三部論,對吧?《釋量論》、《定量論》,還有什麼?《正理滴論》。誰寫的啊?法稱論師,對吧?法稱論師就是二勝六莊嚴之一,他生在七世紀的印度南方。許多密續中都有授記,說他是普賢菩薩的化身,所以他所著的釋論都能夠無顛倒地闡述佛語的密意。 [06′07″]
<p>   法稱論師的父親是一個外道婆羅門,他自幼很聰明、敏捷,嫻習工巧、醫方、聲明等,還有對於外道的典籍、外道的宗義也很善巧,在十八歲的時候他就已經通達了一切外道宗義,深受諸外道婆羅門喜愛。後來有機緣聽了少許佛經,就覺察到外道的論典有諸多的非理之處,於是對聖教深生信解,他想去找他的老師,就前往依止法護論師出家了。 [00′44″]</p>
<p>   出家精研三藏,可是還是覺得意猶未足,又從善達《集量論》的自在軍論師聽過三次《集量論》。第一次聽完了之後,就完全地通曉自在軍的密意;再聽一遍的時候,就通曉了《集量論》的作者陳那論師的密意;第三次聽,就發現他的老師自在軍論師承許的是有一些錯誤的。他啟白了論師之後,他的上師非常歡喜,這裡邊寫「大喜過望」!然後就依照他的老師指示造了《釋量論》。 [01′25″]</p>
<p>   之後,他想要破除外道宗義。要破除外道宗義的話,得知道外道宗義是什麼,那時候就聽說婆羅門鳩摩羅梨羅非常善巧通達外道典籍。可是這個人他那些隱密的詞語除了他的妻兒是不傳的,所以沒辦法親近他了解外道的宗義。結果法稱論師就喬裝打扮變成了奴僕,到他們家裡伺候他們,然後勤做家務。你看看為了學習!他非常非常勤勞,深得婆羅門妻子的信任,得以請問宗義要處——就問到了那些!他一邊承侍那個外道,一方面徹底了解了外道宗義。後來就在王宮與鳩摩羅梨羅辯論,以正理廣破他的宗,結果令這個外道信了佛教了。 [02′32″]</p>
<p>   後來就有一個商羯羅婆羅門,於鹿野苑與他辯論,然後這個婆羅門就失敗了。不知道是個性太過剛烈還是怎樣,他辯敗了之後居然就去自殺了!怎麼自殺的?就去投恆河自殺,懷著不知道一種什麼樣的心情去投河自盡。隔年就投生為他徒弟的兒子,十六年之後他又長成一個小大人,又來找法稱論師辯論了,這絕對是生死之戰!結果又敗了。又敗了之後,他又做什麼?他又再度地投河。不知道是不是又去投恆河了? [03′20″]</p>
<p>   然後他又再轉世了,十二年之後,他要再跟法稱論師大戰!想想,他已經來回折騰三次了,投生、轉世這樣三次,法稱論師已經年邁了。然後年邁的法稱論師再次地出戰,結果法稱論師又勝出了!這回可能是勸他吧,我不知道那個情節是怎麼樣的,終於令他皈信了佛教,沒有再去死了,就徹底皈信佛教。大家可以想想,我為什麼要給大家講一下法稱論師何許人也?就是這樣的一個人,他的《正理滴論》! [04′04″]</p>
<p>   在這個期間,法稱論師在華嚴王的護持下,著作七部量論。窮盡畢生之力,他唯一的所求就是希望在聖教衰微的那個地方,再把聖教振興起來。由於法稱論師廣大勸發——他的廣大願,皈依佛教的僧俗將近十萬人之多。後來就在伽陵伽羅建了一個寺院,廣宣正法,令諸眾生得入善道。 [04′38″]</p>
<p>   就是這樣的一個論師他寫的《正理滴論》。阿底峽尊者聽了一遍,一遍喔!就把那個外道戰敗了,所以不是一般的聰明!這是在寫阿底峽尊者的二十一歲學習,乃至他僅聽一次《正理滴論》就把外道辯敗了這樣的一個故事。 [05′08″]</p>
<p>   接著就該到了阿底峽尊者「<p> 學習密咒之理:<p> 於其<p> 邦伽羅<p> 黑山道場瑜伽自在、親見歡喜金剛尊身、獲得金剛空行佛母授記之尊重<p> 〔<p> 羅睺羅毱多<p> ,羅睺羅隱或密。〕<p> 前,具足請受一切灌頂,立密諱為智密金剛。<p> 」 [05′31″]</p>
<p>   我們看 105 頁,仁波切的講記裡說:其次,「<p> 學習密咒之理<p> 」,就是在學習顯密兩種教法之中,有關學習密咒的狀況。在「<p> 邦伽羅<p> 黑山道場<p> 」,就是在邦伽羅城內,一座因地得名的這個寺院。那麼什麼叫「<p> 瑜伽自在<p> 」呢?就是獲得密咒的成就。然後「<p> 親見歡喜金剛,獲得金剛空行佛母授記<p> 」,都是形容他的老師,誰呀?「<p> 羅睺羅毱多前,請受一切灌頂<p> 」。阿底峽尊者這位上師的梵語名為「羅睺羅毱多」,又稱為「羅睺羅隱」或「羅睺羅密」。阿底峽尊者就跟在這位上師面前聽聞,得到喜金剛的一切灌頂。仁波切說雖然沒有說是喜金剛,但應該是這樣。「<p> 立密諱為智密金剛<p> 」,尊者灌頂後得到的密名就是「智密金剛」。 [06′27″]
<p>   接下來,「<p> 二十九歲以內,於多獲得成就師前,習金剛乘教典教授,善巧無餘。<p> 」看這綠字,語王尊者寫:「<p> 不唯於餘時處如是聽受,亦嘗於一夜中,夢從語王名稱班智達聽受十萬四百五十一部密續。<p> 」「<p> 『於諸密咒唯我善巧』,作是念已,諸空行母於其夢中,陳示眾多昔所未見密咒經函,摧其慢意。<p> 」 [00′43″]</p>
<p>   這裡邊講了像一個故事,現在先看仁波切的講記吧!「<p> 二十九歲以內,於多獲得成就師前,習金剛乘教典教授,善巧無餘<p> 」,在二十九歲前,以羅睺羅毱多為主要的上師,又從許多獲得成就的上師尊前,學習金剛乘的教典,而善巧了一切金剛乘的教典與教授。「<p> 不唯於餘時處如是聽受<p> 」,就是不僅在其他的時間、印度的其他地方聽受了很多密法;「<p> 亦嘗於一夜中,夢從語王名稱班智達聽受十萬四百五十一部密續<p> 」,就有一天晚上在夢裡邊,在班智達語王名稱尊前聽了那麼多、那麼多的密續。 [01′34″]</p>
<p>   這個語王班智達是什麼樣的一個成就者呢?我們再看一下。語王名稱班智達是印度那爛陀及超戒兩個寺院的西門鎮守者——一聽就是很厲害,是守山門的大成就者。那個時候如果有人來挑釁這個寺院的話,得有很厲害的人出去在門口跟他們辯論,因為一旦辯輸了,整個寺院就都沒有了,所以這都是赫赫有名的。他是鎮守西門的,聽起來是絕對的武林高手! [02′09″]</p>
<p>   他出生於鹿野苑的——注意——王族,依大眾部出家,法名希拉吉帝。他從哈薩班雜請求勝樂金剛成就法,然後在摩羯陀一心修持,後來於夢中親見本尊。語王名稱班智達為了驗證他是否真實地獲得了語自在成就,走到了印度那條著名的河的河邊,什麼河?就是恆河。他從一棵樹上摘下了會發出聲音並且放光的嘎惹維里樹紅花。不知道為什麼這個樹會放光還會發聲音,我一直在想這是一棵什麼樹?總之班智達摘下了這個花,然後他就拋撒到恆河上。花朵漂流數由旬之後——它開始是順著漂,漂、漂、漂,這個花朵突然開始轉向逆流而上!就有這種說法:如果你能讓一朵花或者一個缽逆流而上的話,那麼你對這個法就成就了,有這種說法。從此他每天可以了達千偈的經論文義,被稱為語王、語自在。 [03′27″]</p>
<p>   這位大善知識通達了顯密一切明處,圓滿講、論、著三種事業,又能常常地親見聖母度母為他解釋疑惑——有什麼問題是問度母的,實在是了不起!後來就受國王的邀請,鎮守那爛陀寺還有超戒兩個寺的西門,就是這兩個寺有人挑戰的時候,西門就歸他了。他常常以所獲得的財物供佛及僧,並且創立了顯密聞思修的學院。晚年居住在尼泊爾,以自修為主,偶爾會為大家講密法。就是這樣的一個成就者,他摘下的花朵會沿著恆河逆流而上! [04′21″]</p>
<p>   阿底峽尊者夢到了他,對不對?夢見從語王名稱班智達聽受了十萬四百五十一部密續。後來尊者就想了一個念頭:「<p> 於諸密咒唯我善巧。<p> 」「應該沒有人比我更善巧密咒了,因為聽聞而且獲得了如此眾多的密法,在這世上還會有第二個人嗎?應該不會有了吧!」示現生起了慢心。然後空行母做了什麼呢?「<p> 諸空行母於其夢中,陳示眾多昔所未見密咒經函,摧其慢意。<p> 」不是在夢裡得了很多傳承嗎?空行母又在夢裡給他看了太多、太多完全沒有見過的密咒經函,降伏了慢心。於是尊者示現知道自己於密法尚未修學究竟,心中的慢意也就被降伏了。 [05′13″]</p>
<p>   至尊度母曾經對他說:「在人間現有的密咒,僅像是馬的毛端這麼多而已,密咒的經函典籍大多是在龍宮以及天界裡邊。」說假如整個密法的教典是一匹馬的話,那麼人間所存的密法只有一匹馬身上的一根毛,而且是毛尖那麼大!但是他認為對於人間所擁有的密咒而言,已經是沒有比他更善巧的。後來阿底峽尊者到了西藏的桑耶寺,在桑耶寺的藏經閣裡見到了很多的梵文典籍,當中最驚訝的是,有很多阿底峽尊者在印度的時候都沒有看過的梵文本,居然在西藏的桑耶寺裡看到了!所以他就說:「哎呀!心裡從未想過西藏會有這麼多密法的經論,在印度也從沒有看過這些教典,這除非是蓮花生阿闍黎用神通從天界或者從龍宮請回來的,否則是不可能有的。」 [06′21″]</p>
<p>   不知道現在的桑耶寺裡面還有沒有那麼多梵本的典籍?想一想阿底峽尊者看到那些典籍的時候,可能會特別、特別地驚喜和珍惜吧!我們以後在學阿底峽尊者傳的時候,應該會有寫到這一段吧!我們可能可以更詳細一點講,敬請期待! [06′45″]
<p>   今天我們繼續向下學習阿底峽尊者的功德,請大家把《四家合註入門》翻到 107 頁第一段,大家可以跟我一起看文。 [00′15″]</p>
<p>   <p> 此後尊重及諸本尊,若寤若夢,隨其所應,勸云若出家者,則於聖教及諸眾生起大饒益。依是勸已,如《讚》中云:「共稱汝親教,為加行道者。」隨請<p> 〔<p> 大眾部持律上座,<p> 以其受四根本部中大眾部軌近圓戒,故作是說,非是真大眾部,以言其獲加行道及證空性故。〕<p> 得加行道一分真實<p> 名證所取無自性<p> 三摩地者,厥號<p> 〔<p> 希拉惹喀大<p> 戒護或戒鎧。〕<p> 為親教師而正出家,其諱又名勝燃燈智。<p>  [01′14″]</p>
<p>   現在我們看仁波切的講記,「<p> 此後尊重及諸本尊,若寤若夢,隨其所應,勸云若出家者,則於聖教及諸眾生起大饒益。依是勸已,如《讚》中云:『共稱汝親教,為加行道者』<p> 」。「此後」就是從那以後,許多上師與本尊,不論是親見的或者在夢中看到的,都勸阿底峽尊者要出家。為什麼呢?因為如果出家,會對聖教及眾生有廣大的利益,於是尊者就出家了。 [01′54″]</p>
<p>   在這裡邊可以說介紹尊者出家因緣。尊者出家因緣非常地奇特,沒有寫對三界生起厭離怎樣怎樣,他是本尊和上師勸出家的。理由是什麼呢?「如果出家,會對聖教及眾生有廣大利益!」很顯然這個理由一定是深深地撼動了尊者的內心,因為他是王子,不出家就有在家的一份事業,出家就是對聖教及眾生有廣大的利益。所以看來阿底峽尊者雖然貴為王族,他非常聽從上師的教誨,他出家因緣是這樣的。 [02′41″]</p>
<p>   接下來,「<p> 以其受四根本部中大眾部軌近圓戒,故作是說<p> 」,四根本部就是:說一切有部、大眾部、上座部、正量部。我給大家稍稍介紹一下四部。四根本部是佛陀原來的一個僧團,在佛陀圓寂之後分出了四個部派,這個知道吧?上座部、大眾部、正量部,還有什麼?說一切有,總共四部。 [03′11″]</p>
<p>   上座部因為他的上座都是聖者種姓,所以稱為上座部。它是由迦旃延尊者傳授的,主張滅盡定時有心、無顛倒識、經過十無數劫乃至三十無數劫以內可以成佛——這無數劫可以理解為阿僧祇劫。是用畢舍遮語——顛鬼語誦經。這每個部派誦經的語言都是不一樣的。他的袈裟用五幅以上、二十一幅以下,袈裟上有什麼呢?有海螺為標記。比丘的名字後面就加上了生處或者是鎧甲,生處就是出生處。這是上座部。 [04′00″]</p>
<p>   接著到什麼了?大眾部。因為在前期的僧團,阿羅漢以外大部分的僧眾因為一種什麼原因就再另組一個僧團,所以稱為大眾部。大眾部是由大迦葉尊者傳授的,是用巴利語誦經。比如說要是中國的話,各個省、太多省的都不一樣。我發現他誦經使用的語言都不一樣。就像四川人就喜歡跟四川人在一塊誦經,如果四川人跟山東人在一塊誦經,可能語言都是不一樣的。大眾部是用巴利語誦經,袈裟的製作也是不一樣的,原來上座部袈裟是五幅,大眾部的就是七幅以上到二十三幅以下,它中間有一個這樣的規則;袈裟上是以吉祥結和海螺為標記。這是大眾部。 [05′00″]</p>
<p>   接著到正量部,藏文義譯為眾敬部,就是眾人尊敬的意思,因為受眾人恭敬,所以稱為正量部。我在想:其他部派不受人恭敬嗎?這個是請問一下。它是由優波離尊者傳授的,主張有不可說的我、一切所知攝為可說與不可說兩種。是用阿婆商夏語——訛誤語誦經。袈裟條幅與上座部相同。比丘的名字上座部是加出生地和什麼?鎧甲,對不對?他的名字後面加上了「民」或者「部」——民眾的民,或者部派的部。 [05′44″]</p>
<p>   接下來該到了說一切有部,全名其實為「根本說一切有部」。也有說其他部派都是從這個部派演變而來的,所以稱為根本;宣說色、心、心所、心不相應行、無為法等所知五事為實有,所以稱為「說一切有」。它是由羅睺羅傳授的,主張三世實有、諸有為法為剎那性,經過三無數劫,也就三阿僧祇劫可以成佛。是用梵語,就是天語來誦經。袈裟就用九幅以上、二十五幅以下,以法輪及蓮花為標記。比丘的名字後面加上了吉祥、賢善或心要。這就是四個部派。 [06′38″]</p>
<p>   我們可以清晰地看到四個部派他們誦經的語言是有差別的,都是由這些阿羅漢傳授的。所以普同恭敬就是了,要頂禮這些比丘們。為什麼介紹了這四個部派呢?因為要介紹阿底峽尊者的老師,對不對?「<p> 以其受四根本部中大眾部軌近圓戒<p> 」,誰受大眾部近圓戒?是不是阿底峽尊者的老師?現在都在介紹他的老師。在仁波切的講記裡說,雖然根本四部全部都是聲聞部派,但是尊者的親教師戒鎧,就是剛才說那個希拉惹喀大——戒護或戒鎧,他不是入聲聞部派,只是用小乘他們的宗規出家受取近圓的律儀而已,並不是從大乘往下走、趣小乘了。 [07′36″]
<p>   今天我們來繼續學習《四家合註入門》,在 107 頁的下面。所以在這裡邊說:「<p> 非是真大眾部,以言其獲加行道及證空性故。<p> 」為什麼說他不是真實的大眾部呢?接下來又說:「<p> 隨請大眾部持律上座,得加行道一分真實<p> 名證所取無自性<p> 三摩地者,厥號希拉惹喀大<p> 戒護或戒鎧<p> 」。 [00′34″]</p>
<p>   現在就涉及到阿底峽尊者的這位親教師的證量為何呢?說他是到加行道。那現在我們就要了解一下,在這裡邊仁波切的解釋:加行道有煖、頂、忍、世第一法四種。當獲得加行道忍位的時候,就說證得一分真實,尊者就是在這樣的上師跟前受取了近圓戒——比丘戒。「共稱汝親教,為加行道者」,就是指這位師長。那麼出家之後「<p> 其諱又名勝燃燈智<p> 」,這個就是阿底峽尊者的法號。 [01′16″]</p>
<p>   在這裡我們需要稍微了解一下阿底峽尊者的這位親教師。比如說什麼叫「親教師」?就是經過弟子的三次祈請上師作為親教師,上師應允就成為這個弟子的親教師。由於能夠清淨地教授、攝護弟子,所以稱為親教師。在這個地方應該是說阿底峽尊者剃度出家的那個善知識——剃度和尚,就是加行道以上的成就者。 [01′54″]</p>
<p>   那麼在談到「加行道」的時候,我們就要了解到聲聞、獨覺還有菩薩道各都有什麼?有五道,對吧?「十地五道功德滿,速疾證得金剛持。」三乘各有五道,五道是資糧道、加行道、見道、修道,還有什麼?無學道;聲聞乘有聲聞乘的五道,獨覺乘有獨覺乘的五道,大乘有大乘的五道,這裡邊應該是指大乘,對不對? [02′22″]</p>
<p>   那麼說你是不是大乘,源自於什麼呢?你的種姓,對不對?如果以大乘種姓來說,怎麼判斷這五道呢?在一開始發菩提心成為菩薩的時候,就進入了大乘的資糧道。資糧道分為上、中、下品,當上品的資糧位菩薩獲得證得空性的止觀雙運的時候,注意!此處的證得空性不是現證空性,而是什麼?用分別心證得空性。這個時候資糧道的菩薩可以生起證得空性的什麼量啊?非現量,而是比量;也有證得空性的分別心,甚至也可以獲得證得空性的奢摩他,但是沒有證得空性的止觀雙運。一旦生起證得空性的止觀雙運,就進入了大乘的加行道。這位老師是什麼?是加行道以上的。 [03′19″]</p>
<p>   加行道就包括煖、頂、忍、世第一法這四個階段。當加行位的菩薩圓滿了第一大阿僧祇劫的資糧,進一步現證空性的時候,就獲得了大乘見道。這時候現證空性,也就是登初地,成為聖者了。當見道位的菩薩生起第一個能斷一分修道所斷煩惱的對治品無間道的時候,他就獲得了大乘的修道。從初地到十地,注意!當十地的修道位菩薩最後斷除所知障的時候,到哪裡了?這位菩薩就成佛了,也就是他終於獲得了大乘的無學道! [04′06″]</p>
<p>   這個五道,我們可能要在學習的過程中常常去串習,因為不常串一會兒就忘了。以前可能都沒有在學這個部分,所以談到阿底峽尊者的剃度阿闍黎的時候,就解釋一下加行道。 [04′27″]</p>
<p>   在這裡邊我們還要了解一下:為什麼比丘戒稱為是「近圓戒」?「圓」是指什麼呢?圓就是指涅槃,是由於獲得了涅槃能遠離一切損害,獲得一切圓滿,故稱為圓。受比丘戒能靠近涅槃,所以稱比丘戒為近圓戒。 [04′57″]</p>
<p>   在這裡邊就說阿底峽尊者的這位親教師他雖然是受取近圓戒的律儀,依著小乘他們的宗規,但並不是從大乘向下趣入小乘,因為「<p> 非是真大眾部,以言其獲加行道及證空性故<p> 」。大眾部屬於有部宗,如果依照大眾部的見解,是無法證悟空性進入加行道的;那麼既然已經證悟了空性進入加行道,就很顯然他不是真正的大眾部。 [05′33″]</p>
<p>   出家人有五衣、七衣、九衣,對吧?那個五衣,就是有五條縫縫;七衣就是有七條縫縫;九衣就是那個很燦爛的,上面像很多磚塊縫起來的。出家人還叫乞士,為了斷除對於衣著的貪著,那個布可能什麼樣的都有,然後對起來,成了一個出家人的衣服。 [06′00″]</p>
<p>   可以想像當初佛陀也是離開了穿金戴玉的這種王子生活,穿上了從各處搜來的布縫起來的衣服,就這樣去乞食,穿著這樣的一個袈裟,然後演變到今日的袈裟。我說:當時各種顏色的布可能都有,可能完全談不上美感,但是後來袈裟為什麼變成這樣子了?法師們說因為是有居士供養。佛陀當時離開王宮的時候,他把他那一身精貴的衣服脫了之後,換成了這樣的衣服,可以想像他決斷趣入真理的決心!所以每次看到這個袈裟,應該想起佛陀捨棄了王族的一切榮華富貴,換了這身袈裟;反過來可以說這個袈裟比一個王國給他的重量還重啊!穿在身上。 [07′03″]</p>
<p>   所以所有著袈裟者,不是在皈依學處裡有嗎?對吧?我們都不應該罵、不應該去毀訾他。在佛因地的故事裡邊,也有一個金絲猴,那個獵人要獵牠。因為牠是一個菩薩,對於三寶極有恭敬心的一個修行的化現,那個獵人知道這個金絲猴非常恭敬出家人,所以他就穿上出家人的袈裟;他扣動扳機的時候,這個金絲猴都沒有生惡念,都是合掌在祝願他。 [07′38″]</p>
<p>   今天介紹這一些,大家要想一想:看到袈裟,就會想念佛陀的恩德,想到這些出家人——比丘或者比丘尼,沙彌、沙彌尼,他們延續著這個聖教的傳承到現在,所以我們應該遵守著皈依學處,要恭敬禮拜法師們。可以集極大的福,尤其是可以集證道資糧。不管是在家和出家,如果我們不能夠恭敬三寶、不能夠恭敬出家人,很顯然損福報是非常非常快的!這一點上師們都有非常清晰明確地示現,就是要恭敬僧。大家要好好努力! [08′28″]
<p>   在討論阿底峽尊者的善知識他的功德到底證悟有多深的時候,這邊後面有一段辨析。《四家合註》的 117 頁巴梭法王的一個註釋,註說:「一分真實三摩地」這個是什麼意思?就是說戒鎧阿闍黎他獲得了加行道以上的功德到底是什麼樣的證量,就在探討這個問題。大家在討論的時候,會發現和巴梭尊者的觀點不一樣,這個不一樣處我們可以了解一下。 [00′32″]</p>
<p>   說:關於此段提到的這個「一分真實三摩地」,祖師們是有不同解釋的。巴梭法王把「一分真實」解釋為「證得所取無自性」,而其他的祖師解釋為「不顯現所取境有諦實」,或「開始壓伏見道所斷能取分別」。 [00′56″]</p>
<p>   巴梭法王認為真實指空性,分為所取境上的無自性,以及能取者之上的無自性兩種,所取無自性及能取無自性各屬於空性的一部分,所以都稱為一分真實。加行道忍位的時候證得所取無自性的三摩地,就是一分真實三摩地。這是巴梭法王的一個想法。 [01′22″]</p>
<p>   那麼宗喀巴大師在《金鬘論》中就有提到:大乘加行道忍位的時候,斷除所取的散亂,唯留能取散亂。由於加行道忍位安住於一分無所取,以及隨順無能取,所以是住一分真實三摩地。依據大善知識功德海的解釋,此段的真實即指不顯現能取所取有諦實。《金鬘論》中所說的「安住於一分無所取」應該承接上文,理解為斷除所取散亂,也就是指證空性的時候不會顯現所取境有諦實;而不顯現所取境有諦實,即是不顯現能取所取有諦實的其中一分,所以稱之為「一分真實」。 [02′15″]</p>
<p>   有在聽嗎?賈曹傑大師在《心要莊嚴釋》中也有提到:不能從明現能取所取無自性的程度來區分四種加行道,因為四種加行道等持同樣都證得一切法無諦實,也都明現諸法法性的義共相,所以要從斷除所斷的程度來安立四種加行道。 [02′45″]</p>
<p>   妙音笑大師在《現觀辨析》中也認為四種加行道不僅都能夠證得所取無諦實,而且能證得一切法無諦實。另外,在提到大乘忍位加行道時,妙音笑大師解釋為能取一分三摩地。記不記得前面巴梭法王的解釋?是所取,對吧? [03′08″]</p>
<p>   所以從宗喀巴大師、賈曹傑大師,還有妙音笑大師的承許,可以推知他們都不承許證得所取無自性的三摩地即是一分真實三摩地。因為如果是這樣的話,在忍位以前就能證得一切法無諦實,那一分真實三摩地便不用等到加行道的忍位才能獲得,前面就可以獲得。 [03′33″]</p>
<p>   一般而言,大乘加行道四個階段的時候,會依次壓伏四種見道所斷的分別:執染汙所取分別、執清淨所取分別、執實有能取分別、執假有能取分別。大乘加行道忍位的時候,能夠斷除前兩種見道所斷所取分別的這個現行,宗喀巴大師應該是從這個角度來安立大乘忍位加行道為一分真實三摩地。由於斷除見道所斷的一分——所取分別的現行,所以證入空性的時候便不會顯現所取有諦實,因為已經斷掉了。妙音笑大師認為大乘加行道忍位的時候,開始壓伏見道所斷能取分別,所以從這個角度上也能安立為一分真實三摩地。 [04′28″]</p>
<p>   綜上所述,無論是從斷除見道所斷所取分別的現行,或是從開始壓伏見道所斷能取分別,來安立一分真實三摩地,都是從斷除或壓伏所斷的這個角度來安立的,而不是從證得所取無自性的角度來安立的。所以巴梭法王的解釋,顯現上與宗喀巴大師、賈曹傑大師與妙音笑大師的說法有不同,所以在這個地方特別地拿來討論,以供那些鑽研經典的人詳細地去思考一下。 [05′12″]</p>
<p>   由於討論阿底峽尊者的這位授戒阿闍黎、剃度和尚,他的功德到底是什麼樣的?無論怎樣都必須承許是加行道以上的菩薩——本地風光也不知道是什麼樣。也很感謝阿底峽尊者和他的剃度和尚!我們有了這一分,比如對於宗喀巴大師《金鬘論》怎麼講的啊?還有《心要莊嚴釋》賈曹傑大師怎麼講的啊?妙音笑大師怎麼講的?這些就會給我們一個學習的機會,讓我們去看一看各家祖師所講的,甚至把它們都會通起來,看看其中的差別。 [05′52″]</p>
<p>   這樣討論下來的結論,就是我們會對經典裡面說的忍位的所斷到底是從哪個角度去安立加行道忍位的這個定義,看看不同角度的風光,擴大我們對於加行道菩薩的功德的理解,希望我們能夠對大乘的法生起欲求心,乃至去實證它。從而可以了解一下阿底峽尊者的老師們都是何等的精采! [06′24″]</p>
<p>   所以,能得到這個傳承上師這樣傳下來的法脈,到現在為止沒有間斷的這樣一個傳承的學習,我們是何等地幸運!大家一定要好好地學!不管現在是居士在學習,也要發願以後生生世世能夠出家;出家人在學習,也要發願生生世世能夠出家,因為近圓戒還是非常地精采的。所以我們一起努力! [06′55″]
<p>   大家好!又到了我們學習《廣論》的時間了。在學習之前,請大家觀察一下自己的內心:這個時間,我們做什麼是對自己的生命和他人的生命最有利益的?很顯然是聞思修正法。那麼聞思修正法為什麼會給自他帶來最大的、最究竟的意義呢?這就要從我們的苦樂開始想:什麼是離苦得樂的正道呢?就是要斷除所有的惡業、勤修所有的善業,當所有的惡業都滅盡、所有的善業都圓滿的時候,就是成佛的時候。 [00′47″]</p>
<p>   那麼如何令我們三業中的惡全部地滅盡,讓我們的善全部都修起來呢?我們必須依靠一種法或者依靠一種道。這個道就是佛陀在經典裡啟示我們的、教誡我們的離苦得樂之道,你可以說是三學,也可以說是道次第。讓我們去聽聞、去思惟這樣的法,並且慢慢地用這樣的法,好像烘烤一樣去烤我們的惡業。如果我們的惡業是千萬年的堅冰的話,那麼在正法的熱度的這種烘烤下,它就會融化。說服我們的內心不停地去對境抉擇,讓自己的律儀越來越清淨,更習慣地、更勤勉地去修行善法。 [01′45″]</p>
<p>   這樣的話,就是水洗、火燒,數數地淬鍊我們的內心,直到我們非常非常地善巧三學,能夠非常自如地操縱我們的心。那個時候我們想要快樂就會快樂、想要離苦就會離苦,不會像現在這樣,想要離苦離不了、想要得到快樂卻有求不得苦。這些非常精確的離苦得樂之道,佛陀會開示我們,所以要用我們人生最寶貴的時間來聽聞佛法、思惟佛法,乃至改變自己的三業。精勤地「<p> 晝夜唯應觀察自心,豈有餘事?<p> 」觀察自心做什麼呢?捨惡、取善。 [02′41″]</p>
<p>   好!今天我們就繼續學習《四家合註入門》,請大家把書翻到 108 頁。看中間這一段,再繼續講阿底峽尊者的功德,今天將學習到阿底峽尊者「學習上下部內明經咒之理」這一段。請看藍字。 [03′06″]</p>
<p>   <p> 學習上下部內明經咒之理:<p> 此後乃至三十一歲,習學相乘內明上下諸藏。特於<p> 〔<p> 能飛聚落<p> ,師云:「昔有內道居士,任一外道起屍修法侍者。既成,起屍之舌化作寶劍。居士倚劍飛登須彌山頂,須臾遍歷四洲八渚,還來將劍歸與外道,外道囑云:『此屍成金,割截取用,但勿傷骨,夜中即復,終無盡期。』言訖持劍飛登天境。居士即倚金屍,依己凌虛所見須彌四洲佈列,建此大寺。寺中但憑其金,足供百位比丘及百居士資生多年。」傳稱藏地桑耶寺,亦為靜命堪布仿照此寺所建。〕<p> 達摩惹喀大<p> 法鎧<p> 師前,十二年中聽受<p> 〔<p> 《大毘婆沙》<p> ,傳為阿羅漢近護,抑或法依,或法商主所造,凡八百卷<p> 。<p> 〕<p> 極善<p> 說一切有部、大眾部、上座部、正量部<p> 根本四部教典,雖諸異部作受食等,諸微細分,互取捨處,遍知無雜。<p>  [05′07″]</p>
<p>   <p> 由是度越<p> 中觀自宗、實有他宗,<p> 非徒習學,復如理通曉之理者:<p> 自他諸部宗海彼岸,故是無倒解了一切教正法中樞要處者。<p>  [05′24″]</p>
<p>   這一段就讀完了,那麼我們可以看仁波切的講記,說:接下來要講到「學習上下部內明經咒」的道理。阿底峽尊者出家之後,「<p> 學習上下部內明經咒之理:<p> 此後乃至三十一歲,習學相乘內明上下諸藏<p> 」,就是尊者在三十一歲以前,他都是學習內明。那麼「相乘」是什麼意思呢?相乘就是顯教。「<p> 特於能飛聚落,達摩惹喀大<p> 法鎧<p> 師前,十二年中聽受《大毘婆沙》<p> 」,這裡邊就出現了阿底峽尊者在哪兒學習呢?又跟隨著哪一位善知識學哪一部論呢?仁波切先講了:他對《大毘婆沙論》作了多年的學習,傳記中說是學了十二年!一部論學了十二年,阿底峽尊者這麼聰明的人!那麼《大毘婆沙》到底是一個什麼樣的論呢?《大毘婆沙》是一部有八百卷的大論,它比《大般若》還大。那麼是講什麼的呢?主要講述一切有部的承許。在巴梭法王的箋註中有說到它的作者,說是「<p> 阿羅漢近護<p> 」,也可以說是「<p> 法依或法商主<p> 」所造的。那麼這個論的作者有各種各樣的說法,有的說是八、九個羅漢一起造的,但是在巴梭法王的註解裡面講的是一個羅漢,也就是近護——法依所造的。 [07′21″]</p>
<p>   一切有部的論師認為《大毘婆沙》不是佛經,是論。大家都知道有漢譯本,是玄奘大師譯的。但是過去卻沒有翻成藏文,就是藏文裡邊的論典是沒有《大毘婆沙論》的。那麼為什麼譯師沒有把它翻成藏文呢?並不是以前的西藏人沒有人能翻,而是不准翻譯。印度的經論其實並沒有完全地翻成藏文,對於可不可翻、適不適合西藏,那個時候的國王與班智達們會一起討論做出判斷,然後才能翻譯,而《大毘婆沙》是不可以翻的。 [08′11″]</p>
<p>   但是對於學習《俱舍》來說,裡面引用了很多《大毘婆沙》的文字,沒有它,可能《俱舍》學起來會很困難。所以很多格西就開始討論了,討論之後就勸請能將這本論翻譯出來。法尊法師就得到了這樣的允許,所以才著手翻譯《大毘婆沙論》。他是從什麼文翻成什麼文啊?是從漢文翻成藏文。這本論前幾年在尊法師的手稿裡邊已找到,而且已經印刷出版了,是藏文版的。我們已經有《大毘婆沙論》,是玄奘大師譯的漢文版。 [09′03″]
<p>   《大毘婆沙論》是一切有部的主要論典,全名就是《阿毘達磨大毘婆沙論》,有十萬頌,主要闡述一切有部所承許的根道果的內涵。成書的時間和作者,就像仁波切講的,有很多說法,漢傳的和藏傳還不一樣。我們漢傳對於《大毘婆沙論》的這個說法,主要是依據《大唐西域記》裡邊的記載。說是在佛陀滅度後四百年,那個時候部派林立、學說不一的狀態下,就由迦膩色迦王向脇尊者祈請之後,世友菩薩還有脇尊者等四百九十九位羅漢舉行了第四次結集,然後著述了幾部論,其中有《鄔波第鑠論》、《毘奈耶毘婆沙論》及《阿毘達磨毘婆沙論》。這是一種說法。 [00′59″]</p>
<p>   但在《大毘婆沙論》裡邊記載說:這個論不是在迦膩色迦王那個時代集的,這個論問世是在迦膩色迦王之後,所以時間上是有參差的。現今很多的中、日的學者都認為這個書成書於迦膩色迦王之後,是在龍樹菩薩出世之前,大概在公元 150 年到 200 年之間。這是漢傳的說法。 [01′28″]</p>
<p>   那麼藏傳的說法分三種,這都跟阿育王有關係。第一種就是在阿育王的時期,於印度賓陀山名優寺,有在聽嗎?由優波毱多尊者帶領五百羅漢弟子集結著作而成,這是一種說法。第二種說法,還是在名優寺,但作者為主持第二次集結阿羅漢的耶舍尊者等五百羅漢,這是第二種說法。第三種是依據克主傑大師所著的《密續總綱》裡邊說,一切有部承許《大毘婆沙論》是集凡聖二眾之力著作而成,經部宗則承許為未登聖位的班智達所撰。 [02′15″]</p>
<p>   那麼「近護」是誰呢?就是第四代付法藏師,約公元前三世紀,就是優波毱多,也叫近隱。西晉三藏安法欽譯的《阿育王傳》中有這樣的記載,說這位尊者出生在摩突羅國,為毱多長者的第三個兒子,後來受商那和修度化出家,不久就證得了阿羅漢的果位。他非常地神勇,曾調伏魔王,令其守護僧伽,並且以神通教化弟子。凡是有一個人成就了阿羅漢,他就擲一個四寸的木條,丟在什麼地方呢?丟在一個洞穴裡,那個洞穴大概是長三十六尺、寬二十四尺,應該這是有精確記載的。後來當木條塞滿洞穴的時候,他就把法脈付予了第五代的付法藏師提多迦尊者,然後他就示現涅槃了。他一生度了很多很多的眾生,因此佛授記名為無相好佛,意思是說這位了不起的祖師,他除了沒有佛的相好,但他度生的事業與佛沒有差別。 [03′42″]</p>
<p>   這裡邊又說《阿育王傳》提到阿育王是以優波毱多尊者為師,但是在《多羅那他印度佛教史》中記載,優波毱多尊者大約在阿育王沒有登基前就已經示寂了,所以當阿育王在護持教法的時候,他碰到的是第七代的付法藏師——大善見。 [04′10″]</p>
<p>   那麼,阿底峽尊者學《大毘婆沙論》的時候,是跟哪一位上師學的呀?達摩惹喀大,對吧!也可以義譯為法鎧,法鎧上師。這位上師是阿底峽尊者主要的上師之一,約 10 世紀。這位大善知識具有非常殊勝的布施的功德,曾經幫一位病人向醫生問診,然後這個醫生說需要以活人的血肉作藥——現在沒有人開這種藥了——那個時候,這位上師就布施了自身的血肉,然因過於疼痛而昏厥。昏迷中就見一位白衣人前來讚歎,並且用手加持他,然後傷口立刻就痊癒了,醒來之後就發現身體完好如初。這都是不可思議的菩薩在布施的時候會發生的事情,在佛經裡寫的也是這樣。我們看到白衣人馬上會想到誰呀?哇!是不是觀世音菩薩?這裡邊說相傳白衣人即是觀世音菩薩的化身。這位善知識最初是一切有部的菩薩,後來就進入中觀派,著有《修心利器之輪》。阿底峽尊者就是跟這樣的一位上師,十二年中聽受《大毘婆沙論》。 [05′44″]
<p>   那麼阿底峽尊者在什麼地方聽受《大毗婆沙論》呢?在什麼地方?還記得吧!那個地方叫「能飛聚落」,對吧!談到這個寺院的名字,又有個故事。在講這個故事之前,我們先要介紹一個起屍修法。起屍修法乍聽起來好像有點恐怖,但是它實際上是為內、外道所共通的一種成就法,在傳記、教法史、寺誌裡面記載是滿多的,內道修密者或者為了快速累積福德資糧也會修,或者為了得到金子,把屍體化成黃金、作為坐騎而修,都是有用途的。 [00′48″]</p>
<p>   而在這個公案中的外道,他是為了獲得八種共通成就的寶劍成就,透過對屍體施咒,經過若干時間之後屍體就成了起屍,然後屍體就會跳起來。這個時候修法者與修法者的侍者,必須有其中的一個人,把這個跳起來的屍首壓制住,另一個人把屍首的舌頭割下來。割下來的舌頭立刻就變成寶劍了,然後持之即能上天下地,無所不能。不知道是抱著寶劍,還是坐在寶劍上,總之這個舌頭就已經不是舌頭,它化成寶劍了。 [01′28″]</p>
<p>   我們看 110 頁仁波切講的,說接下來語王尊者對於能飛聚落這座寺院的歷史就做了很多註解。就開始講故事:以前有個外道他就修起屍法——剛才我們介紹那個起屍法。起屍法就是讓死屍起來行走,就是起屍悉地,這也是密法的八種悉地之一,內道徒也有。如果修成了的話,這具死屍就會變成金子。這位外道要修起屍法,可是要如果沒人幫助的話,是沒法修成的。所以他就請一位內道的居士來幫忙,就告訴他說:「我在修起屍的時候,如果你能把屍體的舌頭砍下來給我,那剩下來的這個屍體全部會變成金子,然後這些金子就全歸你了。」我在想這也要很有勇氣,萬一按不住呢?萬一不忍心割下來,或者感到害怕呢?但是那個居士不知道是不是為了這些金子就奮勇前行,還是他倆是朋友,搞不清楚記載。總之,那個居士就答應去幫忙修了。 [02′48″]</p>
<p>   起屍法如果修成了,舌頭就會變成一柄寶劍,拿著這個寶劍可以去到須彌山頂,可以飛到天界去。然後他們就開始修了,起屍法修了幾天之後,這個屍體就開始回暖,再過幾天屍體就會動,再過幾天就看到他舌頭在動了。一開始的時候舌頭會伸出來,一下又縮回去了,如果在第一次能用寶劍把舌頭割取下來的話,是最上等的,請那位居士幫忙就是要幫割屍體的舌頭這件事情。但是這位居士不知道是由於驚恐,還是由於技術不熟練,還是由於什麼問題,他沒有在第一次就割下舌頭,說是因為縮得太快了,第一次就沒有割到。如果在第二次取得,就可以得到次等的成就,但是第二次那個舌頭伸出來了,哇!這個居士又沒能割下來。 [03′59″]</p>
<p>   到了第三次,那個居士就拼了,因為第三次如果不割下來的話,那個起屍復活了之後,就會把整個地方都毀滅掉。所以這個居士也是沒辦法了,他就發了這樣的狠心,等到第三次,那居士就把自己的嘴巴湊過去,等到舌頭一伸出來,他就用自己的牙齒把屍體的舌頭咬住。看到這裡,我覺得實在是太拼了,居然用寶劍把它割下來!剛才我們說了,如果舌頭不割下來,起屍復活,那就是遺害整個地方,就會被毀滅,所以這個居士居然在第三次連咬帶割就把它割下來了。割下來之後,舌頭馬上就變成寶劍了。然後那個居士就說:「啊!你寶劍先借給我,因為我想飛上天去看風景。」因為他倆當初談的是,如果修成了的話寶劍歸那個外道,這個變成黃金的屍體,這麼大一塊金子就給居士。這個居士考慮還滿多的,他先騎了寶劍飛翔,然後還可以得到金子,所以他就先去看風景了。於是手持寶劍,一下子就到了須彌山頂,就看到了風景。 [05′25″]</p>
<p>   他借劍飛翔到了山頂,全覽四大洲與八小洲。看了一圈回來之後,因為當初在修法說好了,這個寶劍是歸外道的,所以他非常守信用就把寶劍還給了外道。然後外道也很守信用,那個整具的屍體就早已經變成黃金,再也沒有那麼恐怖,所以他就把這個金屍的肉割下來,應該就是金塊吧!都是黃金。囑咐他只要不要割到見骨頭,肉——就是這個金塊——都可以長回來的,一旦割到見骨頭,肉就長不回來了。 [06′08″]</p>
<p>   這個居士就用這些金子——這來之不易的金子,建造了能飛聚落這座經院,而且是按照他在天上所看到的須彌山及四大洲、八小洲的格局蓋了這個寺院。並且那金子好像是用不完,就用這些金子奉養這座寺院裡的百位比丘與百位居士,在很多年裡都作為他們的施主。 [06′43″]</p>
<p>   不知道聽到此處你們在想什麼?能飛聚落這個寺院是這樣的一個緣起。 [06′51″]
<p>  <p>  <p>  <p>  <p>  <p>  <p>   靜命大堪布到西藏的時候,他最初創建了桑耶寺,也是仿造能飛聚落這座寺院建的。仁波切還講:在中國北京承德的外八廟也是這樣蓋的,仿造四大洲、八小洲。承德有些寺院也是仿造桑耶寺的建築,還有北京頤和園山頂上的寺院,也是仿桑耶寺蓋的。 [00′29″]</p>
<p>   那麼這裡提到這個桑耶寺,是靜命大師來到西藏的時候建的。那麼我先講一下靜命大師吧!靜命論師,他是瑜伽行中觀自續派的開派祖師,他又有一個名字是大親教師菩提薩埵。大家知道靜命論師是哪兒的人嗎?他出生在孟加拉,約公元 725 年到 788 年。年少的時候,在他的親教師智藏的座前出家,並且依止這位善知識開始研習律典,之後又依止調伏軍阿闍黎聽受了《現觀莊嚴論》。由於觀察到深見、廣行不可偏廢,所以進一步精研龍樹菩薩所傳的空性教授,他的著作就是《中觀莊嚴論》。 [01′39″]</p>
<p>   然後在 8 世紀的時候,他應藏王赤松德贊祈請就進入了西藏,然後修建了桑耶寺。最初就度了七個人在桑耶寺出家。8 世紀的時候,距今大概 1200 年左右,這是西藏最早的出家人,對吧?在桑耶寺。七個人出家之後,開始建立僧伽制度,宣說了戒律、中觀。從那個時候開始,他就一直住在西藏直到示寂。他的主要的弟子是獅子賢論師、蓮花戒論師,都是非常非常著名的! [02′28″]</p>
<p>   那麼桑耶寺,就是由赤松德贊王、蓮花生大師還有靜命論師三個人融合了漢、藏、印的三種建築風格而成的。在建成之後,幾度被焚毀,但是又都修建成了。後來藏區有一個滅法的王出現破壞佛法,11 世紀的時候,原來跑到各處流亡、沒有地方住的僧眾就返回了西藏,聚集在桑耶寺,其後就逐漸成為了寧瑪派的道場。所以這個桑耶寺,它就是仿照能飛聚落的那個四大洲建立的。這是關於「能飛聚落」的一個說法。 [03′24″]</p>
<p>   接下來,覺窩傑具德阿底峽尊者,「<p> 極善<p> 說一切有部、大眾部、上座部、正量部<p> 根本四部教典,雖諸異部作受食等,諸微細分,互取捨處,遍知無雜。由是度越自他諸部宗海彼岸,故是無倒解了一切教正法中樞要處者。<p> 」自部是中觀宗,因為這是阿底峽尊者的自宗;他部就是說實事宗,說實事宗是在內道裡非中觀部的部派所以叫他部。這些阿底峽尊者全要學,並不是因為他宗他就不學,連外道的教典都要學習。所以由於遍學並且如實地證得了所有的宗派,度越了自他諸部宗海的彼岸,他就無倒地通達了一切教正法的樞要。 [04′30″]</p>
<p>   然後在這裡邊說到最細小的差別處、微細分——比如說比丘怎麼受食——這些都學得非常精細,他不是粗略地學,是非常精細地學。所以才讚美他說:無倒地通達了一切教正法的扼要。注意哦!這個通達教正法的扼要,就已經是了不得的一件事,他是無倒地通達了一切教正法的扼要。 [05′03″]
<p>   大家好!很高興又到了研討《廣論》的時間,請大家端正自己的發心——是為了利益無窮無盡的如母有情,必須去希求一切智智的果位,為了這樣的動機來聽聞《菩提道次第廣論》。今天我們繼續學習阿底峽尊者的功德,是《四家合註入門》的 112 頁。請大家把書翻到 112 頁,看上面的藍字,說:「<p> 證悟功德攝入三學之理<p> 」,這是開始介紹阿底峽尊者的證功德。 [00′45″]</p>
<p>   <p> 證悟功德攝入三學之理:<p> 獲得證德事理者:總佛一切教法聖教,<p> 經律論<p> 三藏寶攝,故證聖教亦須攝入三學寶中。<p> 增上戒定慧三猶如珍寶,難得、稀有、貴重、饒益、救護損害、引生喜樂,以此六法同於珍寶。<p>  [01′19″]</p>
<p>   下面我們看仁波切的講記,說接下來尊者「<p> 獲得證德事理者<p> 」,證功德想一想要攝在哪裡邊呢?仁波切說全部收攝在三學之中,所以要宣說通達這一切功德的道理。「<p> 總佛一切教法聖教,三藏寶攝<p> 」,三藏寶攝。那麼三藏是什麼呢?就是「<p> 經律論<p> 」,它們被稱為三藏寶,這就是教正法。「<p> 故證聖教亦須攝入三學寶中<p> 」,教正法有三藏寶,那麼證正法要收攝在哪裡呢?也是必須收攝在三學裡邊。「<p> 增上戒定慧<p> 」,就是增上戒學、增上定學,還有增上慧學。仁波切在裡邊解釋說:我們必須要加上「增上」,不加的話外道也有戒、定、慧學,所以內道三學之上要加上「增上」,這是為了和外道三學作區分的。 [02′41″]</p>
<p>   那麼下面一個問題就是:為什麼要把三藏還有三學取名為寶呢?因為「<p> 猶如珍寶<p> 」,所以稱為寶,就是說像珍寶一樣。那麼怎麼像珍寶一樣呢?是如何相似呢?下面就舉了六個功德:一、難得;二、稀有;三、貴重;四、饒益;五、救護損害;六、引生喜樂。提到了六個珍寶的功德,它是和珍寶相順的,所以稱為寶。 [03′23″]</p>
<p>   「珍寶」很顯然是很難得、很稀有的;就像以前在斯里蘭卡一個佛塔上,有一個國王供了一顆特別大的藍寶石,非常大,那是很稀有的。還有一些很罕見的大鑽石等等,都是很稀有的。「難得、稀有」這兩點形容珍寶。那麼三藏和三學難得嗎?稀有嗎?也是很難得、也是非常地稀有! [03′59″]</p>
<p>   由於具足了不可思議的功德與利益,所以它像珍寶一般「貴重」。如果自己能夠修持三藏與三學,就會得到解脫及一切智的果位,所以對自己是非常有「饒益」的。對他人由於能救護從煩惱所出生的一切輪迴的痛苦,所以也是「救護損害」。由於能獲得人天果位的增上生及解脫,還有一切智果位的決定勝,所以它「引生喜樂」。就是這些三藏和三學,它能夠給我們生命帶來增上生,增上生很顯然是人天勝道,就是人天道,它會有很多學習佛法的殊勝條件;解脫就解脫輪迴了;一切智的果位就更不要談了,那是所有的有情夢寐以求的。一切智的果位就是一絲絲的痛苦都沒有、所有的快樂都圓滿,所以說三藏、三學是「引生喜樂」的。由於有六種功德與珍寶相順,故稱為寶。 [05′14″]</p>
<p>   學了這一小段,大家可以想一想,我們常常說皈依三寶,皈依三寶的時候會不會去思考一下:為什麼佛、法、僧三寶,三藏和三學都稱為寶?這裡邊解釋了這幾點。比如說拜佛的時候,或者自己念皈依的時候,或者學法、學教典的時候,如果心思稍稍有點模糊和麻木的話,可以想一想它猶如珍寶的這幾種特色。讓我們的心從那種取捨模糊的狀態變得很清晰,就會知道我們為什麼會皈依三寶,為什麼會學習三藏,乃至為什麼會修行戒定慧三學。因為所有的教典都是為了指示內心的一條路,像燈一樣,讓我們知道哪裡是快樂、哪裡是光明、哪裡是溫暖,所以猶如珍寶。說有一種寶石晚上會發光,在輪迴的黑夜裡可以發出光芒的有很多啊,律儀是可以的,還有菩提心寶也是可以的,那空性就更不用說了,它完全是照破輪迴的黑暗。 [06′37″]</p>
<p>   所以看這字數是很小一段,但是如果能夠對三藏、三學——我們是增上三學——生起難得、稀有、貴重、饒益、救護損害,還有引生喜樂,跟它的本質相應的一種覺受的話,那無疑對我們的現世和來生都是非常有饒益的。這是其中的一個饒益。 [07′04″]
<p>   接下來請大家看 113 頁「<p> 引敘戒律<p> 」,中間的藍字,看原文。<p>   <p> 其中戒學,至言及釋數數讚為定慧學等一切功德之所依處,故須先具戒學增上諸證功德。其中<p> 戒律,<p> 分三:成就最勝別解脫律儀事理者:如《讚》中云:「尊入聲聞乘<p> 之宗規別別解脫律儀<p> 門已,護戒如氂牛愛尾,<p> 如《菩提道炬論》云:『七眾別解脫,如來所宣說,最勝妙梵行,即比丘淨律。』<p> 具妙梵行勝苾芻,持律上座我敬禮。」謂其正受圓滿苾芻諸律儀已,如愛尾牛,若尾一縷掛著於樹,雖見獵士將離其命,寧捨其命護尾不斷。如是雖於一輕學處,尚寧捨命防護不犯,況其所受重大學處,是故成大持律上座。<p>  [01′32″]</p>
<p>   下面我們再看仁波切的講記。說:「<p> 其中戒學<p> 」,現在是過渡到三學寶中的戒學了。那麼戒學是三學的根本,因為「<p> 至言及釋數數讚為定慧學等一切功德之所依處<p> 」,佛陀的至言及眾多的釋論中都有如此提到。像《親友書》中就說:「佛說戒為眾德本,如情非情依於地」,就像大地一樣可以出生一切作物,是一切情非情的所依,戒也是一切功德的所依,所以像大地一樣。如果要想獲得任何功德,根本都在於戒。「<p> 故須先具戒學增上諸證功德<p> 」,所以最初必須具足這樣的功德。哪樣的功德呢?就要先具備戒學增上的諸證功德。所以這裡邊很顯然「戒學增上」它是屬於什麼?證正法裡邊的證功德,而且它是要最先具足的;像大地一樣,如果你想要獲得任何功德,都要用這個大地承載,這個大地就比喻增上戒學。 [03′02″]</p>
<p>   那麼戒學有幾種呢?剛才講過別解脫律儀、菩薩律儀,還有什麼?密宗律儀。首先,「<p> 成就最勝別解脫律儀事理者<p> 」,這裡就講到具德阿底峽尊者具足了最勝別解脫律儀的道理。像「<p> 《讚》中云:『尊入聲聞乘門已,護戒如犛牛愛尾。』<p> 」在這個《讚》中所說的「入聲聞乘門」的意思,不是指入聲聞乘,而是指進入「<p> 宗規別別解脫律儀<p> 」之門。我們必須了解這兩者的差別,否則可能就會有人認為阿底峽尊者好像進入聲聞部派了。但不是這樣的,仁波切說這是很重要的!比如說我們是執持大乘宗的,但我們也持守別解脫律儀,不會因為特別持守別解脫戒就說我們趣入聲聞乘。 [03′57″]</p>
<p>   覺窩傑趣入的是聲聞乘的律儀,趣入這個律儀之後,對於每一條戒,都如同犛牛守護牠尾上的每一根毛一般地善加守護。在雪山上的犛牛就會這樣,如果牠尾巴上的一根毛、一根細細的尾纏在了樹上,這個時候如果有獵人追牠,追到面前拿起槍,縱遇到生命的危險,牠也捨不得把牠那個尾巴拉斷然後跑,牠也不願意斷一尾求存。如同這個譬喻,就算遭遇到了命難也不捨戒,尊者對律儀的愛護超越於生命。 [04′49″]</p>
<p>   這裡邊說犛牛的那個尾應該有很多細得像絲一樣,其實斷一個絲應該是沒什麼的,但是這種犛牛牠就是特別愛護牠的尾巴,寧可死了也要保護。尊者對於微細的戒都守護成這樣子,可以想像對重大的律儀,他也更是用所有的生命去守護。 [05′16″]</p>
<p>   所以我們學到這裡可以想一想:我們都是受了戒的人,那麼我們對於重戒的態度是什麼?那種很重的戒律。我們對於那種輕的律儀,還有細部的律儀的態度又是什麼樣?就可以知道對這個增上的戒學,我們的信心是怎麼樣的?自己的認知是怎麼樣的?行持又是如何呢?我們讀到這裡尊者的行誼,可以反觀一下自己,然後要向尊者學習。 [05′53″]
<p>   接下來想一想別解脫律儀有幾種呢?「<p> 如《菩提道炬論》云:『七眾別解脫,如來所宣說,最勝妙梵行,即比丘淨律。』<p> 」如來說了七種,哪七種呢?近事、近事女、沙彌、沙彌尼、學法女、比丘、比丘尼。這個「梵行」,就是指出家。而出家律儀中的比丘律儀,是別解脫律儀中最最殊勝的!「<p> 具妙梵行勝苾芻,持律上座我敬禮<p> 」,說的也就是這個。雖然在《菩提道炬論》的字面上說有七種別解脫律儀,但本來是八種,就是把八關齋戒也算進來,不分男女二眾,就成為了八種。在《律海心要》中也有提到:「在家律儀為前三」,在家律儀就是指八戒、近事、近事女,近事就是指居士的意思;又說:「後五為出家律儀」,就是指沙彌、沙彌尼、學法女、比丘、比丘尼五種。別解脫律儀是以守護身口的律儀為主。 [01′08″]</p>
<p>   說:「<p> 謂其正受圓滿苾芻諸律儀已<p> 」,指阿底峽尊者受了比丘戒之後,「<p> 如愛尾牛,若尾一縷掛著於樹,雖見獵士將離其命,寧捨其命護尾不斷。如是雖於一輕學處,尚寧捨命防護不犯,況其所受重大學處<p> 」,「重大學處」就是四種他勝罪等重大學處,然後說:「<p> 是故成大持律上座<p> 」。 [01′39″]</p>
<p>   接下來就看下面,上師教誡我們,說我們有些人在受戒的時候是很勇敢的,也做了許多承諾,但是持戒的時候一條戒也守護不了,這樣的話利益就很小,而且還累積了眾多的過失,所以是不應該這樣的。傳說覺窩傑具德阿底峽尊者在前往西藏的路上,雖然只是微小的惡作,也會立刻停下來進行懺悔。大家都知道車馬勞頓的時候,身心疲憊去一個很遙遠的地方,光是疲憊感就已經讓人心裡非常非常地難以應付了,如果在路上再生了病。那麼我們可以看看,在這種前往西藏的長途跋涉之中,尊者防護律儀,哪怕是微小的惡作也會立刻停下來懺悔。其實可以繼續走、不用停的,他要停下來懺悔。 [02′40″]</p>
<p>   在西藏有些上師,自許獲得很高的密法證量,就不重視別解脫律儀。但是覺窩傑具德阿底峽尊者在密法上的證量如此地崇高,對於守護別解脫律儀卻比自己的生命還要珍惜。注意下面這幾個字——這就是極扼要處!聖教的根本在於戒律也是指這個。佛法能否住世,觀待正法毘奈耶的行持是否住世,正法毘奈耶的行持住世,佛法就住世;正法毘奈耶的行持不住世,佛法就不住世! [03′23″]</p>
<p>   這裡面我們再回頭看一下。問一下:那個「極扼要處」是什麼呢?在密法的證量如此崇高,但是對於守護別解脫律儀卻比自己的生命還要珍惜,這就是極扼要處。聖教的扼要處是什麼呀?我們都想要了解很多很多好像沒有聽過的法,其實很多的善知識都特別強調戒律。戒律大家都知道是能夠截斷三惡趣的、堵塞三惡趣門的一個方式。到了三惡趣的那個門,怎麼樣能不進入,會有一條像滑軌一樣滑走的,那就是律儀。到三惡趣門,不會門打開就掉下去,不會這樣的,就乘著那個滑軌車滑過去了,甚至連三惡趣門的名聲都聽不到了,就是最勝的別解脫律儀,因為它會讓有情免受惡趣的痛苦。 [04′21″]</p>
<p>   所以再重新想一下,我們天天說:「建立教法!」那麼什麼叫建立教法?說:請善知識住世,然後教法住世。那麼教法住世的根本是什麼?在這裡邊說:聖教的根本在於戒律,佛法能否住世,觀待於正法毘奈耶的行持有否住世——正法毘奈耶的行持住世,佛法就住世;如果戒律的行持不住世,佛法就不住世了。 [04′52″]</p>
<p>   在這裡邊我們想一想,我們常常在講「正法久住」,還希望「建立教法」,還有常常說:「維繫師父的宗風」,這都是很多老學員還有法師們常常的思路。那麼師父的宗風到底是什麼?就是令法久住!令法久住就是觀待於戒律!所以於微細戒,看!「不管修行多高,守護別解脫律儀卻比自己的生命還要珍惜,這就是極扼要處!」 [05′28″]
<p>   有人說:正法毘奈耶的行持,就是指結夏、解夏、誦戒,此三住世就是還有正法毘奈耶的行持在,就可以說佛法還在世。仁波切說:就你們而言,大部分的寺院經濟條件都很好,有很多恢宏莊嚴的殿堂也是很好的,但是最重要的是看有沒有正法毘奈耶的行持——戒律的行持,正法住世與否也在此。因為不管外相上多麼地盛大,也不會安立這就是佛法。所以,仁波切說這些寺院裡應該有正法毘奈耶的行持,然後接下來說道海長老就對佛陀的聖教作了極好的承事。 [00′46″]</p>
<p>   在跟隨仁波切去朝聖的時候,看到仁波切非常恭敬地供養出家人。每到一個寺院就會供養大眾,雖然可能就是每個人五塊錢,錢也不多,但是非常非常地恭敬!碰到有的寺院很大,但是進裡面發現沒有一個出家人,仁波切就會露出一種難過的神情。所以在這裡面說:有些寺院很大,但裡邊沒有一個出家人,可以說有佛法住世嗎?當然不能這樣說!聖教的根本、佛法是否住世,全賴是否善加守護自心相續的戒律,不是靠其他人。如果善加守護自心的戒律,自心中就有佛法,所以重視戒律是很重要的! [01′48″]</p>
<p>   讀到這兒的時候,可以想一下,我們常常在說:「師父的宗風是什麼?」我說:「是向內調伏。」那麼向內調伏的法則是什麼呢?一定是依著戒律向內調伏,因為我們都有各自所受的律儀。在這裡邊,建立正法和戒律完全就是畫等號,那師父的宗風,也就是令聖教久住;令聖教久住,全賴「是」善加守護自心相續的戒律,因為要「否」的話就沒辦法,所以不是靠其他人。這點我們就可以想像一下,不管外相看起來好像做得轟轟烈烈怎樣,但是無論是出家眾還是在家眾,如果身為佛弟子的我們沒有好好地受持各自所受的律儀的話,沒有善加——注意這兩個字——「守護」自心相續的戒律,你不能說自己在做令教法久住的事情。 [02′57″]</p>
<p>   所以以前我們曾經探討過:令法久住,住在哪裡?是住在心裡。那麼什麼叫令法久住、住在心裡?怎麼樣住在心裡?就是好好地持戒。好好地持戒,就要好好地拿戒律向內調伏自心的煩惱,當我們的心趣向於非法、趣向於非理作意的時候、趣向於惡法的險處的時候,要用別解脫的這個鉤子,像銜一樣把這個如野馬一般的狂心把它拉回來。這個動作要數數、數數地練,每天、每時、每刻、在夢中都要練習。有的人在夢中就忘了自己受戒了,比如說我們受持的律儀是不能飲酒的,有人做夢就開始喝酒了,然後醒來還要懺悔。 [03′43″]</p>
<p>   一開始受戒的時候,會不會發生遺忘?這個遺忘是很嚴重的,一定要記得自己是受這麼多戒律!受這麼多戒律、得到了戒體之後,那戒體有一種作用,就是當我們趣向於險處的時候,那個戒體就像車要碰到另一輛車的時候,車就開始叫了,然後這主人就知道:哇,快碰到另一輛車了!就開始倒車或前進等等,就開始調這個心。所以受了戒律之後,一定要憶持、要記得自己所受的戒律。其實這也是一種訓練,每天訓練、每天訓練。 [04′21″]</p>
<p>   我做一個什麼樣的比喻呢?比如一個不會跳舞的人,好像不太協調,他要去學跳舞。一個舞蹈是怎麼學下來?大概就是你要跟著你的老師把那個舞步向哪兒走都要記住,你不能超越界限,因為超越界限就不是舞蹈,可能是體操或者一些怪動作。所以這個界限,就是你邁步或者伸腿的界限,要不停地練習、不停地練習,練習到你自己的身體能夠一伸手就做到位,一伸手就是老師要你做的。打拳也是一樣的。 [04′57″]</p>
<p>   那麼用這樣的一個舞蹈或拳的方式形容我們的內心的話,就是心念的操作。當然別解脫律儀是主要守護身口,就一直訓練、一直訓練我們身的三業不能行殺、盜、淫,口要斷除那幾種惡業。然後慢慢熟了之後,其實你不會到邊界,你發現到不太行的時候,你就會覺得:哇,這是不可以的!很遠的地方心就收回來了。 [05′24″]
<p>   一個成功的舞蹈家,實際上就是要訓練,訓練到他可以行雲流水地做出他那些動作,不需要說下個動作是什麼、下個動作......,他不需要這種憶念了,因為他的身體經過了非常徹底的訓練。這個訓練是什麼呢?比如說舞蹈裡邊有要飛起來的動作,那你說又不是鳥你怎麼飛呢?你可能就要把你的身體彈跳到最高,而且最高到上面還不能醜。所以他就要訓練,訓練到他的身體就像他想像的那樣,把那個動作做出來。 [00′37″]</p>
<p>   我們就要像我們想像的那樣,把戒律持到清淨,就是一直訓練、一直訓練,訓練他的身體已經有條件反射,到那個地方就開始行雲流水地做出來。當然要經過比如說可能扭腳呀,可能難以想像的疼痛,或者摔下來失敗等等,經過很多的痛苦、疼痛、不屈不撓的奮鬥,最後這一個舞能夠完美地呈現。在舞臺上表演的時候是一個聚光燈,那我們學戒的人,你說它聚光在哪裡,就是你完美地憶持你這些戒律的時候——好像你拿著燈看這些事情的時候,你會發現:哇!我們的三業是很完美的一個傑作,就是堪稱是精品。因為你已經經歷過這樣的訓練,讓我們的心非常非常地柔軟。舞蹈會讓你的身體變得柔軟,那麼戒律會讓我們的心裡變得調柔,所以一伸手、一投足就是一個傑作,徹底地和戒律完美統一,就是戒律的傑作! [01′42″]</p>
<p>   這個透過數數訓練是完全可以完成的,我這個數數訓練就是那種:台上三分鐘,台下十年功。在那個持戒的當口上,你能夠撐住那幾個念頭,或者你能夠守護住自己,其實就是經年累月的努力導致的。你到關鍵時刻你的正念正知全部能夠衝上去,把這個快要漏的地方全部防好,甚至遠方便戒都守得非常好。 [02′09″]</p>
<p>   我想表達的是:對於別解脫戒乃至所有律儀的守護是可以練成的,透過辛苦的操練是可以練成的。因為這就是一條路,就是心路!你一直訓練它不要趣向於惡法,守住身口、守住身口,以後你的身體就習慣守住身口了。然後到了那個不守身口的地方,你就會覺得非常地不適應,甚至說:「這怎麼可能變成這樣?」就變成了一種痛苦的事情、不悅意的事情。甚至你覺得:「這不是我的世界!這不是我的人生!我的人生豈能和戒律分開呢?我豈能不這樣活著呢?」就是自己的心續化成了戒律本身。就像你就化成了那支舞、那個傑作!本身就是傑作——你的手一伸出來、腳一伸出來,飛上去、落下來等等就是傑作!一舉手投足就是一個精美的傑作,如果世人知道的話就是令人震撼;那如果世人不知道的話,那你自己持戒清淨,我們自己能把戒律守持清淨,對後世、對求解脫、對成佛,都是不可思議的,對正法的住世就在此! [03′23″]</p>
<p>   所以我會覺得我們受了戒律的人,可以像那些舞蹈家練舞那樣,有的人一天跳七、八個小時,不管是坐車多少個小時、坐飛機幾個小時、也沒有地方,他說一天不練功夫就退了,一天都不能停的!要一直壓腿、一直練,他那個身體才能夠那個柔軟度,才能把那個動作做出來。舞蹈家為了奉獻出一支傑作的舞蹈,他能夠做出這麼辛苦的努力,那麼我們為了令法住世,對於戒律的這種訓練豈能懈怠呢!或者練一練沒練成就放棄掉,甚至是忘了,這是很奇怪的事情! [04′06″]</p>
<p>   這裡邊我認為非常值得我們自己期待的就是,因為心是無自性的,當你朝著這樣的方向去串習,一直串習的時候,它就會有一種條件反射。我們不會一直都像一開始學戒,每條持起來那麼地辛苦,久了之後就如同行雲流水了,就是非常自主的、自由的,甚至我們在戒律裡得到了前所未有的清涼和自由!甚至你會覺得好像只有在這裡邊才是安全的,確實在這裡邊是安全的! [04′41″]</p>
<p>   所以戒律不是一條繩索,如果你非得要把它形容成一條繩索的話,那你快要掉到深淵的時候,這個繩索會把你絆住,別讓你掉深淵,這是很美好的一個繩索!可是你要飛向快樂的虛空的時候,它絕對不是一個繩索,它像風一樣助你飛翔,甚至就是根本,根本就像翅膀一樣,沒有翅膀是飛不了的。 [05′04″]</p>
<p>   所以在學習到阿底峽尊者他對一條微細的律儀都如犛牛愛尾一般,這到底是一個什麼境界?我覺得我們現在只是聽到,然後去想像。那麼善知識的這種示現、傳承祖師的這種示現,就是要我們也能夠做到如犛牛愛尾一般的這種持戒,能夠成為我們佛弟子的榜樣和效學的一個標準。大家不要覺得那是大師級的持律上座,既然我們受了戒律,我們為什麼不好好持呢?因為對自己和他人有如此深的饒益,為什麼不去千百次地訓練它呢?訓練到全部就是化成戒律本身,完美地合一,何樂而不為呢? [05′57″]
<p>   接著看《入門》116 頁最後一段。說我們講到〈造者殊勝〉當中,其身圓滿功德事理,這一科裡邊有:具足別解脫律儀之理;具足菩薩律儀之理。現在就要講「具足菩薩律儀之理」。看 117 頁,這是在講阿底峽尊者成就菩薩律儀的功德。 [00′26″]</p>
<p>   <p> 成就菩薩律儀者:如《讚》中云:「尊入度彼岸門已,增上意樂善清淨,覺心不捨諸眾生,具慧大悲我敬禮。」<p> 依慈氏瑜伽士等上師<p> 長修眾多慈悲為本菩提心之修習教授,特<p> 於十二年間<p> 依金洲大師,多時修習至尊慈氏及妙音尊傳授無著及寂靜天最勝教授。如《讚》中云:「能捨自利以利他,為勝是即我師尊。」謂心發起愛他勝自菩提之心,以此願心所引行心,受學菩薩廣大妙行,學受隨行所有學處,行賢妙故,能不違越諸勝者子所有制限。<p>  [01′31″]</p>
<p>   那麼現在我們看仁波切的講記。這裡邊的《讚》就是《八十讚》。《八十讚》中說:「<p> 尊入度彼岸門已,增上意樂善清淨,覺心不捨諸眾生,具慧大悲我敬禮。<p> 」在顯密二者之中,顯教即是度彼岸乘。進入了度彼岸乘的這個大門之後,「增上意樂善清淨」,就是由清淨增上意樂之門發起了什麼心啊?菩提心。然後以菩提心不捨多少眾生呢?不捨如虛空般的一切眾生,因此頂禮具足如是菩提心「具慧大悲」的尊者,大悲即是大乘的根本,所以敬禮具慧大悲者。 [02′29″]</p>
<p>   阿底峽尊者從「<p> 慈氏瑜伽士<p> 」為主的眾多上師跟前,請了很多以「<p> 慈悲為本菩提心之修習教授<p> 」。必須以慈悲心作為根本,才能發起菩提心,所以在此師座前修習以慈悲心作為根本的菩提心教授。後面說是「<p> 特<p> 於十二年間<p> 依金洲大師<p> 」。在這之前,我們可以了解一下「慈氏瑜伽士」。 [03′01″]</p>
<p>   慈氏瑜伽士也是金洲大師的上師,約在十世紀,又名古薩利,童貞出家,法名寶軍。在大古薩利上師座前聽受了修持顯密教法,特別將龍樹、無著分別傳下的深見、廣行兩派的道次第合一而作修持,由此心中生起了圓滿道次第的功德。依止廣行派的大德勇金剛,聽受自他換的教授,生起了真實的菩提心。這位上師將慈悲心奉為修行心要,故尊稱為慈氏瑜伽士。 [03′46″]</p>
<p>   據《噶當父法》記載,阿底峽尊者擁有的發心傳承之中,教依《虛空藏經》、理依《集學論》、《入行論》、在見解上依經部宗的發心傳承,都是跟這位上師求得的。這位上師著有《證道歌》描述他自己對於慈悲心、菩提心的體悟。他的主要的弟子,剛才有說誰是他的弟子啊?就是金洲大師,阿底峽尊者也是他的弟子,赫赫有名的兩大弟子!所以慈氏瑜伽士是一位很了不起的上師,阿底峽尊者就跟他修學。 [04′31″]</p>
<p>   現在就介紹到:在十二年中依金洲大師,「<p> 多時修習至尊慈氏及妙音尊傳授無著及寂靜天最勝教授<p> 」,特別在一切上師之中,主要依止攝修心教授為一脈的金洲大師,在十二年中修習菩提心。「<p> 如《讚》中云:『能捨自利以利他,為勝是即我師尊。』<p> 」捨棄了自利,而精勤成辦一切他有情的義利,這就是我的上師。注意!在那「自利」前面有兩個字,哪兩個字啊?「捨棄」,這就是菩薩要修學的。這一段應該是在阿底峽尊者的傳記中有很多的描述,我們可以再去學習。 [05′31″]
<p>   在無等覺窩傑的《廣傳》中有清楚地記載:主要在見地上來說,尊者是中觀應成派的見地,見地是非常高的。見地雖然很高,進入大乘道與否,主要還是看什麼呀?有沒有菩提心。那麼確定你是不是大乘人看什麼呀?心中生起菩提心就是大乘人;如果沒有菩提心,怎麼樣都不算是入大乘數。因此,為了大寶菩提心,為了在相續中能夠生起菩提心,為了在上師面前受取菩提心,阿底峽尊者就歷經數月渡越大海,然後去到金洲那個地方。去的時候,尊者的眷屬有一百二十五位比丘與沙彌,金洲大師旁邊則有五百位比丘。到了之後就在金洲那個地方,十二年中間跟金洲大師修學菩提心。 [01′11″]</p>
<p>   對於大經大論而言,阿底峽尊者與金洲大師都很善巧,而且在見地上,阿底峽尊者又特別超勝於金洲大師,但是他們的差別就是在相續中是否生起菩提心,為此尊者才會去了金洲。在阿底峽尊者所有的上師裡,金洲大師成為最主要的上師的原因是什麼呢?就是因為這個。所以在這十二年裡並沒有學習很多教典,而是學修菩提心,看相續中是否能夠生起,乃至未生起之間就一直在上師跟前,所以是主要的上師。這個就是講阿底峽尊者依止金洲大師修學菩提心的一小段。 [02′11″]</p>
<p>   看了這一小段可能我們就想:啊,菩提心是很重要的!像阿底峽尊者這麼了不起的人、這麼聰明的人,都要在他的上師面前十二年勤勤懇懇地修習菩提心,看來菩提心我得下一點功夫了!大家可能會得到這樣的一個感覺。但是仁波切講到這兒的時候就開始講——最近有人說:「依止上師是西藏的特色,佛法中沒有特別強調一定要依止上師。」接著仁波切說:「但不是這樣,印度的大成就者們都依止上師。覺窩傑具德阿底峽尊者依止金洲大師的原因,是由於他的菩提心傳承極為清淨,而且加持力極大。如果能如實地依止上師的言教,就是自己獲得加持的最勝之門。」 [03′11″]</p>
<p>   我再說一遍:「阿底峽尊者依止金洲大師的原因,是由於他的菩提心的傳承極為清淨,而且加持力極大。如果能如實依止上師的言教,就是自己獲得加持的最勝之門。」因此尊者在十二年中,在心中還未生起菩提心時,就在上師跟前修習菩提心。具德阿底峽尊者的一切上師中,最殊勝的是金洲大師,因為依止金洲大師才能生起菩提心,所以執持金洲大師是所有上師之中最超勝者。 [03′52″]</p>
<p>   阿底峽尊者已經去西藏了,在西藏的時候,也就一直念著金洲大師的恩德,念念不能忘!然後說:「我能有善心,此乃上師恩。」就是由於這位上師而生起了菩提心,所以他特別地恭敬。這種感恩應該持續生生世世吧!這種對金洲大師的感恩心。 [04′24″]</p>
<p>   在學習祖師的傳記中,有人說:「啊!這已經是過去很久的事了。」但是為什麼要學習祖師的傳呢?就是為了明了當下自己的所行,前人走過的路、成功者走過的路,自己沿著這樣的路也會獲得成功。所以這裡邊要抉擇的一點是:依止上師並非是好像藏系的特色,無論顯密都要有善知識——領進門、中間護航、到最後成佛都離不開善知識;聞思的時候離不開,生起證量、證正法的時候也是離不開。 [05′09″]</p>
<p>   所以在這裡邊要再強調,有人說:「啊,好像依止善知識太困難了!消除非理作意都很困難。」那可能還得在內心中再再地堅定:如果想獲得成就的話,不是簡單結個緣,想要獲得成就,讓自己的這個暇身不要虛度,那麼這一個次第應該是不可以違越的。因為沒有上師的加持力,斷一分過、修一分德,這都變成了非常困難,甚至極難生起。 [05′44″]</p>
<p>   所以在提到阿底峽尊者追隨在金洲大師身旁十二年,為了修起菩提心。阿底峽尊者聰明絕頂,那樣的人況且在修菩提心的時候,還要依止金洲大師十二年。大家都知道他小的時候就很善良,坐在車上出去就說:「願我的善根和福報都與眾生共!」是從小就顯現出這樣殊勝善心、絕頂聰明的人,在他要修菩提心的時候,尚且要依止金洲大師老老實實地學習。所以也提醒我們在依止法上不要有什麼偷心,也不要覺得這只是說給別人聽的。這是一個佛弟子必須要走過的路——一定要依止善知識,不然很難獲得成就。 [06′44″]
<p>   接下來看,在 119 頁第 2 段。「<p> 謂心發起愛他勝自<p> 」,生起了珍愛他人勝過自己的菩提之心。「<p> 以此願心<p> 」,就是先以發願的形式,在內心中生起菩提心。這以後,「<p> 所引行心,受學菩薩廣大妙行<p> 」,就是受取律儀。那麼「<p> 學受隨行所有學處,行賢妙故,能不違越諸勝者子所有制限<p> 」,完全沒有違越任何一點菩薩戒所制定的界限和學處,這是尊者清淨持戒這樣的一個功德。所以阿底峽尊者在西藏的時候,藏人曾經去問覺窩傑,說:「您戒律清淨嗎?」然後尊者回答說:「別解脫律儀是清淨的,密乘戒與菩薩戒的根本罪與粗罪從來沒犯過,只有生起一些惡作罪而已。」因為別解脫律儀是守持身口的行為,所以比較容易持守。接著仁波切說:對我們來說,這點就困難了,身口就很難防。密乘戒與菩薩戒主要防護的是內心,所以比較難。這就是學習菩薩行、菩薩學處的部分。 [01′31″]</p>
<p>   這一小段我們可以看一看,首先第一個說發心發起了什麼呢?愛他勝自——珍愛他人勝過自己的菩提之心。其實我們可以觀察一下,我們這一生有關於此世的煩惱,很多時候都是由於別人不理解自己、說話傷害自己,或者該別人負責的事情結果他不幹,我多幹了一些等等、等等、等等;或者多年、很多時候對一個人好像很發心幫他,但他不領情,還反過來生瞋心等等。對於我們這些修心的佛弟子來說,我們觀察內心之後可以知道生起珍愛他人勝過自己的心是很困難吧! [02′26″]</p>
<p>   但是就算不生起珍愛他人勝過自己的心,整天珍愛自己勝過他人,我們也得不到快樂。我們會覺得:哇!生起菩提心這個珍愛他人的心太困難了,我應該修不起來。但是即使修菩提心再困難,也比不修菩提心的苦少受多了!因為不修菩提心就整天「我愛執」——愛自勝他,然後由於我愛執的原因,在一切境上廣泛地發作三毒,或者各種以自我為中心的這種思路。這種思路在我們的人生中引生的這種痛楚,乃至這種痛楚的深度、這種傷痕的深度,可能修菩提心就好了!有想過這個理路嗎? [03′15″]</p>
<p>   愛他勝自!這個心顛倒過來之後,是不是生命會呈現出另一番風光?因為我們已經超越了只愛自己的這一路的狹隘風光,或者痛苦的低窪地,潮濕的、有霉味的地方,我們已經超越了。我們登上了這樣的山頂,可以瞭望更遼闊的這個風光。所以不要一看到菩提心就覺得是很困難的,好像此生與我無緣。不要覺得不修菩提心是很便宜的,其實不修菩提心的話,二六時中我們因為愛自所產生的痛苦實在是太多了! [03′58″]</p>
<p>   還有的人說:「希望別人把我放在心上。」沒有希望自己把別人放在心上,總嫌別人給自己的不夠,然後就開始抱怨;抱怨久了就生怨恨心,然後就會伺機報復、爭吵不休等等,很難有一個和平的、慈悲的大家在一起相處的狀態。為什麼呢?我愛執大爆發的時候,人們就會在一起失去了平靜和慈悲的這種氣氛。 [04′29″]</p>
<p>   我再講一遍:生起菩提心多困難,總比帶著我愛執活著好多了!因為我愛執對自我奴役的每一分、每一秒,都讓我們的痛苦越來越深、越來越深。修習菩提心、開始珍愛他人勝過自己這樣的努力,哪怕我們努力一點點、一點點,這畢竟是背棄我愛執這個路的一個起步,這個萬噸巨輪的一個起航,所以它是非常值得隨喜的。 [04′59″]</p>
<p>   大家不要覺得菩提心永遠屬於菩薩,我好像很難生起。一定要知道,執著愛自之心的痛楚,乃至離菩提心越來越遙遠,成為不了一個菩薩——好像沒有翅膀、每天在狹小的愛我執的低溫下、低空下、缺氧的狀態下生存,是多麼痛楚的一件事情。那我們就不會去拒絕修起菩提心所忍受的時間長,十二年我們再可以加長好多段。無量劫來受這個我愛執的控制,如果這一朝學到宗大師教法,修到這麼清淨的菩提心的傳承——這傳承到現在!如果此生能夠在內心中生起菩提心的話,那我們真的是「一朝凌絕頂,一覽眾山小」。 [05′53″]</p>
<p>   覺得:哇!就像一個小孩子玩那個泥巴,小朋友搶了幾個泥巴,然後坐在地上大哭、哭個沒完,很多痛苦可能就是這麼狹隘的、這麼幼稚的。但是我們卻很難出離,一直在我愛執的控制下,認為以自我為中心是合理的,我的要求、尊重我怎樣怎樣都是合理的。沒想到其實「<p> 愛自即是眾苦因,愛他則是萬善根<p> 」,是吧!這是佛陀的教誨。 [06′26″]</p>
<p>   所以看了尊者的行誼,我會覺得不管我們的起步點是多低,我們應該努力地發起、一定要修起這樣的菩提心,向阿底峽尊者學習,像上師那樣努力不間斷地,直到菩提心生起! [06′46″]
<p>   大家好!又到了我們一起學《廣論》的時間。今天我們要繼續學習阿底峽尊者的功德——「成就金剛乘律儀者」。前兩次我們學習了別解脫律儀和菩薩律儀的功德,現在我們要把書翻到《四家合註入門》的 120 頁,阿底峽尊者成就金剛乘律儀者,看上面的第一段。 [00′33″]</p>
<p>   <p> 成就金剛乘律儀者:如《讚》中云:「尊入金剛乘門已,自見天具金剛心,瑜伽自在獲中者,修密護禁我敬禮。」成就觀見自身即天生起次第,及金剛心圓滿次第三摩地故,總讚為其瑜伽中尊,特讚如理護三昧耶,不越制限。亦如《讚》云:「由具念正知,不作意非戒,慎念無諂誑,犯罪不染尊。」<p>  [01′25″]</p>
<p>   如果把這一段白話翻譯一下的話,就是尊者具足金剛乘律儀,就像《讚》中所說的:「您進入了金剛乘門之後,能觀見自身為本尊,並且是具足金剛心的瑜伽自在、阿哇都帝巴,修持隱密禁行的尊者,我對您敬禮。」尊者具足觀見自身為本尊的生起次第,以及金剛心圓滿次第三摩地。所以不僅總體讚歎尊者為瑜伽師之首,更特別讚歎尊者如理守護三昧耶戒,不逾越制限的行誼。如《讚》中也提到:「由於具足正念正知,因此不作意不符合戒律的事,持念不放逸、無有諂誑,您絲毫不沾染任何墮罪。」 [02′35″]</p>
<p>   現在我們看一下《四家合註》仁波切的講記。接下來,在具足別解脫律儀以及菩薩律儀的基礎上,宣說具足金剛乘律儀的持守。再唸一下原文:「<p> 成就金剛乘律儀者,如《讚》中云:『尊入金剛乘門已,自見天具金剛心,瑜伽自在獲中者,修密護禁我敬禮。』成就觀見自身即天生起次第,及金剛心圓滿次第三摩地故,總讚為其瑜伽中尊<p> 」,「尊入金剛乘門已」,就是說阿底峽尊者進入了密乘聖教之門。由於能如生起次第所說,視自身為本尊,所以具足了生起次第的證德。「金剛心」,就是指圓滿次第的三摩地。「瑜伽自在獲中者」,就是獲得一切圓滿次第的功德、三摩地,並且對圓滿次第的瑜伽獲得自在。由具足生圓二次第的一切功德而作禮讚。 [03′51″]</p>
<p>   在這裡邊說:「瑜伽自在獲中者」,我們現在看這個《讚》中的幾個詞義的解釋。像這個「獲中者」的藏文原文為阿哇都帝巴,常人非常容易誤解,以為是阿底峽尊者的上師阿哇都帝巴。但是根據如月格西解釋,阿哇都帝巴是指住於中道者;一般而言,住於中道者有諸多的解釋,此處讚歎尊者為修持密法能夠不墮二邊,住於中道。仁波切認為此處「中」是指中脈,修習圓滿次第而淨化中脈者稱為「獲中者」。這有兩種解釋。總之,不能認為此處在說阿底峽尊者的上師。 [04′47″]</p>
<p>   「觀見自身即天生起次第」,修學無上密續分為生起次第和圓滿次第兩個階段,修習生起次第時,主要修習觀想自己就是本尊,此處所說的這個「天」就是本尊。觀見自己的身就是本尊,觀想起來就是生起次第。然後「金剛心圓滿次第」,這個金剛有緊密不分之義。像金剛那麼堅韌,就是它不能被什麼利器分割的意思。金剛王寶劍就是它不能被其他的寶劍所斬斷,它是寶劍中最厲害的!對不對?所以這個金剛有密不可分、緊密不分的意思。那麼修習圓滿次第的時候,融合智慧、方便二者直到緊密不分,所以名為「金剛心」。 [05′41″]</p>
<p>   再接下來看,說在密法中,最主要的就是必須要守護密乘的誓言與學處,如果能持好密乘戒——持好灌頂的時候所受取的律儀和誓言——就算未慣修本尊法,十六生內也能成佛。「<p> 特讚如理護三昧耶,不越制限<p> 」,就是說能如理地守護在灌頂時承許的所有的密乘戒,毫無違犯。 [06′18″]</p>
<p>   這個部分大家可以觀察一下,自己是不是對於密法是這樣看待的?比如說談到密法的部分,我們可能會覺得得到一個灌頂是比較重要的,大家可能會非常非常想要學很多灌頂。但是此處就上師所解釋的,密法最主要的是必須守護密乘的誓言與學處,就是密乘的戒律,還有誓言。然後說如果能夠持好密乘戒——持好灌頂的時候所受取的律儀與誓言,就算本尊法修得不是很習慣、不是很熟練,十六生內也能成佛。所以這件事我們可以自己觀察一下自己的見地。說十六生內也能成佛,密法速疾,說是很快的,但是它快在哪兒呢?是不是我們因為得到灌頂而快呢?或者我們本尊法修得很熟練,儀軌啊什麼、怎麼觀想啊,各種手印都非常地熟練,但是卻對誓言和學處馬虎,甚至都忘了,這樣的話,是不可能會得到它速疾成佛這樣的一個功效的。 [07′42″]</p>
<p>   所以在此處,我們應該觀察一下自己會不會有這樣的見地,認為在密法中其實最重要的,和佛陀最初的教誡也都是一樣的——最重要的就是戒律。無論是別解脫還是菩薩、還是密乘,最重要的都是要守護誓言與戒律。然後它這裡讚美說:如理守護灌頂時所承許的所有密乘戒,毫無違犯。 [08′15″]</p>
<p>   「成就觀見自身即天生起次第」,宗喀巴大師解釋《讚》文的「自見天」。「及金剛心圓滿次第三摩地故,總讚為其瑜伽中尊」,這個是解釋「具金剛心,瑜伽自在獲中者」。這裡邊最重要的就是下面的,「特讚如理護三昧耶,不越制限」。 [08′45″]
<p>   接下來,說在三種律儀中——三種律儀是哪三種?別解脫戒、菩薩戒、密乘戒——不管是哪種律儀,這一切戒都應該如《讚》中所說,怎麼樣持戒呢?「<p> 由具念正知<p> 」,就是必須具足正念、正知。看!回到這裡了。說從精嚴地守護別解脫戒也好、菩薩戒也好、密乘戒也好,不管是哪一種戒律,這裡邊就提到了必須具足正念、正知。《入行論》說:「<p> 欲護學處者,策勵當護心,若不護此心,不能護學處。<p> 」如果想要守護學處——就是想要守戒的話,首先一定要守護什麼呢?心!如果不護心的話,是無法守護學處的,這是《入行論》中所說的。那麼守護心要怎麼守護呢?拿什麼來守護心呢?守護心的方法就是必須要有正念、正知,提到了兩點。所以說:「由具念正知」,「具」是具足。阿底峽尊者因為具足正念、正知,所以能守護戒律。 [01′34″]</p>
<p>   在這一段我們還可以自己觀察一下:我們新學的同學不知道,老同學大概都受了很多條戒了,比如菩薩戒、密乘戒,還有八關齋戒也定期地受。在守護戒律的這個事情上,大家能不能想到正念、正知?想到護心?能不能想到《入行論》的這個教授?請問你怎麼樣地讓自己的律儀清淨?馬上想到護心。用什麼來護心呢?正念、正知。首先我們建立一個如何持好學處的見解,這個見解就是要護心——守護我們的心。拿什麼來守護呢?就是正念、正知,具足正念、正知。尊者之所以這三乘律儀守得這麼好的原因,就是因他具足正念、正知,所以能守護戒律。 [02′34″]</p>
<p>   有一些新同學可能會聽不太明白,說這裡都寫了些什麼?但是你知道這個很簡單的理路,那就是理解佛法很扼要的部分了。比如說戒律重不重要呢?戒律是非常重要的!那麼受了戒律的人要做什麼?要清淨地守護戒律。守護戒律要守哪裡呢?護心。護心怎麼護呢?具足正念、正知。把這個連貫性的理路聽好了,如果談到戒律的時候,自己能有這樣的一個見地,那這節課就是學得很好了! [03′08″]</p>
<p>   接著再重複一下:如果不護心是無法守護學處的,沒法守戒的。所以《入行論》中所說守護心的方法,就必須要具有正念、正知——「<p> 由具念正知<p> 」,阿底峽尊者因為具足正念、正知,所以能夠守護戒律。「<p> 不作意非戒<p> 」,就是沒有不符合戒律的想法。注意!這裡是「作意」,就是連不符合戒律的想法都沒有。所以要護戒就要護心,要護心就要有正念、正知。 [03′48″]</p>
<p>   接下來看仁波切講的。大佛子寂天菩薩說:「<p> 欲護自心者,致力恆守護,正念與正知。<p> 」就是由於正念、正知,必須再再地憶念,注意!再再地憶念什麼呢?如果是一個出家人的話,那就是:「我有戒律,我是出家人,我心續中有此學處。」要能憶念,並且用正知去監視是否好好地守護學處,這樣就是護心的方法。如果能護心就是護戒,所以提到要具足正念、正知。 [04′33″]</p>
<p>   在讚美阿底峽尊者的金剛乘律儀的這個部分,我們學到了《入行論》的這個偈子,這裡都是在教我們如何持好戒律的方法,其實也不是特別地複雜。怎麼樣讓自己的內心中連不合戒律的想法都沒有呢?還是要護心,叫「致力恆守護」。有沒有發現「致力恆守護,正念與正知」,這個「致力恆守護」它發力的時間的長度有個「恆」字?就是二六時中是不會斷絕的;那麼力量就是全部的力量都在守護,要有正念、正知。 [05′18″]</p>
<p>   而且這裡仁波切還教導我們一種辦法,如果我們受八關齋戒的時候,就不能忘記我們有八關齋戒;如果受菩薩戒,也不能忘記我有菩薩戒;如果受比丘戒,那也不能忘記自己受比丘戒,所以在這裡就說:「我有戒律」。假如是一個出家人:「我有戒律,我是出家人,我心續中有此學處。」仁波切在前面說必須再再地憶念,就是你要一次又一次地什麼?在內心中現起這樣的想法,比如說:我有菩薩戒、我有密乘戒,我要守好這樣的學處,我心中是有這樣的學處的。不忘失自己曾經受過戒律的這一點思考,也是很重要的。這一小段哦!這一小段完全是非常精髓的、怎麼樣去持好戒的一個經驗傳承。對不對? [06′13″]</p>
<p>   所以大家不要好像就聽阿底峽尊者的傳記,有故事的部分就仔細聽一下,到令人費解的時候就假裝昏昧一下就過了,不是這樣的!戒律就是阻塞三惡趣的門;要能迅速地成佛,也必須要好好地持守密乘的戒律,十六生中就可以。所以在這裡講的就是要「致力恆守護,正念與正知」。 [06′37″]</p>
<p>   然後在這裡仁波切提到了監視,我們都不喜歡被人監視,但是對我們的心來說,我們要好像在旁觀的一個人看,有一個什麼力量啊?正知力,對吧?正知力在看正念在不在,一直要看正念在不在。所以這樣的一種受了戒之後的心情,和沒受戒是不一樣的。要有正念、正知,你那正知要一直看著你這個正念在不在。 [07′08″]</p>
<p>   所以它在各種境界中都有一個什麼?力量,叫「防護力」。如果這是一個非常染汙的境,這個地方有毒氣呀或者什麼樣的,防護力可能就像一個防護罩,你的防護罩要立刻現行,叫防護力,對不對?你的防護罩要防護,不然就會被毒侵入了,重則就可能沒命。所以它這個防護力,其實就是正知的一個力量,一直防護著我們這個正念千萬不要失去。 [07′39″]</p>
<p>   所以在持守學處的時候的心,它是警惕的、警覺的。警覺的和昏昧的、放逸的、太放鬆的,這都是一個對比。清醒的是警覺的嗎?糊裡巴塗的、大而化之的、漫不經心的這個狀態,一個受戒的人進入這種狀態之後是很危險的,對不對?除非你非常漫不經心都能把戒律持守得非常謹嚴,但是好像大德都很少有這樣示現的,都是在很小的地方也非常地小心謹慎。 [08′18″]</p>
<p>   很多大德也說:持戒要小心、要膽小,不能放大膽子好像什麼地方都可以去,什麼話都敢講、什麼事情都敢做。這樣子一看就是因果的地方太粗疏了,有可能會造下墮落的業。所以在持戒的時候,有人說:因果的時候要細如粉末。我們要很細緻地檢查自己的三業、檢查自己有哪些地方在律儀的持守上,譬如說忘念,甚至有煩惱熾盛等等過失,讓自己的心又沒有好好地去收攝。我會覺得這一段值得我們不停地、不停地重看,直到仁波切講的這一段阿底峽尊者示現的這個三乘律儀持守的功德能夠融化在我們的心續裡,我們也能夠學會這樣子去持守律儀。 [09′12″]
<p>   後面說:「<p> 慎念無諂誑,犯罪不染尊<p> 」,就是斷除一切放逸的心而具足不放逸,並且具足正念、正知,沒有諂誑,因此不會被根本墮等墮罪染著。明明是持戒不清淨、殘破不堪,犯了許多戒,嘴上卻說自己戒律清淨;本來不是清淨比丘,卻令人看上去像清淨比丘,就是諂誑,沒有這種行為就是「無諂誑」。 [00′37″]</p>
<p>   這一段解釋了一下無諂誑的狀態,提出了放逸和不放逸。這個放逸,不知道大家會不會放逸和放鬆界限不清楚?有的人放鬆放到放逸,還有的人可能一放鬆就放逸。放逸是心沒有正念,對吧!沒有正念、沒有護心的這個狀態。 [01′05″]</p>
<p>   這裡又涉及到一個問題:我們提到正知是一種警覺、一種監視自己的力量,那如果正知監視你自己的時候你還會放鬆嗎?是可以的,做久了的時候是可以的!舉個最簡單的例子,譬如說騎腳踏車,一開始騎的時候你會非常緊張,然後就上去了。像我小時候也有騎腳踏車的經驗——大陸叫自行車,台灣叫腳踏車——我記得我已經好像練會了,可是有一次那天風有點大,然後我騎著、騎著,風一吹之後就覺得已經快失控了,然後怎麼也下不來,因為就特別緊張,就拚命蹬那個齒輪,然後它就越走越快、越走越快。這時候前面正好很遠處來了一輛車,車上全都是人,然後我在想:哇!這個怎麼辦?就一條路,我們是走對頭。因為速度已經非常快,好像有點像下坡又不像下坡,而且我的腳拚命蹬、拚命蹬,結果就在快撞上的時候,我還有點知覺,就把那自行車往右側扭一下,結果就撞樹上,然後躲過了那輛車。那輛車上全是人,我看到那輛車上所有的人眼睛瞪得大大的,都沒辦法,因為都在疾馳。 [02′23″]</p>
<p>   所以我的意思是說:就像一個剛開始練習騎腳踏車的小孩,上車的時候因為他沒法駕駛,他雙腳離地會非常緊張。久了之後,我看有的騎自行車的人好像快睡著了,還有的人騎自行車的時候輕鬆極了,東看看、西看看,然後腿也夠長了,不像小孩腿也不夠長,他隨時可以把腳還拿下來,他已經變成了一個很自由的狀態,所以他就沒有特別地緊張了。 [02′51″]</p>
<p>   所以並不是一持戒就很緊張,全身不舒服,然後一不持戒的狀態,一放鬆好像就得到快樂,這就是經驗不足。經驗足了之後,還是覺得提起正念、正知,清清醒醒地過一天、清清醒醒地過日子,不會有那麼多的憂悔和痛苦。因為想一想,這一天越少的罪染著,發現錯了之後趕快去還淨和懺悔,這樣就會覺得一天過得清清涼涼的;或者你會去檢查,還有越多的戒律還沒有好好持。這樣的話,你不會有一種回頭一看霧茫茫的全是灰燼,根本也看不清楚什麼的狀態。正在經過的事情頭腦就不清醒,然後回頭再去回憶的時候——剛才哪件事我做得對、哪件事做得不行?有沒有對於我所受的律儀的違犯之處?你回憶的時候也回憶不清楚,這樣是比較麻煩! [03′48″]</p>
<p>   為什麼回憶不清楚呢?就是心不在此。如果我們心思一邊做事的時候,一邊都注意到:比如說我講這句話會不會犯到我所受的戒律?我對別人這個態度會不會犯到我所受的戒律?甚至還有我心中的這個念頭會不會違越菩薩戒?會不會違越密乘戒?等等。這些都是要在非常清晰的狀態下,自我檢測的一個習慣。那麼這種習慣應該是在不放逸的狀態下,才能夠檢查越多、越細。如果一旦放逸,就有點什麼事情心全部被吸引住了,現在比如說我們做事情,有的人就眼睛一直盯著這個事情到底是成還是敗,沒有注意到這個心——有三乘律儀所莊嚴這個心——如果不好好護戒就敗了,如果好好護戒就成了! [04′44″]</p>
<p>   那麼一談到護戒,有人說:「好,那我不做事!」不做事,煩惱就沒有了嗎?煩惱的現行和根源就都清除了嗎?也不是的。做事與不做事,它都是一個我們能夠淨化煩惱,讓律儀慢慢清淨的善巧方便。可是一旦做事的時候一頭扎進去,完全不看看自己的心念在朝哪裡走、看看自己每天的行為,有沒有記得自己所受的戒律、有沒有常常去反省,一旦忘了這些之後,任煩惱滋生,這樣的話,我們在一個團隊中,其實也會讓別人很不舒服。因為諸如抱怨、發瞋恨心等等,很多不調伏的現行是大家都可以看到的,誰也不希望跟一個煩惱熾盛的人合作,因為會很痛苦。 [05′36″]</p>
<p>   所以戒律使這一顆心清涼,這顆心一旦清涼之後,我們就不用那麼痛苦;一旦我們不用那麼痛苦的時候,其實和周圍的人也自然相處得融洽,不會一直煩煩惱惱的、一直吵來吵去的。這只是就現世利益的部分,如果是就律儀成辦的後世的利益,那就更不用說了,那利益太大了!增上生、決定勝這些,沒有戒律作基礎,還有密乘的這些功德沒有戒律作基礎,是一事無成的! [06′08″]</p>
<p>   所以在這裡,想要勸自己和我們這些能夠對宗大師教法相應的學習的人,不要去習慣放逸,要去習慣不放逸。不要覺得持戒是一種好像很緊繃的狀態,如果你發現你很緊繃,你可以深呼吸調整你的狀態,然後把你用心的狀態調到不緊不鬆、很舒適的。慢慢就會體會到其實這顆心還是一直看著它比較好、守護著它比較好。 [06′40″]</p>
<p>   那麼對於這個「諂誑」,應該是和名利心有非常直接的關係。自己沒有做得很好,然後又假裝好像做得很好的樣子,這就是諂誑。在這裡說「無諂誑」,讚美阿底峽尊者沒有這種行為,就是他嘴上講的和他心裡行的,在別人面前還有在獨處的時候,他內心所堅守的東西都是一樣的,並沒有兩種樣子。他也不用在別人面前裝一種樣子,回頭又一種樣子,就是一個樣子。為什麼?因為這樣子才能解脫呀!這樣子才能夠把自己趣向於三塗的這些惡行都去掉,才能成辦增上生及決定勝。 [07′26″]</p>
<p>   通常為什麼要諂誑呢?就是應該怕丟臉是不是?怕別人輕視自己。但是一旦諂誑了之後,就很難發心去把持戒不清淨的罪懺掉,因為好像沒有的樣子。但是像師父說的,騙得了別人,騙不了自己。騙佛菩薩也騙不了,佛菩薩每個念頭都可以知道。所以在這件事上,我們應該是沒有什麼偷心的路可以走,也沒有什麼不努力好好地護心就能夠把戒律持清淨的路徑,好像抄小路一樣可以抄到,都做不到!必須是老老實實地守護正念、正知,比如說一條戒、一條戒先把它熟悉了,然後像六座瑜伽,就每天要檢查這些戒律我持守得怎麼樣;如果發現不對的,趕快就要懺悔。 [08′19″]</p>
<p>   所以,慢慢地讓我們的心離開諂誑的狀態, 像阿底峽尊者一樣,「慎念無諂誑」,爭取做到「犯罪不染尊」,這樣是我們的一個目標啊!是所有修行人仰望的一個目標。同樣受的戒律,尊者的戒律怎麼樣持守得這麼皎潔?用什麼方法持守的?我們應該去探索其中的奧秘,找到路徑,持之以恆地做下去。 [08′52″]
<p>   大家好!又到了我們研討《廣論》的時間,今天我們繼續學習阿底峽尊者的戒的功德。請大家把書翻到《四家合註入門》122 頁,請看中間藍字的部分: [00′20″]</p>
<p>   <p> 理應如是守護三律儀:<p> 如是於諸三種律儀淨戒學處,非僅勇受,如其所受隨行防護,不越制限。設少違犯,亦以各各還出儀軌,疾疾令淨。如是淨傳,應知是諸通達聖語扼要智者所喜愛傳,隨諸正士應當修學。<p>  [00′57″]</p>
<p>   我們下面看仁波切的講記,說:此後,「<p> 理應如是守護三律儀<p> 」,宗喀巴大師就在下面開始說,我們應該如阿底峽尊者一樣守護律儀,這很重要。「<p> 如是於諸三種律儀淨戒學處,非僅勇受<p> 」,這裡面說到了「非僅勇受」,是我們在灌頂的時候會受三種律儀,有的人會去求受灌頂,但是在灌頂後要守什麼律儀與誓言卻毫不知情,所以說不能只是敢於受戒。「<p> 如其<p> 」於上師前「<p> 所受隨行防護,不越制限<p> 」,不應該違越根本墮等所有律儀制定的界限,而要好好守護,這是很重要的。 [01′56″]</p>
<p>   這一段說我們要像阿底峽尊者一樣——這宗大師的教誨——像他那樣守護律儀,這是很重要的。那麼首先要具備的是什麼呢?不僅僅是好像去求受灌頂,我們要知道我們所受的律儀與誓言,比如說條目是怎樣的?違犯的界限是怎麼樣?守護到什麼程度?那個邊界我們要去學習和了解。 [02′30″]</p>
<p>   這裡邊仁波切講到「在灌頂後要守什麼律儀與誓言卻毫不知情」,這個我會覺得在我們漢人中間很常發生的,因為有的時候受灌頂,如果沒有翻譯的話其實也不知道是說什麼。還好現在都有翻譯,我們僧團開始有法師翻譯的時候,我們比較知道我們在受菩薩戒,乃至後面要遵守一些什麼學處、要修什麼修法。我覺得我們所受的什麼都不知道這種狀況正在改善。這一句是希望我們要好好地學戒,在求受的時候要去了解那是什麼。 [03′14″]</p>
<p>   然後接著說:「不應該違越根本墮等所有律儀制定的界限」,注意「界限」這兩個字,這裡邊上師提到了不應該違越根本墮等所有律儀制定的界限。大家都知道犯了根本墮之後這個戒律就會失去了,所以這個界限就是我們的心續裡有這個戒律和沒有這個戒律的一種界限,一旦違越了根本墮之後,就會失去這個律儀了。不僅僅是失去律儀,我們還要領受很可怕的果報,因為這都是屬於違背誓言、違背戒律。所以我們一定要非常熟悉地知道根本墮等所有律儀制定的這個界限。 [04′05″]</p>
<p>   這個界限,其實可能就是惡趣與善趣的界限,比如說如果沒有好好守護律儀的話,來世就得不到人身,所以它也是一個能否擁有人身的界限。律儀的界限也是這樣的。所以好好守護為什麼很重要呢?因為得到人身才能學習教法。好好守護這個界限守護的是什麼呢?其實就是我們的一個人身,或者暇滿人身。 [04′37″]</p>
<p>   這一點,別忘了我們常常說的——能夠得到人身這個善趣從哪裡出啊?持戒,從持戒出。如果不好好守持律儀的話,實際上會得不到人身的。像這件事如果佛陀不為我們宣說的話,我們也是不了解的。比如說那我怎樣才能夠擁有一個來世的暇滿呢?再能夠續學宗大師教法,繼續這種美妙航程。雖然在輪迴裡,但是我們值遇了教法、值遇了上師,如何再次地能值遇呢?這件事聽起來是很困難的,但是一定是要得到人身。那麼得到人身的方便到底是什麼呢?就是要好好持戒,清淨持守律儀。所以上師說「這是很重要的」這幾個字,重要到什麼程度呢?不好好守護那個界限,就沒有人身了,就這麼重要! [05′35″]</p>
<p>   接下來再看,說:先不論產生像他勝罪或根本墮這麼大的罪,「<p> 設少違犯<p> 」,即使是稍微違越惡作等罪,「<p> 亦以各各還出儀軌,疾疾令淨<p> 」,這是讚美阿底峽尊者。說就像別解脫戒有別解脫戒的還淨儀軌,菩薩戒有菩薩戒的還淨儀軌,密乘戒有密乘戒的還淨儀軌,就應該立刻用這些儀軌悔除防護來還淨,這是很重要的。這裡所說一點點也不違越制限,就算是犯了也立刻還淨,這就是覺窩傑的行誼。 [06′24″]</p>
<p>   這一段我們會看到讚美阿底峽尊者都沒有產生像他勝罪或根本墮這麼大的罪,就是像惡作這樣少違犯的,馬上各各還出儀軌,疾疾令淨。「亦以各各還出儀軌,疾疾令淨。」這裡邊出現了「各各還出儀軌」,對於各各還出儀軌,後面解釋說別解脫戒有別解脫戒的還淨儀軌,菩薩戒乃至密乘戒都有各自的還淨儀軌。「疾疾令淨」,就是立刻用這些儀軌悔除防護來還淨。然後仁波切又講一句:「這是很重要的!」前面有一個,這邊又有一個。 [07′10″]
<p>   大家好!又到了我們一起學習《廣論》的時間了。前一講我們學到阿底峽尊者持戒的功德,今天我們繼續往下學。 [00′12″]</p>
<p>   新的學員要學習,學了很多年的廣論同學也要再再地憶持——受持戒律這件事,是佛法非常重要的衡量自我修行的一個標準。那麼如何把戒律持得非常清淨呢?我們從沒有戒律到希求受戒、到得戒、到持守律儀,然後到持守清淨的律儀,這個次第是井然有序的。所以對於我們已經受了戒律、擁有戒律的人,我們的目標就是要把戒律持好。 [01′05″]</p>
<p>   那麼我們學習《阿底峽尊者傳》,這裡邊這幾個字非常非常重要:「<p> 亦以各各還出儀軌,疾疾令淨。<p> 」現在很多同學都是受了像別解脫戒,被別解脫戒所攝的有比丘戒、沙彌戒、居士的戒律;還有菩薩戒、密乘戒。這三種律儀它都有各自的——注意——還淨儀軌。 [01′39″]</p>
<p>   看到這個還淨儀軌,不知道我們會不會有像抓到救命繩一樣那種感激涕零的狀態?因為如果佛陀沒有給我們制定還淨儀軌的話,從沒有得到戒律到有戒律,我們怎麼樣能夠守戒守到很清淨?這個過程要怎麼完成呢?是很難達到清淨的這個過程。比如說一旦犯了之後,怎樣能夠「疾疾」——迅速地、速疾地用這些儀軌來悔除、防護,來還淨呢?先要觀察一下自己,有沒有每天根據自己所受的戒律——一條一條的戒律,來反觀自己的身語意的現行呢?那麼看到哪一條犯了、哪一條有一些問題的時候,就是應該用各自的還出儀軌來疾疾令淨。 [02′52″]</p>
<p>   但是現在比如說很多狀態是我們對自己有沒有犯,可能是大的會防護得很緊,一些我們覺得是小的,但是犯了也會墮落的這樣的罪,會不會沒有投注全力以赴的關注呢?我們可以自己觀察一下自己的三業,是不是最糟的狀況可以用毫不知情來形容嗎?這樣會太過分嗎?我們是否應該像算錢一樣要把我們的持犯算得很精準?一定要把它數得很清楚,一條一條數自己的戒律,然後去嚴格地對比戒條,乃至戒條的解釋,還有我們持這條戒的一個標準、純度。 [03′54″]</p>
<p>   等到學到深信業果的時候,我們那個部分會更加詳細地學習,為什麼這個罪是可以淨除的?為什麼惡業是可以完全懺淨的,可以懺悔甚至到可以懺淨的?這裡是有一個原理的。所以受了戒之後,這個還淨儀軌通常善知識都會教的,它是非常重要的! [04′23″]</p>
<p>   如果我們知道有這樣還淨的儀軌的話,我們就沒必要去覆藏了,因為覆藏就會再加一條罪。覆藏是什麼意思呢?就是自己知道自己犯了戒,然後沒有去還淨,把它隱藏起來了。那為什麼會覆藏呢?原因很多種,其中可能沒有好好地了解持犯的規矩,不知道其實透過懺悔、還淨是可以把戒律再皎潔的。包括為什麼會覆藏,是覺得丟臉嗎?我們一定要知道這是一個很重要的點,就是犯了之後如果覆藏的話,自己會付出很大的代價。但是如果知道自己犯了就要馬上用還淨儀軌來還淨的話,這是不是我們透過學習教理,掌握了更多的對付痛苦的苦因乃至苦果的一種智慧,或者是一種行動呢? [05′32″]</p>
<p>   就是當犯了之後,我們的解決方案是什麼?趕快過渡到解決方案的探討上,不要一直在那兒只是懊悔、只是害怕,然後把它藏起來。如果身上有個傷口,把它藏起來,傷口是不會痊癒的,它有一天會爆發得更嚴重!大家認為是不是這樣?如果受了戒之後,我們由於放逸、無知或者煩惱熾盛等等的原因,還有不敬那犯戒四因,犯下了墮罪、造下了惡業。這時候應該要像《廣論》四力懺悔的段落裡所說的,墮罪的部分要依三乘律儀各自的還淨儀軌來還淨,那惡業的部分可以透過四力懺悔來淨化。 [06′24″]</p>
<p>   小乘部派會認為有一些惡業是不通懺悔的,但是從大乘部派的角度來說,即使是犯了根本墮或五無間罪,都是有辦法懺悔的。妙音笑大師在《戒律辨析》中說:「雖然透過四力懺悔可以淨化惡業與墮罪,但所謂的淨化墮罪,是指透過懺悔淨化了墮罪所感得的苦果的力量,不代表心續中的墮罪會消失。」《入行論》中也有說:「菩提心如劫末火,剎那能毀諸重罪。」賈曹傑尊者在《入行論廣釋》中有解釋說:「菩提心具有極強的威力,能淨化定業,如果連定業都可以淨化的話,更何況不定業呢?」 [07′27″]</p>
<p>   所以我們受了戒之後,如果不小心犯下了墮罪,一定要透過三乘律儀各自的還淨儀軌來還淨。注意那兩個字:「疾疾」,就是要速疾、速疾地!那為什麼要速疾呢?因為惡業它會有你不去淨化它就會日夜增長的這個問題。如果惡業增長的話,就意味著痛苦的因在增多,那麼它將來的果報也在增多。每延遲一分一秒的時間,都意味著我們為那個過失、為那個墮罪所付出的代價將會越大,所以佛陀告誡我們要快快地來懺悔、來還淨。透過三乘律儀各自的還淨儀軌來還淨,還要透過四力懺悔來淨化所造的惡業。 [08′27″]</p>
<p>   有一句話說:「知識就是力量。」那麼佛教給予我們的知識是擊退痛苦的力量,讓我們能夠反擊苦因及苦果、有能力在惡業裡翻身,直接把它翻掉。在這個力量裡,「還淨儀軌」還有「四力懺悔」是非常非常重要的部分! [08′57″]</p>
<p>   我們不用帶著:「啊!我要懺悔好像我就是一個罪人!」現在不用定義自己或他人是不是罪人,因為所有苦痛的根源,只是我們把我在五蘊上的安立弄顛倒了,所以就產生了輪迴、產生了一切錯謬和如夢幻般的各種痛苦。當然做惡夢的時候,會覺得那是真的,醒來的人才知道那是夢,在做夢的人不知道那是夢。所以也不要過分地害怕,就說:「唉呀!我造了惡業好像痛苦得不知道該怎麼辦。」想辦法解決!這應該不是絕症,是可以有懺悔的藥來醫治好的。 [09′45″]</p>
<p>   所以一定要好好保護自己的律儀,像愛護眼睛、愛護生命一般愛護自己的律儀,這都是祖師佛菩薩的傳承。希望今天講了這一小段之後,大家能有一種勇氣就是要好好地持戒、好好觀察三業!當我們觀察到有違犯的時候,千萬不要堆在一邊漠視,或是裝作看不見,因為我們學了這麼多年的教理,應該是可以知道的。所以當我們了解了之後,一定要知道這個還淨儀軌還有四力懺悔對於我們的重要性。 [10′28″]
<p>   這一小段,其實就是介紹一種我們不必為沒有好好持守律儀墮落三惡趣提供的方便,就是怎麼樣反擊——可以用還淨律儀來還淨,而且要立刻還淨!因為不立刻還淨,那惡業會增長廣大,會給我們帶來更無法承受的痛苦。那麼我們如何能夠養成:欸,我有發現自己對戒律設少違犯——注意!他那個時候是稍稍違犯了一點,馬上就開始用還淨儀軌還淨,這是大德對於戒律的謹慎和小心的程度。像阿底峽尊者從印度遠赴西藏的這個艱辛路程中,他都是這樣做的,如此艱難的路程! [00′52″]</p>
<p>   我們很少有這種行程的勞苦,因為現在交通工具也很方便了,不用付出那麼大的代價。如果我們不用付出體力這樣的辛苦,都在一個固定的地方,可以看看尊者的行誼,再檢查一下我們自己對戒律的態度,有沒有覺得還淨儀軌還有四力懺悔在我們的生命中是多麼多麼重要的一件事情? [01′25″]</p>
<p>   如果我們特別特別珍貴的衣服或者什麼,一下子不小心噴到了髒東西,如果可以清洗的話,我們就會趕快早一點清洗乾淨,因為時間長了會覺得很難洗掉,或者洗掉了也洗不那麼徹底。我們可能就是也不吃、不睡,不怕困難地找各種辦法把它清洗乾淨。像打掃衛生的時候,比如說那種特別特別負責任的打掃衛生的同學,就會找各種方便把鋪地毯的地方啊、還有地板縫裡、門下面那個縫隙裡,都要把它弄得乾乾淨淨。我們對於染汙戒律的這個事情,也要發揚起這種精神,找到那種隱秘的過失把它懺悔乾淨。 [02′18″]</p>
<p>   在我們的現行裡是有這樣一部分——我們不喜歡看見髒的東西,我們想把它洗乾淨,一個很乾淨的東西弄髒了之後,我們會心裡不舒服,想把它洗乾淨。那我們心續裡這麼珍貴的跟佛菩薩、上師所受的這個律儀,如果它染雜了或違犯了,我們怎能不想各種辦法,用還淨儀軌把它還淨呢?這應該是我們受戒之後要練習的一種反應、我們對境的一種反應。比如對境要檢查自己有沒有犯,犯了之後,不是趕快隱藏起來不要讓別人看到;也不是嚇得臉色蒼白,然後大腦一片空白,兩眼發直,不是這樣的!我們要想:佛菩薩、經典裡告訴我們,要怎麼樣去解決這種狀況呢?要採取解決方案。佛陀有教給我們辦法啊!就是要用還淨儀軌來還淨,數數懺悔,對不對?要懺悔令淨,疾疾懺悔。仁波切說這是很重要的,「立刻」,這裡邊強調了立刻! [03′35″]</p>
<p>   對於我們受了戒律的人來說,我們在內心中是否把還淨儀軌看得非常重要,而且非常熟練,能夠善巧地把自己的律儀一點一點地、一點一點地,後來就越來越快地、越持越皎潔,這應該是我們需要訓練的一種基本功、一種本事。因為如果這個功夫不夠,嚴重地說,就是會威脅到我們來世的人身,就沒有當人的權利了!因為如果我們的戒律染著的話,根據因果這樣去推算,沒有在這一生好好地把它淨化,那怎麼能期待生生世世的暇滿呢?所以這個問題是非常嚴重的,不管有多難都要學會! [04′29″]</p>
<p>   不管我們的心裡多麼地不習慣,我們要引導自己的心找各種辦法,讓我們學會連貫性的思考:道次第上,惡趣的苦怎麼辦呢?要想皈依。那為什麼我們去皈依了之後,可以救拔惡趣的苦呢?就要談到佛陀的功德。當我們的戒律有染著的時候,佛陀要我們怎麼做?立刻要還淨儀軌,而是要疾疾呀!要立刻呀!不僅僅要還淨儀軌,之後還要用四力懺悔。[05′02″]</p>
<p>   相信用還淨儀軌可以還淨嗎?那相信佛說的嗎?有各種教理可以推呀!所以我們一定要建立這樣的信心,建立這樣的習慣。為什麼我們的心可以有這樣的習慣呢?因為心是無自性的,你朝什麼樣的地方串習,它就會養成一個什麼樣的習慣。那當然我們要養成一種離苦得樂的習慣,養成一種苦越來越少、樂越來越多的習慣!而還淨儀軌和四力懺悔,就是讓我們離開苦的一個非常非常偉大的方便。 [05′39″]</p>
<p>   所以讓我們不僅僅是發願,要用行動,要學習先輩祖師們像阿底峽尊者這樣的行誼呀!因為就像我們的偶像、像我們的導師一樣,他走在前面,也走在身旁陪伴著我們,要怎麼樣地脫離惡趣對我們的這種恐嚇,真正地用我們所學的教理改變自己的思想、改變自己的行為,也就是達到一個消滅苦因,也就消滅苦果了。所以才有那句話嘛——凡夫畏果,而菩薩畏因。 [06′27″]</p>
<p>   怎麼樣把自己變成是由於害怕結果,要趕快在因上去解決呢?這就是一個改變習慣的問題。希望大家能夠勤勉地檢查我們自己的三業,好好地向阿底峽尊者還有很多持律大德學習。 [06′51″]
<p>   所以宗大師說:「<p> 如是淨傳,應知是諸通達聖語扼要智者所喜愛傳<p> 」,這樣的傳記是讓通達聖語扼要的智者非常歡喜的傳記。宗大師接著說:「<p> 隨諸正士應當修學<p> 」,如同覺窩阿底峽尊者一樣,我們也應該隨學清淨持守自己相續裡的戒律。在這點上要特別用功,仁波切交代要特別用功。接著又說了:「這很重要!」這段就是「殊勝戒學」的結論。 [00′42″]</p>
<p>   有沒有注意到這一段仁波切講了幾個重要?三個重要。對不對?不能對自己所受的律儀、誓言毫不知情,然後不應該違越根本墮等所有的律儀制定的界限,而要好好地守護,這是很重要的。 [01′03″]</p>
<p>   接著說什麼呀?別解脫戒有別解脫戒的還淨儀軌,乃至菩薩戒、乃至密乘戒有各自的還淨儀軌,應該立刻用這些還淨儀軌悔除防護來還淨,這是很重要的,對不對?稍微有一點就要還淨。 [01′22″]</p>
<p>   接著說什麼呀?我們要隨學阿底峽尊者,清淨地持守自己相續裡的戒律,在這點上要特別用功。因為如果不特別用功就學不會,就會淹沒在原來沒受戒的那個習慣裡邊。沒受戒的人是不用管自己戒律的,因為他不需要防備。就像你身上帶個無價之寶,有的人沒有寶貝,他不用防著自己的三業的煩惱來偷盜這個珍寶,如果不特別用功的話,有人還會忘記了自己的萬貫家財就是戒律。這是很重要的,要特別用功!特別用功要怎麼用功呢?應該是每天用功吧!時時用功吧!對吧?率爾、率爾觀察什麼?觀察三業,「<p> 晝夜唯應觀察自心,豈有餘事?<p> 」這都是祖師們用功的語錄和方便。 [02′22″]</p>
<p>   所以這一小段就這麼多字,但是阿底峽尊者是怎麼樣持戒的?就是這樣持的。那上師對我們的希望是什麼呢?在學戒律上——清淨持守自己相續裡的戒律上,要特別用功。我們不用把時間花在是是非非的抱怨啊,或者發一些無聊的哀傷慨嘆,因為覺得苦啊!其實真正能夠讓自己去除苦的因就在當下,對不對?持守律儀、讓自己染著的律儀還淨。這一刻如果我們能夠這樣努力地在內心中實踐上師的教言的話,應該這一刻比什麼都珍貴吧!因為戒律是佛菩薩送給我們的禮物,就像人身是上師、佛菩薩送給我們的禮物,也可以說是父母親送給我們的禮物。 [03′24″]</p>
<p>   那我們怎麼樣用這個人身來得到生生世世的這種增上生?怎麼樣去獲得呢?一定要依靠戒律。那麼戒律怎樣能持守清淨呢?這三個重要,這一段要好好地學!不要聽過了,說:「這個我已經聽過了。」聽過了,有沒有記住?記住了,有沒有常常串習?串習有沒有成為習慣?有沒有油然而生、已經不費吹灰之力地就擁有這種習慣?希望我們一起在這一點上要特別用功,這是非常非常重要的! [04′01″]</p>
<p>   佛陀也教導說要以戒為師。 [04′08″]</p>
<p>   接下來讓我們看「成就定學」,在 123 頁中間的部分。<p>   <p> 成就定學,分<p> 共與不共<p> 二:共者,謂由奢摩他門,得堪能心。不共定學者,謂具極穩生起次第。此復三年或六年中,修明禁行。爾時遙聞飛行國中諸空行母謳歌之聲,心中亦有所憶持者。<p>  [04′44″]</p>
<p>   接下來說到具足增上定學的道理。「成就定學」這個第二科,如果白話解釋一下就是:成就定學分為共通與不共通二科——共通的禪定的功德,是透過奢摩他,讓心可以自主運作;不共的定學,是要具足非常堅穩的生起次第。尊者曾在三年或六年當中修持明禁行,當時遙聞飛行國中諸空行母的歌聲,並且能憶持於心。 [05′27″]</p>
<p>   阿底峽尊者成就定學的功德,分共與不共兩種。共通定學之理,「<p> 謂由奢摩他門<p> 」,奢摩他就是顯密共通的道,修密也需要修止,修顯教也需要修止。「<p> 由奢摩他門,得堪能心<p> 」,就是修定能夠得到堪能心。獲得了奢摩他,就會生起身堪能和心堪能兩種,就是共通定學。這個「堪能」在後面答疑的時候有答到,到最後再看答疑就可以了。 [06′07″]</p>
<p>   接著說「不共定學」,「<p> 不共定學者,謂具極穩生起次第<p> 」,就是相續中擁有密法生起次第的道與一切證悟,這是指不共定學。「<p> 此復三年或六年中,修明禁行<p> 」,明禁行是什麼呢?就是閉關修習本尊。那麼為什麼是三年或六年呢?是不確定的意思嗎?不是的,是因為這個三年和六年是同樣的意思。因為我們的半年在印度就被算作一年,也就是指在印度所算的六年,或我們的三年中,尊者都堅持住關。 [06′59″]</p>
<p>   「<p> 爾時遙聞飛行國中諸空行母謳歌之聲,心中亦有所憶持者<p> 」,這是獲得生起次第證德的徵兆。鄔金就是「飛行國」,有些人說就是指現在的巴基斯坦或者阿富汗那一帶,這地方以前密法是非常興盛的,蓮花生大師就是那裡的人。他們修持密咒之後非常厲害,可以在空中飛行,所以稱為鄔金,翻譯為「飛行」。尊者在閉關入定的時候,耳中聽到了阿富汗那一帶空行母歌唱的聲音,而這個歌中的內義就烙在了心裡,於是把它記錄下來,尊者的成就已經達到這樣的程度!這是獲得生起次第的證德。 [08′01″]</p>
<p>   關於這個飛行國,它是古印度的一個國名,又名鄔金、鄔僅,還有鄔仗那,就是指現今巴基斯坦西北邊的斯瓦特河流域。又有一種說法,說它在阿富汗境內。曾經是佛教國家,鼎盛時期到什麼程度呢?國內有僧眾一萬八千位,盛行大乘教法,特別學習密咒,境內的佛教遺蹟不可勝數。這是在《新譯大唐西域記》裡有記載。 [08′44″]</p>
<p>   關於在阿富汗和巴基斯坦那一帶,以前密法是否是非常盛行的?說巴基斯坦、阿富汗那一帶,在它出土的文物當中,也可以看到很多密法的佛像、密法的法器,足以證明過去這裡是密法非常非常興盛的地方。說有一種大威德的密續,在過去鄔金地方的人全部都修成了,有這樣一個說法。不只是能飛起來,而且是已經成佛了,那一帶幾乎是沒有人了。有一部大威德的那個講義裡面是這樣講的,大威德的傳承實際上也是拉里達金剛從阿富汗,就是鄔金那邊請來的。 [09′36″]
<p>   接下來看到 125 頁,19 年前的我在提問題——我不知道這個問題該不該提——就說生起次第的「不共定學」跟「共通定學」區別在哪裡?然後說顯宗和密宗。我就有點奇怪為什麼是顯宗和密宗?然後說:「不共之處在哪裡?」仁波切說不共之處就是要把自身觀為佛身、觀為本尊來修,這就是不共的。 [00′33″]</p>
<p>   然後又問:「極穩生起次第」是什麼呢?仁波切答道:完全能觀為佛身,是生起次第的成就。然後問「極穩」是什麼?「極穩就是不變,就是自身完全能轉變為這個本尊。」以前也聽說過有人觀修大威德,走過門的時候就要低頭,因為他覺得可能會碰到角,就是說已經達到了他平常的時候生起佛身的這樣一個成績。 [01′01″]</p>
<p>   然後這裡面問:「二六時中都是這樣子,還是修法的時候?」「修法的時候完全觀為本尊,這就是不共的修法。」然後仁波切接著說:「定力是很高的。定力到什麼程度呢?就是在很遠很遠的佛國淨土裡的那些空行母的歌聲也是可以聽到的。如果是共通的這個奢摩他的定力是沒有這麼高的,就只能把自己的心降伏。」這裡面區分了一下生起次第的不共定學到什麼程度。我覺得我們聽了之後,可能也很難想像那是什麼,就要發願去修習。有在聽嗎?有在認真聽嗎? [01′45″]</p>
<p>   接著就解釋那個「堪能」,說尊者由奢摩他門得了堪能心,那麼這個「堪能心」是什麼呢?在這裡面仁波切舉了牛皮的譬喻,說西藏很多用氂牛來比喻。一張乾牛皮是很硬的,你怎麼也用不上,把它加工成軟軟的,做什麼都可以。這個來譬喻我們的心,心也是這樣的,它是很硬、很難調伏的。很硬、很難調伏的狀態是什麼狀態呢?就是我們沒有修習奢摩他的那個狀態。 [02′24″]</p>
<p>   我們會感覺到我們的心很硬嗎?很堅硬嗎?我們都覺得:我的心很柔軟、很敏感啊!對什麼好像都一下子就能感受得到,怎麼會是心很硬呢?後面有幾個字——很難調伏的!那麼用什麼來調伏啊?開始用戒定慧三學,對不對?那你看看我們持戒的時候這個心聽不聽話,你就知道它硬不硬了、堅不堅硬了。我們修定的時候,比如說念「南無觀世音菩薩」,我們能不能保證念珠念一百零八次都一個念頭不閃?「南無觀世音菩薩,南無觀世音菩薩,南無觀世音菩薩......」每一聲稱名,都一字一句念得清楚、聽得清楚,都落在心裡邊,沒有一個錯亂的,能不能一百零八句都這樣呢?還有的人上來可能兩句,第三句就不見了;有人說「南無」還清楚,「觀世音菩薩」這幾個字就不清楚了。 [03′36″]</p>
<p>   所以修定就是要了了分明。接著仁波切解釋,讓我們這個心可以做很多事情。成就奢摩他之後,不僅是心,身體也能自在地使用,怎麼使用都可以。這個自在地使用是什麼意思呢?就是你讓它做什麼,它就乖乖聽話了,我們的心就聽話了。「堪能心」就是你的心隨便怎麼用都用得上。不然的話我們的心就很難對付,它是一剎那也控制不住的。舉個簡單例子,像背書也是,你就想特別專注地背書,但你的心就是想要去散亂、就是不想專注,甚至有的時候你想一剎那間把它按在那個經典的文句上,它好像都在掙扎一樣,所以是非常非常不聽話的。那麼奢摩他已經達到一定成就之後,你的身心就安住下來了,怎麼放都可以。 [04′35″]</p>
<p>   所以仁波切在這一小段解釋堪能的時候,我不知道會不會給我們這些鬥士——一直在跟自己戰鬥的修行者一個很大的希望?因為我們現在也在學習止觀嘛,前面需要好好學戒、持戒,如果能好好修行奢摩他得定的話,那就會有堪能心;有堪能心的話,我們的心隨便怎麼用都可以用得上——身也堪能,心也堪能。就不是一剎那也控制不住的問題,而是一直都能控制住它,甚至不用控制它,它就像風一樣跟著走了,是非常輕鬆自如的一種自在的方式。所以並不是修學的很多過程都是很難熬的,一旦到了這個階段,如果進入了初禪的話,那快樂是太多了,可能都覺得這個身心好像都承載不了了,所以是非常非常愉悅的。阿底峽尊者得到了這個堪能心,顯教的這個定,還有不共定學,可以想像他的身心是處在一種法的深度的愉悅之中。 [05′50″]</p>
<p>   討論什麼叫「堪能」的時候,我問大家說:「你覺得自己的心很堅硬嗎?」這個時候要怎麼去看呢?比如說:其實我知道不應該抱怨別人,因為我應該用感恩心感恩這一天好像是很平常的這些事物。比如說我們可以吃到飯,像現在在疫情期間,我們這一餐飯是來之不易的,是很多很多那些一直沒有停止工作的人,他把這一餐飯送到我們眼前。能吃到菜、能吃到水果,都是很不容易的!但是如果不去作意觀察的話,就像每天一樣,覺得這一切都是自然而然擁有的,都沒有什麼奇特的。可是認真地去想的話,可能是每一個水果、每一個米粒都是別人在我們生命中鑄造的奇蹟,是禮物、是珍貴的禮物!乃至我們現在上課,我們能學到這本《四家合註入門》,學到宗大師的教法,學到阿底峽尊者的功德,這依然是一個生命裡非常奇蹟的相遇。 [07′03″]</p>
<p>   所以我們要試著說服我們的心。覺得一切都理所當然、好像也沒有什麼大不了的這種很浮面的看事情的心,要去深度地觀察轉動它的時候,用正理去轉動它的時候,我們才會感覺到那是很堅硬的。如果你不去轉動它的時候,因為你跟著煩惱跑,你是不會覺得它很堅硬的。所以調伏——用戒的力量、用奢摩他的力量,讓我們的心變得柔軟,從那個鋼鐵變成非常柔的、像綢緞一樣那樣的柔軟度,這個就是戒律和定可以燒煉我們的身心。 [07′45″]</p>
<p>   並不是這個心我們拿它永遠沒辦法,它要苦就苦、要抱怨就抱怨、要發脾氣就發脾氣、要耽著五欲就耽著五欲,我們拿它沒辦法,只能隨逐。佛陀就給我們講了這麼多辦法,傳承師長講的都是辦法,說要想法用戒、定、慧去對付自己的心,要把這個非常剛強難調的堅硬的心,把它調到柔軟、調到堪能。那個時候,最艱難的那個壓伏心的過程,其實到這兒就已經太順了。所以應該去體會生命中生起奢摩他,甚至不共定學的那個深度愉悅。 [08′29″]
<p>   接著討論了一個持戒的正知、正念的問題。我們自己受了什麼戒律要知道——多少條?什麼樣的狀態下叫犯?什麼是根本墮?根本墮不能犯,犯了戒律就沒有了。戒律沒有了,還會有惡趣的果報,這個時候要懺悔。那麼行持的時候,正念就非常重要。注意!在念頭的前面有一個「正」字,正念和正知通常都放在一起。仁波切會認為正念是很重要的。這個時候這法師說:「行持時是要把正念先提起來嗎?」我覺得其實他是知道的,有的時候到了自己的善知識面前,好像自己了解過的東西再問一遍、再確定一次。我不知道你們有沒有這樣的經歷?我是有很多的,再問一次,再得到一次,會得到一次加持。 [00′58″]</p>
<p>   上師接著講——注意——正念要提起來。我先問大家一個問題:正念很重嗎?正念飛過來就可以了,為什麼要提起來?提東西,費力否?費力否?大力士提東西是不費力氣,但是力氣不足的人提一個重東西,他是會費力氣。當我們開始訓練力量,訓練不夠的時候是很費力氣的,所以一開始要提正念的時候,可能會覺得乾提也提不起來,好像很重的樣子。可是正念又很重要,正念不提起來的話,連想都想不到。就是我們要去找正念,找到之後把它拉過來,把它拉住、提起來。 [01′54″]</p>
<p>   接著又說:正知也很重要!正知是什麼呢?新學員常常說:「正知是什麼、正念是什麼?」比如說上課的時候要專心聽,這是什麼?是正念嗎?然後你用你的注意力看:「我有沒有專心聽?」偶爾看一下,這什麼?正知,看你的正念在不在。正知是看著誰的?看著正念的。對不對?所以正知就是觀察,正念就是仁波切在這裡講了,好比《入行論》裡邊講的:你在打仗過程中要用的刀劍。這是比喻什麼?正念。劍要掉了之後,馬上要撿起來。正念就是這樣的,正念掉了馬上要撿起來。 [02′39″]</p>
<p>   《入行論》說:「<p> 戰陣失利劍,懼殺疾拾取。如是若失念,畏獄速提起。<p> 」來了,那個點來了!正念好像很重,提也提不起來,甚至找不到,那怎麼辦呢?如果正念掉了,就是這個寶劍掉了,怎麼辦呢?「<p> 畏獄速提起<p> 」,沒有正念會墮落地獄的!要去憶念三惡趣的這種痛苦,害怕墮落地獄,然後把這個劍提起來。在戰場上寶劍要是掉了的話,要馬上撿起來,否則敵人就會趁機殺掉自己;正念也是一樣的,一旦失去,就必須要觀察到地獄乃至惡趣的痛苦,真的要能夠把這個心調整過來。你不願意提,不願意提,你怎麼說服這顆心呢?就要去想一想地獄的痛苦、三惡趣的痛苦。 [03′51″]</p>
<p>   想了一遍,那個心不理你,沒用!你再去深入地想。想到什麼呀?調整過來。就是對這個地獄、對惡趣的苦有感覺,感覺是什麼意思啊?就「畏」字,開始害怕!害怕然後就提正念了。這是不是一種調伏啊?說如果沒有正念,正知也是生不起來。有了正念,然後用正知來觀察做得對與不對,用它來分析。這是仁波切在解釋正知、正念。 [04′24″]</p>
<p>   這一段,我認為是非常精采的用功教授,諸位覺得呢?提正念,可能平常的時候我們會覺得好像很容易提的樣子,但是一旦自己被惹到了,就只想對眼前那個惹你的人發脾氣;提正念要忍耐呀,或者要憶念三寶、祈求上師啊......這個時候提正念就看起來有點困難。這個時候就要觀想什麼?這裡邊說:「畏獄速提起」。這是一個。還有什麼?「<p> 如樹應安住<p> 」,對不對?那都是《入行論》教給我們用功的方式。 [04′57″]</p>
<p>   最重要的是:知不知道失去正念了呢?劍掉了,有的人還往前跑呢!還往敵陣裡衝殺,還覺得挺厲害的,他揮舞的已經不是他的寶劍了。這個時候煩惱的敵人就會趁機毀掉我們,就會種下很多墮落三惡趣的苦因。這一刻應該畏懼它,所以說「菩薩畏因」。畏因就是當下,當下自己發脾氣、口無遮攔說的那些,好像說得很痛快,但是地獄的業就造下了,惡口啊等等這些就造下了;造下馬上要有一個心知道:「哇,這在造惡業,造惡業會墮落的!我是一個有戒律的人,我不可以這樣做!」當想這些的時候,正念提起來了嗎?已經在提起來了。所以再穩固它、穩固它,就會把那種造惡業的續流擋住——如樹應安住。到處都能夠看到樹,看樹的時候,只是在想這個樹漂亮啊,在藍天下很好看啊,還是會憶持到可能每棵樹都會提醒我們:持戒的狀態就是如樹應安住,要讓我們的心住在正念裡。 [06′20″]</p>
<p>   當我們的心進入怨氣,就開始埋怨,有的人就是把一生變成一個帳本,沒事翻一翻,就開始抱怨。抱怨的這個河一開的時候,哇!非常非常地誇張,什麼都可以怨。怨、怨、怨,怨天尤人,自己苦不堪言。那麼,我們也知道人身得來不容易、佛法遇到不容易,就這兩點我們也可以念恩。能否這個時候也提起正念:給我一個人身不是用來抱怨的,我們要用它來修行大乘法,來持戒、好好地持戒。因為抱怨、抱怨,由於造口業就會犯到戒律。 [07′03″]
<p>   有了正念之後,正知才會有。正知反過來再去守護這個正念,去觀察正念在不在?不在,趕快要提起來。這就是一個武士練劍的過程,當我們的劍掉下要立刻拿起來,不能耽擱。這個「畏獄疾拾取」,就是因為害怕被殺所以要立刻提取寶劍,這個速度的問題。又提到一個速度,對不對?前面說:受了戒之後,如果有染著或者有一些違犯,要疾疾——又是一個,立刻要——還淨!這裡邊說:正念不見了,要立刻——趕快把我們的正念找回來!他這個對境的反應、對這種狀態的反應,你看這個修行人已經非常地機敏。他是一個經驗非常豐富的戰士,在戰鬥內心的時候他學會了迅速行動。他不會坐在那裡哀號或者怪別人,說:「因為你們環境這樣,所以我修行不好、所以我生惡念。」他不是這樣,他馬上把劍提起來! [01′07″]</p>
<p>   這就是要練習的一個本事。因為防範自己造下三惡趣的因,我們不可能把這樣的責任交給別人。因為這個心續是你的心續,你得防止它下一段走到惡趣,這個方向是自己確定、自己作主、自己編排下一生要去哪裡。那麼如果我們知道我自己就是我下一生的導演,我豈能把我下一生的劇本演成地獄呢?演成餓鬼、畜生呢?甚至演成一般的人我們還不高興,我們要演成非常尊貴的人,又有智慧、又有美貌、又能忍辱,辯才......什麼都有的完美的一個人。但是這個都是自己導演的,都是自己這一生要造作的業,以後才會得到這樣的結果。 [01′59″]</p>
<p>   所以這個正念,對於我們造作這樣的業,它就是一個根本條件。就像勇士的寶劍一樣,要練習迅速提起來、迅速提起來!那麼如何知道自己的正念不在?正知要警覺著。比如說遇到特別容易生煩惱的這個對境的時候,自己要有個防範心,說:啊,一面對他我就容易生煩惱,要有個警戒心!當心慢慢在滑落,甚至很快地滑落,向深淵滑落的時候,自己必須要「如樹應安住」——把心收回來,從境上收回來,看看自己的心在幹什麼。所以比丘會常常垂簾,對吧?說「視軛木許」,那垂簾不是眼睛垂下來就沒事、在休息,是在觀察什麼?觀察自己的三業,是看自己在做什麼。 [02′55″]</p>
<p>   我們對自心的了知是不是變得非常重要?現在通訊這麼發達,我們急著去了解世界發生了什麼,這兒發生什麼、那兒發生什麼,現在有距離和沒距離已經差不多了,馬上就會知道。我們會非常非常急於了解各地的事情,但是對我們心裡邊正在發生的事情,我們了解嗎?如果不去觀察的話,是不了解的,不可能透過手機啊、電腦啊,或者電視等等這些高科技的工具去了解。我們必須要透過什麼?向內觀察。用正知去觀察,用觀察力向內心看,用這種方式了解我們的心正在上演一種什麼劇本——是暇滿人身的續篇,還是三惡趣?必須要知道它在往什麼地方導演,然後我們要及時地修正。如果是好的劇本,那就好好地演;如果是非常糟的、苦不堪言的那種劇本,就一定要把它改寫,絕對不能變成悲劇! [04′10″]</p>
<p>   所以對於修行人來說,向內觀察,得到內心的消息,得到內心的實況轉播,知道內心正在幹什麼這件事,就變成是首要任務,非常非常重要!因為如果不知道自己的心在幹什麼,不觀察,我豈能知道我有沒有在持戒呢?如果也發現不了有沒有犯,那就更想不到後面的還淨儀軌,一連串都是從有沒有失去正念開始的。所以正念這件事,比如說這把劍是保護勇士的生命的,那麼這把劍也是保護我們來世的暇滿——增上生。 [04′55″]</p>
<p>   這把劍是什麼?正念! [05′00″]</p>
<p>   所以作為修行人,有人說很難,其實也不難,訓練正念就好了。怎麼訓練啊?正念從哪裡來?從經典來,對吧?從親近善知識、聽聞正法獲得的正念;從戒律持守,從受的律儀上也會得到正念。還有大家每天在堅持聽全廣、堅持上研討班,在《廣論》裡全都是提醒我們訓練正念,耳朵聽進來,記住多少呢?沒記住多少,就一週上兩次啊,甚至有的同學每一天都聽《廣論》、每天都研討。像在疫情期間,我聽說有一些同學,有的一天上四個班,真的是很精勤地在用功。我還聽到有人說他可以聽《廣論》八小時,一直看書,用功八小時,比學校裡的學生還用功。我們有很多居士很用功,出家人在寺院裡也是在拼命用功。所以這個正念是可以養成的,養成這種正念的修行。大家一定要加油! [06′07″]
<p>   大家好!很高興又到了我們一起學習《廣論》的時間,今天我們要繼續學習阿底峽尊者的功德,到了阿底峽尊者成就慧學這樣的功德。請大家把書翻到《四家合註入門》128 頁,看最下面的那一段黑字的部分。現在跟我看原文: [00′28″]</p>
<p>   <p> 成就慧學,<p> 分共不共二者:其<p> 中,共者,謂得止觀雙運毘缽舍那三摩地。不共者,謂得圓滿次第殊勝三摩地。<p> 獲得圓滿次第幻化身故,不由業惑增上受生,於心續中生起即身成佛之道。<p> 如《讚》中云:「如密咒乘教,顯是加行道。<p> 」 [01′03″]</p>
<p>   下面我們來看仁波切的講記。下面說具足殊勝的慧學,這個殊勝慧學也分成共與不共兩種,那麼具足共通的殊勝慧學是指什麼呢?看到這個問題的時候,不知道大家心裡有沒有什麼想法?什麼是共通的殊勝慧學呢?下面就有解釋了。「<p> 共者,謂得止觀雙運毘缽舍那三摩地<p> 」,就是指獲得了止觀雙運。那麼現在我們在《廣論》後面的奢摩他部分正好是講到止觀雙運,什麼是得止、什麼是得勝觀?然後止觀雙運這個概念,可能大家聽到那部分會對這部分更清晰一些。 [02′00″]</p>
<p>   「止觀雙運毘缽舍那三摩地」,就是指寂止和勝觀兩者的力量相等運行,就被稱作止觀雙運。我們知道說一般是先獲得奢摩他,之後獲得毗缽舍那,獲得毗缽舍那的時候就同時獲得了止觀雙運。「三摩地」是梵語的音譯,義為等持、定,指專注在所緣上的一種心所。在我們講奢摩他的部分的時候,注意到說得止的時候有一個身心輕安,在得止的基礎上繼續觀慧去觀察的時候,還要有個身心輕安,這是一個量,大家別忘了! [02′47″]</p>
<p>   「共者」就是獲得了止觀雙運的三摩地。那麼,在共道的基礎上還有「<p> 不共<p> 」,「<p> 不共<p> 」是什麼呢?就是「<p> 謂得圓滿次第殊勝三摩地<p> 」,就是指獲得了圓滿次第的三摩地。那麼「圓滿次第」,是無上瑜伽密法的第二個次第,以修力令風息進入安住並融入中脈,由此產生的瑜伽即是圓滿次第。 [03′23″]</p>
<p>   在此語王尊者做了一個箋註,說:「<p> 獲得圓滿次第幻化身故,不由業惑增上受生,於心續中生起即身成佛之道<p> 」,解釋一下就是此生就會成佛。如果今生成佛了,那怎麼還會有受生呢?是不會由業惑增上受生的。所以他獲得了圓滿次第的幻化身,就在獲得了光明、幻化雙運的時候就成佛了。所以這也是不共慧學的一個成就。 [04′06″]</p>
<p>   再回頭我們再看一下,這裡邊涉及到說「圓滿次第幻化身」,這個「圓滿次第幻化身」就是指圓滿次第五個階段中第三個階段的時候所獲得的功德。密乘行者在修習心遠離到達究竟,依靠喻光明獲得了不淨幻身的時候,就獲得了此處所說的幻化身,修行者一旦獲得此身的話——注意!後面那幾個字——就決定了即身成佛。所以就是一個最圓滿的成就吧! [04′45″]</p>
<p>   關於這一段,因為《菩提道次第廣論》主要是沒有涉及到密法的部分,這就涉及到阿底峽尊者功德的部分講到這一點,希望大家能夠發起對於經典還有實證的很多教授,進行廣泛地、深入地學習的這樣的一個希求心,因為「為利有情願成佛」,願速疾成佛! [05′11″]</p>
<p>   下面我們接著看。「<p> 如《讚》中云:『如密咒乘教,顯是加行道。』<p> 」在這一個部分仁波切講了一個翻譯版本的問題,這個「《讚》中云」這句話,中間還有《八十讚》中的兩句,在這個《菩提道次第》的引文中、在一些版本裡沒有出現。下面會講到,漢文翻譯這個版本是青海版的,這個書上是有個記號的,這裡邊有個問題,這兩句有點不通,為什麼?因為它中間有偈子。但師父說:很早以前就是這樣的,很多木刻版當中也全部都是這樣流傳下來的。 [05′58″]</p>
<p>   說:「如密咒乘教,顯是加行道。」密乘並沒有說加行道,顯乘才有說加行道啊、見道啊、修道,所以有個問題。應該另外加上兩句:「<p> 如密咒乘教,生次必堅固<p> 」,就指獲得堅穩的生起次第,接著再加上後面那句:「<p> 如顯教論中,顯是加行道<p> 」,這樣就很恰當,就可以理解了。 [06′34″]</p>
<p>   但是過去的大師在解釋的時候,都是現在這兩句,法尊法師翻譯的時候也沒有去更正、沒有發現。在這個青海版在印行的時候,有個阿拉・夏日東仁波切提出了這個問題而做了記號,可是在過去的《廣論》版本當中都是沒有的,西藏的版本也沒有,安多的、德格版的都沒有。但是,因為它那個《讚》就是《八十讚》,在《八十讚》的原文中就有出現「生次必堅固,如顯教論中」這兩句,所以在這個部分交代一下。 [07′11″]</p>
<p>   那為什麼會「如密咒乘教,顯是加行道」呢?如果解釋一下,在圓滿次第中有五個階段,分別是什麼?語遠離、心遠離、幻身、義光明、雙運。前三個階段相當於顯教的加行道,注意!是相當於顯教的加行道;第四個階段的前段——第四個階段就是義光明,對吧?義光明的前段——就屬於見道,後段屬於修道,這都相當於的;第五個階段相當於菩薩十地中的第二地無垢地以上。密乘的教典中其實並沒有宣說顯教所說的五道,因此僅能把密法五次第與顯教的五道相對照一下,但不能說依照密乘的教典來看,尊者是加行道的行者,只能理解為密乘教的教典來看,尊者相當於顯教中的加行道行者。 [08′18″]</p>
<p>   給大家略微了解一下,擴展我們的閱讀吧!深廣閱讀,希望大家對廣大的道次能夠生起很強的希求心。因為很多很多的修行者在修行的時候,尤其是讀到了這麼清淨圓滿的傳承教授的時候,都一開始就要發心「為利有情願成佛」,而且要速疾成佛。所以在講到阿底峽尊者的功德的時候,我們會看到由顯入密,跨越了這樣的道次第,顯示了一個修行者在他示現為比丘的一個暇滿人身的階段中,他能顯現的成就的高度,令人心生渴仰啊! [09′07″]
<p>   在阿底峽尊者獲得了殊勝的功德之後,於聖教所作的事業。請大家翻到《入門》的 130 頁,「<p> 於聖教所作事中分二<p> 」,我們可以看一下原文。 [00′23″]</p>
<p>   <p> 於聖教所作事中分二:一、於印度所作事理;二、藏中所作事理。今初:<p>   於勝金剛座大菩提寺,曾經三次以法戰敗外道惡論,住持佛教。即於<p> 內道佛乘上部之中觀、唯識;下部之一切有部、經部<p> 自部上下聖教,所有未達、邪解、疑惑諸惡垢穢,亦善除遣,而弘聖教。故一切部,不分黨類奉為頂嚴。如《讚》中云:「於大菩提寺,一切集會中,自部<p> 內道<p> 及他部<p> 外道<p> ,諸惡宗敵者,以獅吼聲語,一切腦漿崩。」又云:「能飛聚落中,出家二百半,能映覆戒中,出家不滿百,四本部全住,尊部無慠舉。摩羯陀境內,一切寺無餘,成大師<p> 比丘、比丘尼、優婆塞、優婆夷<p> 四眾,一切頂上珠。<p> 覺窩尊乃天佛智足所傳大眾部支派之說出世間部,然不偏黨自部,能不紊雜分辨各部,故<p> 尊居十八部,一切頂中時,一切皆受教。」<p>  [02′16″]</p>
<p>   我們看 131 頁仁波切的講記,第三個科判前面「其身獲得功德事理」已經結束了,這裡是「於聖教所作事業」。「於聖教所作事中分二」,就是阿底峽尊者於聖教所作的事業有兩個科判,第一個就是「<p> 於印度所作事理<p> 」,第二是「<p> 藏中所作事理。今初<p> 」。對聖教所作的事業是以弘化區的地域,比如說印度、西藏這樣來做了科判。那麼在印度對聖教做了什麼事業呢?「<p> 於勝金剛座大菩提寺<p> 」,「大菩提」是聖像的名字,指的是金剛座裡邊的大菩提聖像,就是一尊世尊的聖像。這座寺院因此被稱為大菩提寺。這裡邊記載說:「<p> 曾經三次以法戰敗外道惡論,住持佛教。<p> 」之前外道在印度製造了許多令佛教困擾的事情,如果不能夠辯論勝出外道的話,連同寺院裡的弟子,一切都必須歸入外道的教法,這是非常危險的。尊者在金剛座,三次戰勝很厲害的外道導師而住持佛教,這是擊敗外道的事蹟。 [03′50″]</p>
<p>   在《師師相承傳》裡邊有這樣一個記載——這個記載是郭和卿居士翻譯的,然後性景法師和性華法師又重新校對了一下——講了阿底峽尊者在發生戰爭的兩個王國中間,阿底峽尊者一直要為對方講和,還去解救很多困於戰亂中的有情。然後再之後就是這一段了。 [04′21″]</p>
<p>   說阿底峽尊者在金剛座正在繞行、修慈心、悲心、菩提心的時候,從南方來了一個外道的班智達,高撐著十三頂的勝傘——這個勝傘是名譽的一種標誌,每辯論勝,而且是非常大的辯論對手,就是每辯論勝大敵一次,就能夠在頭上再增勝這個傘一頂。所以,他居然高撐著十三頂的勝傘,來到了阿底峽尊者面前,然後就對阿底峽尊者說道:「你是佛教的教主,我是外道的教主,我們兩個人互相辯論,誰勝了,負者當入其教下。」要是辯敗了的話,弟子和他都歸那方了,很嚴重啊!於是就請國王為證明,然後雙方辯論。 [05′25″]</p>
<p>   結果阿底峽尊者毫不困難就破倒了對方而獲得了勝利,將十三頂勝傘轉供於阿底峽尊者。這個外道頂戴尊者的雙足,而成了阿底峽尊者的弟子,還有他一切外道的徒眾也都歸入了佛門下。大家可以想像這個辯論對佛教是至關重要的,如果沒有取勝的話,那整個寺院的僧眾都要去學外道。 [05′58″]</p>
<p>   接著又在第二年來了一位外道師,這位外道師他擁有八頂勝傘,也如前一樣的結果,就是又跟尊者辯論,又被尊者打敗了。然後又在後年來了一個外道師,擁有五頂勝傘,極善巧精通聲明和因明學處,他也像以前一樣請求辯論,而且立上合約,這個合約大概跟上面是一樣的。阿底峽尊者也答應了,就像他請求的那樣應戰。到了辯論的時候,陳設好問難者與答辯者的座位,聚集了許多班智達還有群眾,聲勢很浩大,然後雙方就辯論起來了。 [06′47″]</p>
<p>   辯論的那個題,開始的時候有三十位的班智達還能聽得懂;然後辯著、辯著,漸次只有十五位能聽懂;然後又辯著、辯著,深入細微的、精闢的辯論之處就只有十位能懂;再辯下去,僅有五位能懂;漸次、漸次入於最極細微處,也只有他們二人知道——就是辯論的雙方,其他人完全無法知道微細的地方是到一個什麼樣的難度。 [07′29″]</p>
<p>   在這時候,這個外道師就提出聲明中的一首四句偈的意義來問難,阿底峽尊者一時不知道這四句偈的意義,一時不達其意,這個偈子的意思是什麼?就跟外道師說:「你暫時在這裡坐一下。」於是就進入了室內,然後向度母供曼達而祈求加持,結果心中豁然開朗,又回來坐。他這一回答,外道的班智達就被駁倒而失敗了,失敗了就是又得承認在尊者的座下為徒,然後歸入了佛教的門下。 [08′18″]</p>
<p>   所以阿底峽尊者第三次的辯論中,就是度母不可思議的加持力,我們在辯論中也可以學習,當我們遇到難題的時候去請問度母。很多同學比較喜歡問法師,法師的父母在懇親的時候也都來問法師,同學們之間有問題的時候就互相問、問高班的,對吧?還是像阿底峽尊者一樣,可以養成一個向度母祈求的習慣。 [08′47″]</p>
<p>   「金剛座」就是佛教的聖地之一,位於中印度的菩提伽耶,相傳與大地同生同滅,是三千大千世界的中心點。方圓一百多步,下至金輪、上達地面都是金剛構成的,賢劫千佛都在此入金剛喻定成就佛果,所以稱為金剛座。 [09′14″]</p>
<p>   那麼這個「大菩提寺」,就是佛初成道的時候菩提樹北方的一個寺院的名字,又名摩訶菩提寺。這個寺是怎麼來的呢?有一種說法是認為僧伽羅國王尸迷佉拔摩這個國王所建的。還有一種說法是優波毱多尊者弘化印度的時候——記得優波毱多尊者是誰吧?就是把魔王的脖子上套了一個狗屍的那位成就者——他弘化印度的時候,在摩羯陀的境內有一對母子,他們親見了佛陀的聖顏,由這個母親瞻薩婆羅門女和他的兒子妙善婆羅門所建。 [10′05″]</p>
<p>   寺院的主體竣工之後,結果天人化現為工匠,應徵前來塑造佛像。因為寺院建完了之後得在裡邊供上佛像,佛像誰來造的?是天人化現的工匠。然後這個母親就仔細地檢視佛像,因為她親見過佛陀。這樣檢查之後發現這個像刻畫入微,惟妙惟肖,與真的佛陀幾乎是相同的。尤其是佛像的眼珠,還有眉間的白毫所嵌的這個寶珠,它非常地神奇,在晚上會發光,就是非常非常地不可思議。然後寺院建築工藝超絕、彩繪非常非常地精妙。這個寺中供奉著如來的肉舍利與骨舍利,裡邊曾有一千多名的僧眾學習大乘和小乘上座部的教法,寺規嚴明、戒行端肅,是非常有名的一個寺院。 [11′17″]
<p>   好!我們接著看《四家合註入門》131 頁的第二段。在講述「<p> 於聖教所作事業中分二<p> 」中的「<p> 於印度所作事理<p> 」。 [00′13″]</p>
<p>   阿底峽尊者對於內道的佛教徒,「<p> 即於<p> 內道佛乘上部之中觀、唯識;下部之一切有部、經部<p> 自部上下聖教,所有未達、邪解、疑惑諸惡垢穢,亦善除遣,而弘聖教<p> 」。師父說這應該沒有什麼不懂的。「<p> 故一切部<p> 」,在自部當中很多部派,「<p> 不分黨類奉為頂嚴<p> 」,不管是誰,都把覺窩傑具德阿底峽尊者奉為頂嚴。「<p> 如《讚》中云:於大菩提寺,一切集會中,自部<p> 內道<p> 及他部<p> 外道<p> 」,自部就是指內道的佛教徒,他部就是指外道。「<p> 諸惡宗敵者,以獅吼聲語,一切腦漿崩<p> 」,就是與所有的惡宗諍論者辯論,用正理的獅吼將他們完全地摧毀。「<p> 腦漿崩<p> 」,就是指被毀滅的意思——摧伏這些惡宗敵者的論宗。 [01′30″]</p>
<p>   在這一小段中,看到還是在顯示阿底峽尊者的辯論,自部不分黨類地都把阿底峽尊者奉為頂嚴。他用正理的獅吼,跟很多持惡宗的這樣的人在辯論的時候,把他們惡宗全部摧毀。 [01′53″]</p>
<p>   所以看一看,我們在學習辯論的時候,可能覺得是形成一種理路,然後想要跟別人辯論,但是到底能不能摧毀他人內心中的邪宗呢?還是更多地想要長養自己對於三藏的這個理解、對於經論的理解?那麼摧毀他宗的惡論的目的到底是什麼呢?就是希望在別人的心續裡建立正信,建立對於正理的一個非常調順的推理——從因到果非常順暢的一個成立,還有我們這個立宗到底有沒有什麼不周遍的?有沒有因不成的?反覆地這樣去簡擇。那麼我們的內心對於自己所立的一個定義,就變得非常地慎重。沒有經過思考就跟著感覺的這種東西,經過辯論之後就會被強大地滌除掉。 [02′56″]</p>
<p>   所以,透過學習辯論會增長我們的智慧。當然很多大師級的辯論,也會施展他們不可思議的悲心。這種非常非常有慈悲心的大師,他們在辯論的時候,就像傑仁波切他在辯論的時候,摧毀了敵者的論宗,但是不會令他們的心有破碎感,反而被摧毀之後內心有一種欣喜的、被拯救的感覺。 [03′26″]</p>
<p>   前面不是寫阿底峽尊者跟那個頭上飄著很多傘的外道辯論,辯論完了之後,那個外道的導師就給尊者頂禮,成了尊者的弟子?所以看他們在辯論的時候是非常非常地守規矩的,勝利了就勝利了、失敗了就失敗了,完全是按照規矩來的。 [03′50″]</p>
<p>   看了這一段之後,我們要再想想:我們在學習辯論的時候實際上是很辛苦的,有的同學很長時間找不到感覺,好像全在黑暗裡摸索;但一朝好像從山洞裡有一個孔透過了日光的時候——就一點點找到了那個心中的理路的路,一旦找到了就會欲罷不能,覺得辯論這種學習方式太有魅力了!當我們越來越感受到它的魅力的時候,有一種喜樂產生的時候,我們就會想更深地去獲得這種喜悅,所以我們會在佛教所闡述的正理上想要展開更廣闊的學習和討論。這種方式真是太美了!大家一定要加油學辯論。 [04′33″]</p>
<p>   接著看 132 頁。說對於佛教徒而言,則如下所說,「<p> 能飛聚落中<p> 」,前面已經解釋過了。「<p> 出家二百半,能映覆戒中,出家不滿百<p> 」,能飛聚落就是有兩百五十位出家人,而覺窩傑的寺院——那個寺院還記得吧?止迦摩囉室囉寺,也就是能映覆戒寺,也就是超戒寺,不到一百位。「<p> 四本部全住<p> 」,如前說過的這個聲聞四種部派全住在裡面,是非常齊全的。「<p> 尊部無慠舉<p> 」,尊者不會覺得:「我是大眾部,你們是上座部比較差。」不會這樣分黨。所以「<p> 摩羯陀境內<p> 」,就是金剛座所在的摩羯陀境內。「<p> 一切寺無餘,成大師<p> 比丘、比丘尼、優婆塞、優婆夷<p> 四眾<p> 」,在摩羯陀境內,不管是寺院也好,或者這個地方佛教的四眾——比丘、比丘尼、優婆塞、優婆夷,都將尊者奉為頂上的寶珠。 [05′44″]</p>
<p>   在這裡邊講到了「優婆塞、優婆夷」,可能老學員都知道了,但是剛開始學佛的會不太清楚;這個是指近善男或近善女,就是梵語鄔波索迦及鄔波斯迦,這是音譯,它是指承許守護居士戒的男女居士,由於他親近承事善法,故名近善。是個尊稱喔!因為他承許守護居士戒,所以為近善。 [06′25″]</p>
<p>   阿底峽尊者在摩羯陀境內,不管是比丘、比丘尼,還是男居士、女居士,佛教的四眾、四眾弟子都把尊者奉為頂上的寶珠,非常非常珍貴、難得的一位偉大的上師。 [06′44″]</p>
<p>   那麼下面有語王尊者的箋註,「<p> 覺窩尊乃天佛智足所傳大眾部支派之說出世間部<p> 」,那麼這個「佛智」,梵語就是「布達迦那」,他傳下來的大眾部。大眾部當中有很多支分,尊者是屬於「說出世間部」。然而尊者不偏黨自部,他是一位能毫不紊雜地分辨各部的智者。就是見解啊,或者戒律開遮持犯的不同,他全部能夠分辨各部。那麼這各部有多少部呢?「<p> 尊居十八部,一切頂中時,一切皆受教<p> 」,「十八部」就是指聲聞部派的根本四部所分出的十八部,這當中所有的人沒有不承許尊者的,所以都在尊者的座前聽法。「受教」的意思就是指聽法,都成為了這些弟子的頂嚴。 [07′53″]</p>
<p>   這裡邊所說的十八部,在妙音笑尊者的《大宗義》中也介紹了應該是藏傳的十八部的一種分法。因為這裡邊還有南傳的,可能還有漢傳的,在佛教史的記載應該有出入。妙音笑大師的《大宗義》裡邊關於十八部就有六種分法,今天六種分法就不全講,先介紹前面兩種。 [08′22″]</p>
<p>   那麼先介紹第一種最著名的,就是在藏傳佛教中最為普遍的,就是十八部派形成六種分法的第一種——調伏天的說法。注意!聲聞根本四部中,細分為十八部派。說一切有部、大眾部、上座部、正量部,這是聲聞根本四部。那麼「說一切有部」分為:根本說一切有部、迦葉部、護地部、護法部、多聞部、紅衣部及分別說部,共七部;那「大眾部」分為:東山住部、西山住部、雪山住部、說出世間部及說假部,五部;那麼「上座部」分為什麼呢?祇陀林住部、無畏山住部、大寺住部,三部;「正量部」分為:雞胤部、守護部、犢子部,三部。合計十八部。這種說法在藏傳佛教中是最為、最為普遍的。 [09′26″]</p>
<p>   那麼第二種就是蓮花論師的說法:聲聞根本四部中,也是細分為十八部派。這四部:說一切有部、大眾部、正量部,還有上座部。「說一切有部」就分為:迦葉部、護地部、護法部、根本說一切有部,四部;「大眾部」分為:東山住部、西山住部、雪山住部、分別說部、說假部、說出世間部,六部;「正量部」分為:紅衣部、守護部、雞胤部、多聞部、犢子部,五部;「上座部」就分為:祇陀林住部、無畏山住部、大寺住部,三部。合計十八部。 [10′04″]</p>
<p>   大家可以聽聽,這十八部派光是分法上就聽起來滿多種的,把十八部派毫不紊雜地都能夠分辨出來的這樣的一個智者!他們各部分的承許、戒律的承許等等,見解可能有一些微細的差別,尊者全部能夠分出來。十八部派的弟子全部都在尊者的座前聽法,把尊者視為頂嚴。大家可以想像,把很多人合起來的一件事情,而且都是認真修行的這麼多修行人合起來,是一件很不容易的事情。但是尊者有這樣非常稀有的功德,四眾的弟子就雲集在尊者的座下,十八部派全部都承許以阿底峽尊者為他們的頂嚴,可以想像他的悲心和智慧達到了一個什麼樣的高度。 [11′06″]</p>
<p>   今天我們能夠在學習《廣論》的時候,再把阿底峽尊者的功德學一遍,看看他為聖教所作的利益,一定會成為我們嚮往和追隨的上師。大家一定要好好地努力! [11′22″]
<p>   今天我們繼續學習阿底峽尊者的功德。今天是要學阿底峽尊者在「<p> 藏中所作事理<p> 」,大家把書翻到《四家合註入門》133 頁。 [00′17″]</p>
<p>   在聽講前請大家注意發心!發心之後,其實對聽這一講全廣也可以有很多作意,比如說如果有特別迫切想要修令師歡喜的同學,就可以想:我認真聽法,然後認真聽法的這個修行供養我所有的善知識,希望能夠令他們歡喜,生生世世得到善知識攝受。因為善知識希望我們能夠準確地聽聞三藏,然後如理思惟,才能夠正確地修行。那麼想要懺悔自己的過去生也好、現在生也好很多業障的同學,或者內心中很多煩惱,想要懺悔的時候,也可以把聽這節課當作是懺悔的一個修行。 [01′10″]</p>
<p>   總之,就是在內心中可以有這樣的作意,可以把聽法整個的這個過程用大乘發心來攝持。之後你可以去想一下:願我所做一切令師歡喜。令師歡喜,也會令十方諸佛歡喜。所以同樣的時間可以賺到大筆的資糧,不要荒廢這時光。 [01′35″]</p>
<p>   那麼我們就看 133 頁第一段:<p>   <p> 藏中所作事理<p> ,分五:第一、以法破除邪解,開闢新軌<p> 者:天尊師長<p> 智光、菩提光<p> 叔姪,如其次第起大殷勤,數數遣使羅紮瓦賈精進獅子及那措戒勝往印迎請。菩提光時,請至阿里上部,啟請治理佛陀聖教。依是因緣,總集一切經咒要義,束為修行次第,遂造《菩提道炬論》等而興教法。<p>  [02′21″]</p>
<p>   我們可以看看仁波切的講記。說「<p> 藏中所作事理者<p> 」,接下來就是尊者在西藏為佛教所做的事業,遍智妙音笑大師的箋註在此就分五個科判。第一個是「<p> 以法破除邪解,開闢新軌<p> 者<p> 」,就是透由說法破除藏地的一切邪執,並新開創了清淨的教軌。 [02′53″]</p>
<p>   在這裡邊,大家可以稍稍注意一下這第一個科判,比如說「以法破除邪解」這幾個字。我們可以想一下這個「邪解」,有的人的邪解是聽來的、學來的,還有的是自己想出來的。那麼這樣的邪解,會導致我們對如何離苦得樂的這個判斷失誤,就是會走上你以為是樂、結果是苦的,奮鬥了一番之後發現是欺誑!所以這樣的不是正確的離苦得樂之道,是要被校正的。 [03′32″]</p>
<p>   那麼用什麼來校正很重要,所以它這裡面「以法」——這個法,大家都知道法有救護的、慈憫的這樣一個功能,所以能救拔我們身心中的痛苦,把我們的三業驅使到樂的這個方向或者軌道上。所以,當我們內心覺得對什麼事情理解錯誤的時候,別忘了這個科判的點醒,就是用法來破除邪解。 [04′03″]</p>
<p>   說透由說法破除藏地的一切邪執,那我們的內心中會不會有一些對於修行的邪執呢?那就透由善知識說法——因為阿底峽尊者是透過說法破除存在在人心中的一些邪執——我們透由聽法破除我們內心中的一些邪執,這樣的聽法對我們走向離苦得樂有直接的作用,不是只是一些理論罷了。 [04′30″]</p>
<p>   接下來「<p> 天尊師長<p> 智光、菩提光<p> 」二位「<p> 叔姪,如其次第起大殷勤,數數遣使羅紮瓦賈精進獅子及那措戒勝<p> 」譯師,前往印度迎請,「<p> 菩提光時,請至阿里上部<p> 」。師父說在後弘期的時候,西藏的佛教非常地混亂,很多智者沒有來,反而從印度來了很多號稱是印度班智達的,說了很多邪法,藉口稱為密法。這裡邊列舉了一個講合度法的紅裙阿雜惹等等。在那個時候,就有很多從印度途經阿里的印度阿雜惹,對聖教產生了極大的垢染。然後還有朗達瑪破壞教法,影響所及,長達七十年沒有戒法,因為教法是否住世,就觀待於戒法是否住世。 [05′38″]</p>
<p>   看起來那個時候藏地的佛法的狀況是滿慘的,像想要從印度迎請善知識,結果真正的善知識沒有來,來了一些說邪法的。關於這個「合度法」,是指阿底峽尊者沒有到西藏之前,有一些從印度來的藍裙班智達還有紅裙阿闍黎等人——他們被稱為是這樣的,都是以藍或紅裙這樣的稱呼——他們宣揚與女人邪行為合修、傷害仇敵為救度的邪法,這個法叫合度法。很顯然這樣的法絕對不是佛教! [06′22″]</p>
<p>   所以他們對聖教產生了極大的垢染,因為他們說這是佛教,其實這完全不是佛教,是邪法!所以會引導眾生造惡業,甚至會傷害別人、傷害自他!又經歷了朗達瑪破壞教法,然後影響所及七十年沒有戒法。因為教法能不能住世就觀待於戒法是否住世,所以阿底峽尊者來到西藏之前,西藏的教法看起來是被破壞得很慘烈啊! [06′59″]</p>
<p>   由此教法在阿底峽尊者來之後,教法從下方的康區、安多等處向上復興。這時候的西藏已經沒有統一的國王,朗達瑪已經死了,天尊師長智光雖然是松贊岡布王的皇統之一,但是並非是全西藏的國王,只是阿里地區的小王。天尊師長智光王見到教法非常地混亂,為了能完善地復興教法,他就在思考著:到底是哪一位善知識從印度來能夠饒益整個西藏呢?誰是那位班智達呢?他就做了很多很多的觀察。因為阿底峽尊者對西藏有廣大饒益的這樣一個緣起,所以他就下決心要多次努力地迎請。 [07′56″]</p>
<p>   後來,菩提光的叔叔天尊師長智光王,為了迎請阿底峽尊者拋棄了身命等一切所有。他為了迎請尊者而去尋求黃金,被迦羅的這個國王抓起來關進了監獄。當他的姪子菩提光王來救他的時候,那國王說:「你們大家捨棄佛教,歸入我的教法;要不然就拿和智光王身體等重的金子來,就可以放了他。」他們去救國王的時候,那個惡王說:「要不然你們就全歸入我信的教。」他信的教是伊斯蘭教;要不然就拿跟這個王身體等重量的金子。 [08′41″]</p>
<p>   後來他們就決定要回去籌金子,所以菩提光帶著黃金來到了獄中。然後智光王就說:「你帶著這麼多的金子來是很不容易的,但我年事已高,就是出了牢獄也無法再活十年,所以你還是把這些金子拿去迎請阿底峽尊者吧!」然後天尊師長智光就希望託話給阿底峽尊者說:「像我這樣一個西藏境內的普通凡夫,為了佛陀的聖教,乃至身命等一切都奉獻給教法了!尊者您是大菩薩,是否顧念西藏的教法,您自己知道。此生雖然見不到您,祈願來生一定要值遇您!」 [09′31″]</p>
<p>   然後在《入門》上,到這兒我就問問題說:「師父,這是他叔叔說的嗎?」師父說:「是他叔叔在獄中給阿底峽尊者帶的口信,說:『我是一個凡夫,我生生世世沒有為佛教事業獻出生命,這一次我要把生命獻給佛教的事業。我最大的希望,請您到藏地來整理藏地的佛法,弘揚清淨的佛法知見。』」然後師父說,他把一切全部貢獻給佛法的事業,直到他的姪子菩提光的時候,那措戒勝譯師才能從印度迎請尊者過來。 [10′08″]</p>
<p>   所以「<p> 啟請治理佛陀聖教<p> 」,菩提光王啟請尊者治理佛教,啟請後,覺窩傑具德阿底峽尊者「<p> 依是因緣,總集一切經咒要義<p> 」,無所缺少地「<p> 束為修行次第,遂造《菩提道炬論》等,而興教法<p> 」。當時菩提光曾對尊者請問了七個修法方面的問題,尊者為了回答他的問題,就宣說了《菩提道炬論》。在《道炬論》中開頭就有說到:「<p> 應賢弟子菩提光,勸請善顯覺道燈。<p> 」弟子菩提光對我問了很多的問題,為了回答而說此《菩提道炬論》。這本論並不是以問答的形式,而是菩提光問尊者很多問題,比如「大乘佛教中,菩薩的所依身是否需要別解脫戒?密咒聖教又是如何如何?」問了七個,因此就著作出一本總集一切經咒要義的論著來作答覆。 [11′10″]
<p>  <p>  <p>  <p>  <p>  <p>  <p>   大家好!又到了我們一起學習《廣論》的時間,請大家把《四家合註入門》翻到 135 頁,看最下面的倒數第 2 行。 [00′17″]</p>
<p>   <p> 此復住於阿里三載,聶塘九歲,衛藏餘處五年之中,為諸善士開示經咒教典教授,罄盡無餘。<p> 《甘丹法源史》謂覺窩尊生於壬午年,五十九歲時自印度啟程,六十歲時抵尼泊爾,六十一歲至阿里,六十三歲至前藏,七十三歲時圓寂於聶塘,駐錫藏地十一載,此為一說。又那措所傳善本方志謂覺窩尊生於庚午年,五十七歲時自印度啟程,當年歲末入藏,甲午年七十三歲圓寂,於藏地駐十七載。二說之中,雖以前說為主,然此《道次第》中所說者,順應後說。尊者駐藏十七載,<p> 聖教規模諸已沒者,重新建樹,諸略存軌,倍令增廣,諸被邪解垢穢染者,皆善治除,令聖教寶悉離垢染。<p>  [01′43″]</p>
<p>   這像一個阿底峽尊者的大事年表。那我們可以看仁波切的講記,說到了西藏以後,「<p> 此復住於阿里三載,聶塘九歲,衛藏餘處五年之中<p> 」,共十七年。在阿里地區住了三年吧!在聶塘住了九年,然後衛藏餘處五年。 [02′12″]</p>
<p>   我們先了解一下「阿里」,阿底峽尊者進入西藏的時候是古格王朝所統一的地區;阿里上部就是西藏阿里西部的一個地區的名字,大約相當於現今的扎達縣,有去過朝聖的人應該都知道。「聶塘九歲」,那聶塘也是西藏的一個地名,它靠拉薩很近,是位於拉薩西郊的曲水縣,這個聶塘寺也是阿底峽尊者示寂的地方。種敦巴尊者在此建有度母寺,這個聶塘寺是一個很小的寺院。 [02′57″]</p>
<p>   他有五年之中是在「衛藏餘處」。那麼衛藏是在什麼地區呢?也是西藏的一個地區的名字,「衛」是中央的意思,就是指前藏,大約相當於現今的拉薩市,還有山南地區、林芝地區西部,大概都是在拉薩附近這一區。所以在十七年,「<p> 為諸善士開示經咒教典教授,罄盡無餘<p> 」,開示了很多顯密的教法,在這十七年中說法。 [03′33″]</p>
<p>   接著,語王尊者依《甘丹法源史》提出了一個疑點——《甘丹法源史》是福稱大師所著的——這裡邊的疑點是說:覺窩傑生於壬午年,五十九歲的時候從印度啟程,六十歲的時候抵尼泊爾,六十一歲到阿里,六十三歲至前藏,七十三歲的時候圓寂於聶塘,駐錫藏地十一年,這是一個說法。語王尊者把這個註解寫出來,仁波切說這個不是很重要。 [04′06″]</p>
<p>   還有「<p> 那措所傳善本方志<p> 」,那措譯師也撰寫了一本遊記,比較有根據,資料是確切的。其中有提到:覺窩傑尊者生於庚午年,五十七歲的時候從印度啟程,也就是五十七歲的時候從印度出發了,在路上。「<p> 當年歲末入藏<p> 」,就在那一年的年底蒞臨藏地。走了多久了呀?走了一年喔!「<p> 甲午年<p> 」就是木馬年,七十三歲的時候圓寂,於藏地駐十七年。「<p> 二說之中,雖以前說為主<p> 」,這是有兩個說法,但是以前面的說法為主。「<p> 然此《道次第》中所說者,順應後說<p> 」,《廣論》的文中主要是依據後者的這個十七年的說法。 [05′03″]</p>
<p>   「<p> 尊者駐藏十七載,<p> 聖教規模諸已沒者<p> 」,就在藏地駐錫十七年的過程中,這個「諸已沒者」是怎麼回事呢?為什麼聖教的規模已經沒了呢?這裡邊就涉及到一個破壞佛教的王——朗達瑪,他破壞佛教,後七十年間隱沒不振的這個道軌——被他破壞得很慘!阿底峽尊者來了之後,就把朗達瑪破壞後的佛教的這個道軌重新地建樹。「<p> 諸略存軌,倍令增廣,諸被邪解垢穢染者,皆善治除<p> 」,就像所謂「藍裙班智達」,還有「紅色阿雜惹」所傳的灌頂和說法,這所有的部分,這些邪解、邪分別的部分都完善地清除,「<p> 令聖教寶悉離垢染<p> 」。 [05′58″]</p>
<p>   大家可以想一下,十七年先要去重新建樹被朗達瑪破壞的這個佛教,已經快隱沒了、非常不振作的這樣的道軌——已經快隱沒的趕快重新建樹。有的是殘缺的、部分的,倍令增廣。還有邪說,不是善知識說的、也不是佛教,染濁了這個道軌,要把它淨化掉、悉離垢染。 [06′25″]</p>
<p>   這對我們後學的人來說,阿底峽尊者這個整頓、來拯救是多麼重要的一件事情!不然令染濁的這種道軌傳到現在的話,那真是貽害萬年哪!修行者都會被傳出來的這個染汙的道軌全部毀掉了。好不容易萌生出想要修行的心,想要去了解什麼是佛說,碰到一個這樣的沒有清淨傳承、胡亂解說的邪說,簡直是太殘酷了! [07′01″]</p>
<p>   所以,我們能夠學到這個清淨的傳軌——那爛陀寺的清淨傳軌、阿底峽尊者的清淨傳軌,真的要好好地感恩阿底峽尊者。你看!五十七歲啟程,完全到了一個異鄉,到了一個海拔那麼高的地方,而且語言不通,最後把生命獻給了佛教,所以才有今天的傳承未斷,如此清淨的道軌傳到現在。 [07′30″]</p>
<p>   看他去的時候,那個西藏的佛教是非常慘的,這樣一個大德,就把它全部地整頓好、振作起來。所以師父說:「聖人不出,萬古如長夜!」聖人一出,多麼深的長夜也都會出現日出、出現光明,眾生的迷惘也都會被導正,這真是感銘肺腑的深恩!所以我們要用好好修行、好好聽聞、思惟、修行的這樣一個供養,來報答阿底峽尊者、報答所有的傳承善知識! [08′06″]
<p>   好!我們接著往下學。今天我們將學習的還是阿底峽尊者的功德,請大家把書翻到《四家合註入門》138 頁,看原文。<p>   <p> 第二、滅除損害梵行及三學者:<p> 總之雪山聚中前弘聖教,謂吉祥靜命<p> 親教師菩提薩埵<p> 及悲瑪桑巴瓦<p> 蓮華生<p> ,建聖教軌。然由支那和尚堪布,解了空性未達扼要,以是因緣,謗方便分,遮止一切作意思惟,損減教法,為嘎瑪拉希拉<p> 蓮花戒<p> 大阿闍黎善破滅已,決擇勝者所有密意,為恩極重。<p>  [01′02″]</p>
<p>   我們現在來看仁波切的講記,請大家看 139 頁。在科判說:「<p> 第二、滅除損害梵行及三學者<p> 」,這是妙音笑大師的箋註。第二科的內容,是如何清除了以前藏地有許多損害戒定慧三學,還有損害戒學、比丘戒等梵行的這個情況。妙音笑大師將下文的這些內容就歸入了第二科。「<p> 總之雪山聚中前弘聖教<p> 」,就是說藏地前弘期教法的時候——這裡邊就涉及到一個「雪山聚」和「前弘期」,我們先往下看,一會兒再解釋。 [01′51″]</p>
<p>   藏地前弘期教法的時候,由「<p> 吉祥靜命<p> 親教師菩提薩埵<p> 及悲瑪桑巴瓦<p> 蓮華生<p> 」他們兩位「<p> 建聖教軌<p> 」。靜命大堪布也是邦伽羅人,邦伽羅人大家親切嗎?就是和阿底峽尊者是同一個家族的。所以在種敦巴尊者所造的祈請文中有提到:「富饒之地邦伽羅,貴胄撒賀王種姓,菩薩靜命所生族,燃燈智足敬頂禮。」他和蓮花生大師兩位就是最初擎持西藏佛教的大德,與法王赤松德贊三個人,聯合在西藏創立了最初的佛教道軌,並且善為樹立清淨無染的教法。 [02′46″]</p>
<p>   「<p> 然由支那和尚堪布,解了空性未達扼要,以是因緣,謗方便分,遮止一切作意思惟,損減教法<p> 」,這裡邊提到的「支那堪布」,他的見解中並未透徹地了達空性的扼要,因為不了解,所以認為捨棄了方便、智慧中的其中一者是可以成佛的——實際上我們都知道這兩者捨棄一者是不能夠成佛的——而且方便分中的菩提心、出離心呀等等,他認為全都不需要,只要毫不作意思惟就能成佛。 [03′25″]</p>
<p>   由於支那和尚摩訶衍那堪布的出現,造成了聖教的傷害。其後蓮花戒論師蒞臨西藏,斷除了這種邪見,著作《修次》初、中、後三篇。我們在很多地方都會讀到,在《廣論》的很多處引了這個初、中、後三篇。蓮花戒論師完全破除了支那和尚摩訶衍那的宗見,重新光顯了佛陀的聖教,所以恩德至極深重! [04′00″]</p>
<p>   「雪山聚」其實就是藏地,地勢高寒,長年覆雪,所以叫雪山聚,也叫雪域。前弘期的聖教——很顯然還有後弘期的聖教——前弘期的聖教是從吐蕃王朝一直經過了松贊干布的開創,到赤松德贊的弘揚盛行,還有到赤熱巴堅的改革文字,直到朗達瑪滅法以前的藏傳佛教,就稱為「前弘期的佛教」。 [04′35″]</p>
<p>   那麼這個就涉及到「朗達瑪」,朗達瑪就是破壞藏系佛法的一個王。我在這裡邊就問說:「朗達瑪的前世是誰?他為什麼會這麼嚴重地破壞佛教呢?」因為那時候我在想:這一生他為什麼要對聖教做這麼大的破壞?是不是發惡願的?其實那時候在仁波切講之前,我也不知道朗達瑪是誰。 [05′00″]</p>
<p>   然後仁波切就講說:這裡邊有很多故事。在修建尼泊爾博達大佛塔的時候,那時候朗達瑪是一頭牛。當佛塔開光的那一天,大家都在很虔誠地祈禱,非常歡喜感動的時候,這頭牛祈禱說:「當他們正式弘法的時候,我就要滅法!」牠就發了這樣的一個惡願。然後仁波切說是有這個說法的。漢地也有國王滅法,就提到了三武一宗,說好像有四次,但是他說漢地的滅法沒有像朗達瑪滅法那麼嚴重。朗達瑪實際上在位才四到五年,五年以後他就被刺殺了。在五年當中,他就把整個的佛法毀滅得非常地嚴重,嚴重到什麼程度?到七十年都沒有恢復,七十年後才慢慢地復甦。經書也燒掉了,但是他最主要的破壞就是他不准有一個出家人,傳戒的人幾乎全部都斷絕了!沒有戒的話就等於沒有佛法,所以實際上那個時候是慘不忍睹啊、慘不忍睹! [06′13″]</p>
<p>   接著朗達瑪破壞佛法之後,那有人還得要重新建立,然後就涉及到在朗達瑪滅法之後,有三個出家人就逃走,據說是逃到安多地區了。那麼逃到安多地區,這時期就進入到後弘期了。三個出家人,他們就幫一個當時年紀還很小、可能不到二十歲的叫「拉欽波貢巴饒色」傳戒。後弘期的時候第一個求戒的西藏人就是拉欽波,仁波切常常滿懷感恩地講到這個出家人——就是被這個三位大師授比丘戒的第一個人,在佛法被破壞了之後。 [06′54″]</p>
<p>   三大賢哲從西藏經過新疆逃到青海,最後當地發現他們是三個出家人,就非常地敬重他們。最後就是有一位拉欽波——就是拉欽貢巴饒色,年紀很輕就被他們收為弟子,然後最珍貴的、最重要的就是接受了比丘戒律。 [07′17″]</p>
<p>   後來請到那個刺殺朗達瑪的人幫忙傳戒,他說他不能傳戒,他已經殺人了不能傳戒,所以就請了兩個漢地的和尚,一共五個人傳。安多地方的僧人的上衣裡邊都是藍色的,不知道諸位去藏地有沒有注意觀察?實際上那個為什麼是藍色的呢?那個藍色就是紀念漢地和尚幫忙把西藏的戒律、這個戒法振興起來。如果沒有這兩位和尚,其實很難傳戒的,傳不下來的。仁波切在這裡說:「不知道拉薩人有沒有這種說法,但是安多地區就是這樣說的。」 [07′59″]</p>
<p>   後來西藏那裡邊就有十個人到拉欽那裡去受戒。看!又傳開了!傳說有衛藏人、後藏人,一共有十個人到安多在拉欽的跟前受戒,就是這樣戒律又再度地傳承下來了。所以拉欽是後弘期的第一個傳戒人,對吧?由他開始標幟著進入這「後弘期」。他們離開的時候,拉欽已經很老了,他把自己的黃帽送給了西藏十個人當中一個叫作魯梅的人,是魯梅帶著這個十個人來的。拉欽送給他的時候說:「你在這一路上惦記著我,戴著這頂帽子到西藏去弘法。」後來西藏黃帽派為什麼會這麼盛興,緣起說就在那裡。安多的拉欽波是相當相當有名的! [08′51″]</p>
<p>   然後在這裡邊,我們又會提到「後弘期的佛教」。後弘期的佛教就是從朗達瑪滅法之後,再次恢復的藏傳佛教稱為後弘期的佛教。後弘期的佛教開始的年代有種種說法,布頓大師認為從公元 973 年善顯密意大師(拉欽貢巴饒色)受比丘戒那年開始的;種敦巴尊者認為從公元 978 年,魯梅戒慧——就剛才提到那位——他帶著十個人依著善顯密意大師受比丘戒的時候開始的。中間差了幾年?五年吧!對吧?他們的時間長度。 [09′28″]</p>
<p>   所以它分前弘期和後弘期,後弘期的開端的時候,要記著有這樣的一個了不起的拉欽,對吧!還有兩個非常非常重要的、在歷史的傳戒的舞臺上絕不可或缺的兩個漢地的和尚,藏地的比丘戒又得以延續到現在,所以他們的衣服上才有藍色,就是紀念很深恩的漢地和尚。 [09′53″]
<p>   在這裡邊有提到「<p> 悲瑪桑巴哇<p> 」,就是蓮花生大師,是在漢、藏都非常有名的祖師,他是寧瑪派的開派祖師,約公元 8 世紀。有人說他是從蓮花中自然出生的,有人說是鄔仗那王種,他的傳記上也有各派說法。蓮花生大師小的時候就精通大小明處還有占相,他依止達布支等八位上師學法,獲得了八種共通成就。後來他又去一個叫法苗寺——這個寺的名字很好聽——法苗寺的佛智阿闍黎座前剃度受戒,聽聞了四部瑜伽密法的甚深教授,然後前往邦伽羅的巴拿札巴城的北方、名叫邦系的這個森林中專修密行——看來這個森林因為他在裡邊修密法可能是很著名——獲得了殊勝的成就,現證無死金剛身。 [01′03″]</p>
<p>   此後就雲遊印度、尼泊爾各地,以種種神通降伏外道,還有以密咒調伏惡鬼,大弘佛法。他顯赫的教證功德的名聲傳到了西藏,藏王赤松德贊就迎請他,然後赴藏。進入了西藏之後,蓮花生大師降魔,然後建寺院,最具代表性的就是興建了桑耶寺。在藏地廣弘佛教的恩澤流傳至今,利益了無數的有情。 [01′36″]</p>
<p>   還有就是西藏前弘期重整藏地佛教的大班智達,叫「<p> 嘎瑪拉希拉<p> 」,就是蓮花戒論師,公元 740 年到 795 年。他是在靜命論師的座下學習的,成為瑜伽行中觀自續派的大班智達。也是應藏王赤松德贊之邀進入了西藏,他就不是降伏惡鬼呀什麼,他是破斥支那堪布所宣傳的見解,並且針對赤松德贊所提出的關於見地、修持、果位三大類的問題,著作了《修次第》初、中、後三篇,世稱《修次三篇》,是很著名的!然後又有《中觀光明論》等著作。我們會學到他的很多著作。 [02′25″]</p>
<p>   我們可能要稍稍了解一下關於「<p> 支那堪布<p> 」的這個問題。支那堪布在《廣論》上出現過很多次,在漢文的某些記載中也稱為摩訶衍那。關於支那堪布和蓮花戒論師的著名的辯論,西藏史上稱為「頓漸之爭」。這段歷史,無論從漢地典籍還是藏地典籍中都有記載。支那堪布主張頓悟,強調證悟空性之後,不需要修習布施、持戒等方便分,只要全不作意——就是觀修空性,依此就能成佛。可是蓮花戒論師會認為這不是佛陀的主張,想要成佛,不可偏廢智慧、方便任何一分,更不能認為全不作意就是觀修空性。關於其中見解的差異,我們在學習毗缽舍那的時候,就會學到很多這方面的討論,宗大師對於怎麼樣的見解是正確的有非常仔細地抉擇,就可以好好學。 [03′27″]</p>
<p>   然後這裡邊有一個西藏的記載,和我們漢地僅有的文獻有不一樣的地方——關於「頓漸之爭」到底誰勝誰負呢?有兩種說法。藏地的相關典籍都記載說蓮花戒論師在辯論中最後獲得了勝利,支那堪布就負敗,失敗了。所以藏王令他離開了藏地,並禁止他的見解在西藏傳播,還通令全藏從此要以龍猛菩薩的見解為宗規,如果再依照那個支那堪布的見解,就依法治罪——看起來很嚴重!但是在 1900 年在敦煌藏經洞出土的漢文寫卷《大乘頓悟正理決》中的記載剛好是反的,提到了支那和尚在辯論中將漸悟派辯得啞口無言。這裡邊有個問題就是,如果支那堪布當時真的大獲全勝的話,那為什麼會要他離開西藏,並禁止他的見解在西藏流傳呢?所以這兩種說法,前者比較普遍。 [04′32″]</p>
<p>   還有許多藏地的論典在破斥摩訶衍那的見解的時候,都稱他為支那堪布。有一些人可能會認為好像只要是支那的僧人就是這種見解,其實在這裡邊說這種說法和想法實際上是錯誤的。在《土觀宗派源流》中說:「和尚摩訶衍那他是宗門,但他的主張與宗門的見解不盡相同。宗門認為不被出離心、菩提心所攝的善及不善業,雖然會分別感生快樂和苦果,但都不能成為解脫及一切智的因;和尚摩訶衍那他沒有在這個地方作區別,認為好壞兩種分別都是繫縛。修習宗門見解的口訣中,雖然也有不作、不思的這些語錄,但是這特指現證空性的境界;摩訶衍那卻認為初業行者只要不作意就能解脫。所以不能因為一個和尚的說法有誤,就認為所有和尚的見解都錯了。」 [05′35″]</p>
<p>   這段文所說的宗門,就是指禪宗。支那和尚雖是禪宗的和尚,但他的見解並不能代表正統的禪宗的見解。不過,有一些人會誤解為這是禪宗的見解,永明延壽禪師所著的《萬善同歸集》中,也以問答的方式破斥了這種說法。正統的禪宗的見解,像在《六祖壇經》中曾有這樣的偈子,說:「有僧舉臥輪禪師偈曰:『臥輪有伎倆,能斷百思想,對境心不起,菩提日日長。』師聞之,曰:『此偈未明心地,若依而行之,是加繫縛。』因示一偈曰:『惠能沒伎倆,不斷百思想,對境心數起,菩提作麼長。』」 [06′45″]</p>
<p>   在《章嘉國師若比多傑傳》中也有記載,說:「各地有不少學法的和尚、出家人歷經艱辛來到了章嘉國師面前頂禮他,然後章嘉活佛按照法師們的希求,就開始傳授中觀的見地,其中有不少人得到了證悟。」然後這個筆者曾經問章嘉國師說:「那和尚們的見地如何呢?」然後他就回答說:「從前,跟隨龍樹師徒的幾名班智達從印度來到了漢地,而漢地的幾個和尚也去過印度,頂禮在中觀派的學者大德的足下。正是他們使中觀的見地在回到漢地之後在漢地開始略有弘傳,但是繼承和發揚的不多。還有達摩祖師阿闍黎來到了漢地,他講說見地的安立廣為流傳,有些人說這位大師就是帕丹巴桑傑。總而言之,這種觀點的本質同西藏希解派的觀點是一脈相承的,現在漢地普遍盛行的見地和唯識派的觀點也是極其相似的。曾經在西藏出現過的這個和尚摩訶衍那的信奉者,其實現在在漢地連一個都沒有了。但是有一些西藏人不明真相,就會把支那和尚摩訶衍那的觀點就等同為漢僧的一些觀點。」其實這是錯誤的,這個一定要釐清楚。 [08′15″]</p>
<p>   希望大家學了這一段之後想一下,佛教把清淨的見地流傳至今是非常不容易的,因為它包括要祖師清淨地講說,後面要清淨地傳承;如果中間被破壞了的話,還要有大德發心,從給一個比丘授戒開始,一直延續到現在珍貴的比丘戒體的傳承。所以,讀了像是歷史但是在講述尊者的功德的這一段,希望大家能夠好好珍惜流傳到現在的這個清淨的法流。 [08′54″]</p>
<p>   那麼總集一下,這個「第二科、滅除對梵行以及戒定慧三學的損害」:總體而言,在雪域西藏的聖教前弘期,親教師吉祥靜命菩薩以及悲瑪桑巴哇——蓮花生大師共同建立了聖教的軌理,但是由於支那堪布對空性並沒作透徹地理解,所以毀謗了方便分,反對任何作意思惟,以致聖教衰微。所幸的是嘎瑪拉希拉——就是蓮花戒大阿闍黎,詳盡地駁斥了這種惡見,並且抉擇佛陀的本懷,恩德至為深重! [09′34″]
<p>   好!我們繼續學習《四家合註入門》,請大家把書翻到 143 頁,請大家看中間的原文。 [00′14″]</p>
<p>   <p> 於後弘聖教,則有一類妄自矜為善巧智者及瑜伽師,由其倒執相續部義,於教根本清淨梵行作大損害,為此善士善為破除。復能殄滅諸邪執著,弘盛增廣無倒聖教,故其深恩普遍雪山一切眾生。<p>  [00′49″]</p>
<p>   而在聖教的後弘期,則有一些人妄自認為是通曉五明的大學者以及瑜伽師,由於他們錯誤地理解了密續的內涵,因而對聖教的根本——清淨梵行,造成了極大的損害,幸得這位善士阿底峽尊者善為破除。另外又消滅了其他種種顛倒的執著,振興無誤的教法,所以尊者的深恩遍澤雪域的一切眾生,現在也在恩澤著你和我,所以我們要好好地珍惜這珍貴的法脈傳承。那麼最珍惜的方式就是依教奉行,好好地修行自己,也能夠自作教他,把這個清淨的法流傳承下去。 [01′40″]</p>
<p>   我們來一起看一下仁波切的講記。說在前弘期的佛教經歷過興盛期,後來式微,原因還記得是什麼吧?是當時支那堪布等人未達空性正見的扼要,損減了教法,後來蓮花戒論師著作《修次三篇》善為破除,廣弘佛陀的密意,所以恩德極重。後弘期中,有人妄執密續的義理,這裡邊其實並沒有提及到顯教,主要是顛倒執持密續的義理,自詡為班智達和瑜伽師,這裡邊就提到了像「藍裙班智達」和「紅色阿雜惹」等人,他們嚴重地損害聖教的根本——就是梵行。教法的根本就是戒律,他們對梵行眾——出家的僧團傳播邪法,將殲滅敵人予以解脫、對女人行非梵行的惡行稱為合度法,造成了教法極大的傷害。 [02′59″]</p>
<p>   像這樣混亂的說法,「<p> 為此善士善為破除<p> 」,就是指覺窩傑阿底峽尊者。「<p> 復能殄滅諸邪執著,弘盛增廣無倒聖教<p> 」,消滅所有的邪法,在西藏弘傳無倒的清淨的聖教。西藏能有清淨的教法,弘盛增廣,全部是阿底峽尊者的恩德,不可思議的恩德! [03′32″]</p>
<p>   我們知道顯教很強調戒律,戒律是教法的根本,那麼密續也是一樣地非常強調戒律。如果有人認為好像修行密法不需要好好持戒的話,將會造成對教法極大的傷害,所以出家眾都是要好好持戒的。對這一點,因為沒有認真地聽聞教典,產生各種各樣的邪分別。不需要再做這樣的邪分別!因為我們看先輩大德的示現,尤其是學密法的成就者的示現,他們都是非常尊重戒律的。出家眾到什麼時候就是出家眾,他們就是以梵行為基礎。阿底峽尊者把胡亂地講說密法、尤其是對僧眾胡亂地講說密法的這個傷害予以去除掉,所以就變成又有清淨的法流、清淨的教法再繼續地弘傳,全部都是阿底峽尊者的恩德,是不可思議的恩德! [04′38″]</p>
<p>   從我們開始講阿底峽尊者的功德一直講到這裡,我們都會清晰地發現阿底峽尊者的清淨的教授裡邊一直在倡導戒律的重要性,像黃帽派也是主張清淨的戒律為根本。在這個清淨戒律為根本的前提下,才能有比如說出離心啊、菩提心啊、空性這樣的一個追求,如果連基本的戒律都沒辦法好好持的話,還能說自己有什麼修為,實在是一個很欺誑的事情! [05′19″]</p>
<p>   實際上在這一部分的阿底峽尊者的介紹裡邊,我們會清晰地看到:當有人比如說從很遠的地方來,大家都不知道就開始講一些好像挺神的、挺怪力亂神這樣的法,聽起來自己吹噓得滿高的,但是如果是破壞戒律的話,那一定是一個邪法。真正的大德在弘揚聖教的時候,我們可以去看,之所以成為一代的大德,他都是極度地重視戒律,他個人的行持,還有他教導弟子們都是非常非常重視戒律的,因為「依戒立僧」啊!教法的最根本也就是戒律! [06′03″]</p>
<p>   所以,從這個傳承善知識的教誡,還有在介紹阿底峽尊者的功德裡邊,我們可以清晰地讀到祖師留給我們的這些叮囑——戒律是多麼重要的事情!從最初學習佛法到中間,乃至到密續的部分,戒律都是非常非常不可以忽略的佛陀的一個教誡。這一點,還是希望我們再再地、再再地聞思。 [06′31″]</p>
<p>   尤其是要好好地學習有清淨傳承的這樣的教授,因為有清淨傳承的這樣的教授才能夠對教典賦予我們決定的定解。所以不管是誰,他所說的東西必須隨順於佛陀的教法、總的佛陀的教法,就是戒定慧。這個戒律,一定是重中之重,因為沒有戒律就沒有人身了,就失壞人身了,掉落三惡趣了;沒有戒律,也無法軌成出離之道。 [07′08″]</p>
<p>   看到這一段,也是內心中滿感恩這些一直在把被別人染著了的傳承再把它清淨、把一些邪說端正過來的這些大德。如果沒有這些大善知識來幫助我們的話,我們實在是很可憐的,想要修行,可是到哪裡去找清淨的水源啊?所以這真的是阿底峽尊者的深恩啊!不可思議的深恩! [07′37″]
<p>   大家好!我們今天要繼續學習《菩提道次第廣論》師父的手抄稿,就是「<p> 如是造論,光顯能仁所有密意,復有三種圓滿勝因<p> 」,從這兒開始,請大家認真地聽師父的講解。 [00′21″]</p>
<p> 如是造論,光顯能仁所有密意,復有三種圓滿勝因,<p>   造論能夠把釋迦世尊真正的密意和盤托出的,要有三種圓滿因。他具足了這個條件,才能夠把釋迦世尊的這個經論當中的真實的意趣,交代得清清楚楚的,需要這個條件。哪三種? [00′57″]</p>
<p>   師父解釋了三行。那我想問一下大家:造論的目的是什麼呢?就是能夠把釋迦佛真正的密意和盤托出。為什麼要把釋迦佛真正的密意和盤托出呢?祖師為什麼要寫這樣的論?阿底峽尊者為什麼要這樣呢?因為釋迦佛的密意,就是令所有的有情都從痛苦的輪迴中解脫出來,乃至究竟成佛,就是拔苦與樂。所以如果我們了解了這樣的密意之後,沿著這樣的密意修行,那麼就是實現了佛陀的願望我們都離苦得樂了。所以是非常慈悲的一個願望——希望眾生離苦得樂。 [01′53″]</p>
<p>   這裡邊師父還特別強調說:「<p> 要有三種圓滿的因,具足了這個條件,才能夠把釋迦世尊經論當中的真實的意趣,交代得清清楚楚的<p> 」。所以能夠把能仁所有的密意光顯出來的,還要具足三個條件,那麼是哪三個條件呢? [02′19″]</p>
<p> 謂善所知五種明處<p>   這第一個。什麼叫善知五種明處啊?就是五明,五明是世、出世間一切學問;因明、聲明、工巧明、醫方明,這世間的。聲明,換一句話說,就是文字、音韻等等學問,拿我們現在來說的話,換句話說,什麼,這個國文、歷史這一類。然後因明的話,就是理則學、哲學方面的東西;然後呢工巧明的話,就是技術方面的東西,科技方面的東西;醫方明就是醫學。這個每樣東西學通,喔唷,這不簡單喔!現在我們不是,學一樣東西已經是,鑽到裡邊已經了不起了,廣學這個,不簡單!夠不夠?不夠,還要內明——佛法。說對這個五樣東西,每一樣東西要善巧,不但懂得,而且要非常圓滿地懂得,具足這個,可以了!這是第一種圓滿因。 [03′31″]</p>
<p>   我們看看,說:「<p> 善所知五種明處<p> 」,在這一段裡邊師父講了,單舉一個例子,比如說醫方明,單學一個醫學的話,有人就要傾盡畢生的精力、追隨很多的老師,但是也未必能夠學得精通。但是這五明大師要善知五種明處,尤其是還要有內明——佛法。師父說現在的人學一樣就可以了,像對這種具足能夠造論條件的善知識,他要廣學因明、聲明、工巧明、醫方明,這任何一個明處,都要花下很多的體力、時間,然後要跟隨著各自善巧的善知識來學。所以是非常勤奮好學的人,才能夠學到五明啊!內明有可能要傾盡畢生的心血,乃至生生世世,才能夠達到一定的成就。所以是非常不容易的一件事情!就是看起來他是多麼地博學和聰慧,這是造論的第一種圓滿的因。 [04′46″]</p>
<p>   那麼還有「具教授」,大家再接著往下聽。 [04′53″]</p>
<p>   第二呢?<p> 及具教授,<p>   什麼叫教授?喏,這裡解釋了:<p> 謂從正徧知展轉傳來,於其中間善士未斷修持彼義扼要教授,<p>   他說這個圓滿佛法的重要的概念,從佛親自傳下來的,而且中間沒有斷過;不但是這個教法,而且還要修、證相應的,這點就不容易喔,這點就很不容易喔!要佛親口傳下來的圓滿的教法,以及跟這個教法相應修持驗證的,要具足這個,他也的的確確能夠造論了。 [05′39″]</p>
<p>   在最初我們一起學《廣論》的時候,看到這一條「<p> 具教授<p> 」,可能都睜大了眼睛看,然後側耳傾聽:具教授是什麼呢?原來是「<p> 從正徧知展轉傳來,於其中間善士未斷修持彼義扼要教授<p> 」。從正徧知展轉傳來,就是這個圓滿——師父在佛法前面加了「圓滿」的佛法,是從佛親自傳下來的。大家可以想一想,它的時間的悠遠,從佛傳下來的;然後從佛那個時候傳到我們現在,是「於其中間善士未斷」,就是完全沒有間斷過的,應該就是祖師傳祖師、祖師傳祖師這樣,傳了好幾千年傳到現在的。而且它不僅僅是教正法,還要有證正法的傳承。要具足這樣的教授,然後才能造論。大家都知道這是一個多麼珍貴難得的因緣,能夠具教授,如果能夠值遇具教授的善知識,那真是太幸運了! [07′02″]
<p>   那麼「具教授」是一個能夠造論的條件。除了這一點,還有什麼條件呢?大家可以接著再聽師父講。 [00′12″]</p>
<p>   那麼第三種呢?<p> 並得謁見本尊天顏,獲言開許。<p>   他修證了以後,欸,還要得到這個本尊開許,什麼叫本尊開許?說一下。譬如說我們現在念佛,平常我們念佛那只是持名念佛,假如我們觀想念佛,不管你持名也好、觀想也好,不但得到一心不亂,而且得到三昧;不但得到三昧,親見阿彌陀佛;不但親見阿彌陀佛,阿彌陀佛就告訴你:「某人哪,你現在學得差不多了,學對啦!你現在可以教別人去了。」要有這個,要有這個!喔唷,這個在我們來說起來非常不簡單,非常不簡單!<p>   尤其是修學圓滿教法的,通常獲得這個本尊開許的話,那個也許加行位上勉強可以,至少那通常都是地上菩薩。所以這種人,平常我們可能著魔,你不認識;如果真正有這個圓滿教法的話,那魔、佛之間,辨得很清楚。所以你親自見到,而且驗證,得到他的開許,這個何等高的境界啊!那具了這個條件也可以造論。現在我們阿底峽尊者,三樣東西圓滿具足,那你可想像到他是何等的殊勝哪!那麼這個就是特別說明一下這個造者殊勝。其他的文字,我不去解釋它了,不去解釋它。 [01′47″]</p>
<p>   我想問大家:獲得本尊開許——「<p> 獲言開許<p> 」的話,那就是他一定見到本尊天顏了,對吧?見到本尊天顏了,那之前要經過戒定慧的嚴格修鍊,修鍊到真實地見到本尊,然後本尊能教他,比如說可以造論了,開許了嘛;本尊就像自己老師一樣見到,然後給自己講,這是一個很高的成就。 [02′20″]</p>
<p>   但是師父在這裡邊還講了一點,平常的人好像輕鬆地就見到本尊,他就說他見到本尊了,師父說那平常我們可能是著魔了。因為比如說有人打坐呀或者祈求,然後輕鬆就覺得見到了佛菩薩或者見到誰了,好像有跟自己說話,然後他說的話這個修行者就當真,實際上這是不可以的!你見到的到底是什麼,其實都要去問老師、問有修證的人。不能你見到一個差不多模模糊糊的形象,甚至也沒見到什麼,想一想大概是這樣的。像這種,一般的善知識都會說:「你好好修行,不要依靠這個!好好學經論。」學經論時間長一點,其實越學經論它就越模糊,後來就不見了。 [03′13″]</p>
<p>   真正地見到本尊的天顏是一件不容易的事情。見到本尊之後,他所講的和經典上講的完全是一致的,而且這個本尊他教授的——戒律是絕對不可以廢弛的,是順應三主要道的。 [03′31″]</p>
<p>   有的人就因為打坐的時候見到這個、見到那個,然後就整天聽他說什麼,結果連經典都不學了,尤其是常常預言吉凶,做一些很奇怪的事情。在這裡邊要特別注意走火入魔的問題,這可能跟本尊沒什麼關係,是自己修行出了岔子,趕快去校正。千萬不要去聽信這是什麼,要以經典的為主、要以戒律的為主。比如說我們受了五戒就好好地持五戒,受了菩薩戒就好好地持守菩薩戒、學習菩薩藏經,好好地學習經論。這樣我們經論的底子越來越厚了,所學的越來越廣博之後,我們才能夠分辨他所講的到底是什麼。那麼就算我們見到本尊之後,他講的也跟佛講的沒有差別。所以現在雖然我見不到本尊,但是我現在好好學這些也並不是浪費時間啊! [04′25″]</p>
<p>   這點師父說:如果真正的這個圓滿的教法的話,魔和佛之間是辨得很清楚的。比如說你去啟問他空性的教義,他是怎麼理解的;啟問諸法非常甚深的部分,那不是本尊肯定答不上的——妙音笑大師啊、月稱論師啊、很多祖師寫的論,那個難解的地方就答不上的。你還不如來學經論,這樣多踏實啊,完全不會有危險性,好好學經論就可以了。 [04′58″]</p>
<p>   所以有人一打坐,有時候他就會追求見佛菩薩啊、聽到什麼聲音啊,其實這是不對的。學奢摩他的時候,我們要有意識到是要讓我們這個心能夠隨著正念轉,要學會控制自己的心;不是隨著一個什麼聲音然後跟著它走,是學會要用善所緣控制自己的心,直到控制得非常地自如,獲得身心輕安,再拿這樣的一個非常有力的心去緣毗缽舍那,不是為了追求什麼樣、什麼樣的境界,而是為了要去了解空性,乃至證得空性的緣故。 [05′35″]</p>
<p>   所以師父在這邊說:佛、魔之間,辨得清楚啊。這是非常重要的一件事!對我們這些雖然學了很久,但是可能也是初學者,在這點一定要記住!平常一些人見的那個境界,和這裡邊見的本尊天顏完全不是一回事情!大家要善加辨別! [05′58″]
<p>   今天我們繼續學習阿底峽尊者的功德。是學習《四家合註入門》,請大家把書翻到《四家合註入門》144 頁,看中間的原文: [00′15″]</p>
<p>   <p> 第三、辨識造論圓滿三因:<p> 如是造論光顯能仁所有密意,復有三種圓滿勝因,謂<p> 一、<p> 善所知五種明處及<p> 二、<p> 具教授,謂從正遍知輾轉傳來,於其中間善士未斷,修持彼義扼要教授;<p> 三、<p> 並得謁見本尊天顏,獲言開許。此等隨一雖能造論,然三齊具極為圓滿,此大阿闍黎三皆備具。<p>  [00′56″]</p>
<p>   那我們看一下仁波切的講記,說現在是科判裡的第三科。如果要造一部破除邪法、清淨無誤的論典,仁波切講必須具備三個圓滿的因,妙音笑大師用這個科判來含攝下面的內容。「<p> 光顯能仁所有密意<p> 」,如果想造一部闡揚佛陀無垢聖教密意的論著,就要有「<p> 三種圓滿勝因<p> 」。 [01′27″]</p>
<p>   第一個就是「<p> 善所知五種明處<p> 」,造論者必須要通達五明,這也是一個很高的條件哪!可能不是一個博士學位的問題,是很多科都要讀到很精湛的、精深的部分。然後第二,說要「<p> 具教授<p> 」,就是不管造什麼論,都要有修持扼要的教授,「具教授」,具有「<p> 從正遍知輾轉傳來,於其中間善士未斷,修持彼義扼要教授<p> 」。在這裡邊仁波切講到有傳承的教授很重要,就是要有清淨傳承的教授,這是第二項。 [02′17″]</p>
<p>   西藏有這樣的一個說法:「大江的源頭,須自高山雪嶺;教法的源頭,須自圓滿世尊。」很美呀!長江大河的源頭,是在高山的雪嶺融化下來的;那麼教法的源頭,它源自於圓滿的大覺世尊。從世尊依序傳持下來很重要、很重要!如果傳承的根源不清淨,很難有清淨的法,所以必須要有清淨的傳承。如果有清淨的傳承,就會有清淨的口訣,最重要的就是要有清淨的口訣,所以傳承和清淨的口訣這兩項都是很重要、很重要的! [03′09″]</p>
<p>   「根源」,根源一定要是從佛、世尊這裡傳來的,中間他的傳承是不能夠有染雜的,要清淨;這裡邊要有清淨口訣,就是祖師傳祖師、祖師傳祖師這樣傳下來的。 [03′29″]</p>
<p>   那麼接下來第三點,就是「<p> 謁見本尊天顏,獲言開許<p> 」。仁波切在這裡邊講說能親見本尊是非常困難的,而且又得到本尊的親口開許,這裡邊說在夢中夢到本尊開許也算,有一些經論是這樣說的。所以必須獲得本尊親口或者在夢中的開許,這樣才算。如果造論者能夠具足這三個條件,那就是最好的了。 [04′01″]</p>
<p>   在這裡邊再多講一句,師父說能親見本尊是非常困難的,但是對於一些修行人來說,他認為他能見本尊是非常容易的事情,好像前面的未到地定也沒經歷就見了。那麼為什麼這麼容易呢?見到的可能十有八九不是本尊,可能是有點走岔了,在這點因為很多大善知識都如是說,所以我們修行人,尤其是愛打坐的或者很願意求各種境界的,在這點要尤為地慎重!就是你見到了誰,一定要去問自己的老師:「這是誰?他所說的東西可以信嗎?」老師要是說這是完全不懂修行的,有的甚至就是現起障礙了,一定要以老師的為主,聽自己的善知識的,要以經典為主。 [04′49″]</p>
<p>   尤其是有一些人,比如說他愛講一些預言,預言這個、預言那個,有的人就是講說預言團體怎麼了、怎麼了、怎麼了,其實都是一些沒有任何真憑實據的胡說八道吧!如果你去相信這個,一直把注意力放在這裡,人生的大好時間沒有用來學習教典,這是一件非常遺憾的事情!久了之後見解會有毒了,然後就會離開善知識了,因為善知識一定不會教你這個的。所以這點要非常非常地注意! [05′20″]</p>
<p>   如果造論者能夠具足這三個條件是非常好的,如果沒有全部具備,「<p> 此等隨一雖能造論<p> 」,即使具備其中的一個也是有造論的能力的,「<p> 然三齊具極為圓滿<p> 」。如果具有三個條件,就會非常圓滿。總之,造一部圓滿的論典,必須具備這三個條件,大阿闍黎覺窩傑阿底峽尊者具足了三種造論的圓滿因。 [05′54″]</p>
<p>   接著仁波切講說:以前印度班智達造論的時候,比如說在止迦摩囉室囉寺的某個班智達今年造了一部論,造完論就要召集全寺的班智達們開始討論、評鑑。說:「這本是今年我造的論,是否符合佛陀的密意、符合佛陀的言教呢?到底能不能夠利益眾生呢?」如果真的是一部好的論典的話,大家評鑑完了,然後還要敬呈國王作為最後批准發行;如果書中的內容不夠圓滿,就禁印——禁止印刷,所有的班智達都會破斥、反對發行。大家的規矩是很明顯的。 [06′41″]</p>
<p>   然後他們還有一種作法,就是把這本論要綁在狗尾上,以示這位班智達的書不能流通。說以前有這種嚴格的規矩。造論是非常非常重大的一個事情,應該說驚動全國、驚動國王的一件事情,要傾盡整個寺院的力量,都是那些大班智達一起來評,所以是非常非常慎重的一件事情!造論的傳承的規矩是非常嚴謹的。 [07′12″]</p>
<p>   說過去在西藏,書籍的著作也是很謹慎的,如果要印出清淨的典籍,通常都去這幾個印經院,像德格印經院、拉薩雪印經院,也是很多智者一起評鑑,如果清淨才能發行。然後接著說一句:「不像現在,只要隨便寫出來就可以印製。」 [07′34″]</p>
<p>   看了這一點,特別好印一個什麼流通的人,大家真的要注意一下!因為印成一本書了之後,通常這本書就會一直留在世上,然後它會向後傳。如果我們印製了不清淨的書——這裡邊的說法有待於觀察,甚至沒有請很多智者去看一看行不行,那是否可以考慮就不要印刷。因為總不能只寫自己的想法,都是要光顯能仁的密意;寫自己的想法,沒有任何經典的依據、傳承的口訣的依據,這非常有可能引導自他走向三主要道的反方,或者摻了很多不清淨的見地。這對自他、對眾生沒有什麼利益,那沒有什麼利益,為什麼要在世上出現?對眾生沒有利益,就沒有什麼作用,就不用出現了。 [08′28″]</p>
<p>   所以我們學了這個造論的三因之後,真的要學一學祖師們對於造論的這種嚴謹的態度。像我們寺院的法師們在翻譯經典的時候,也是非常地嚴謹,經過了好多道的程序。考據的法師對任何一種說法,比如說它出自於大藏經的哪一部?論典的哪一部?哪一位祖師說過了?甚至不同版本的是怎麼印刷的?差距在哪?這樣找完了之後,還要去問善知識他們的看法是怎麼樣,然後再討論,然後再校對、再去找。應該說下了一些功夫,但是也不是以此為足,我覺得我們應該可以做得再好一些、再好一些,因為畢竟在探求真理的這個路上應該是永無止境的。 [09′18″]</p>
<p>   所以希望大家能夠看了這一段,說阿底峽尊者具足造論三因這樣一個圓滿超勝的條件,真是讓我們內心裡非常非常地歎服!那麼歎服之餘,要想一想:具足了造論三因的這樣一個善知識,他寫出來的清淨的論典足以彰顯能仁的密意,那我們依之而修行的話,就是我們最大、最大的福分!所以還是非常非常頂禮這樣的善知識們,也很隨喜大家能有這樣的善根值遇這樣的論典,而且也有信心隨學。 [09′58″]
<p>   今天我們繼續學習阿底峽尊者的功德。請大家翻開《四家合註入門》146 頁,看中間「<p> 第四分三<p> 」,這裡邊會介紹阿底峽尊者為本尊所攝受的狀況。看原文。 [00′22″]</p>
<p>   <p> 第四分三:第一、本尊所攝受者:<p> 其為本尊所攝受者,如《讚》云:「勝歡喜金剛、<p> 〔<p> 立<p> 三<p> 三昧耶王,<p> 屬事部之能仁,結說法印,即今《修法大海》等論所載者是。三三昧耶者,謂身語意;或指不臥於床、不飲酒、不食似手印三者。〕<p> 雄猛世自在<p> 觀世音<p> 、主尊度母等<p> 即勝樂輪、不動尊共六尊<p> ,謁顏得許故,或夢或現前,常聞最甚深,及廣大正法。」<p>  [01′09″]</p>
<p>   現在大家可以看一下仁波切的講記。這科判第四個分三,第一就是「本尊所攝受」。覺窩傑具德阿底峽尊者具備這三個圓滿因的狀況是如何呢?首先,「<p> 其為本尊所攝受者,如《讚》<p> 」,這個讚就是指《八十讚》,「<p> 如《讚》云:勝歡喜金剛,立三昧耶王<p> 」,「勝歡喜金剛」就是指本尊喜金剛,「立三三昧耶王」是指釋迦牟尼佛。「<p> 屬事部之能仁,結說法印,即今《修法大海》等論所載者是。三三昧耶者,謂身語意;或指不臥於床、不飲酒、不食似手印三者。<p> 」「事部之能仁」,密續有四部——事部、行部、瑜伽部、無上瑜伽部,這個事部,它是密續四部中的第一部,為什麼叫事部呢?它主要是透過沐浴、清潔等外在的行為修持密法,所以稱為事部;這裡邊是事部的釋迦佛。 [02′25″]</p>
<p>   這裡邊要解釋的就是,通常「三昧耶」是指誓言,但是「立三三昧耶王」就是指釋迦佛。然後這裡邊還要解釋一下,它說「三昧耶者」指身語意的三昧耶,或者是指不臥於床、不飲酒、不食似手印三者。「不食似手印」是指什麼呢?就是指不食用形狀做得像手印和人、動物的食物。 [03′00″]</p>
<p>   接下來就講到:「<p> 雄猛世自在<p> 觀世音<p> 、主尊度母等<p> 」。「主尊度母」就是綠度母;這裡邊提到「雄猛世自在觀世音」,就是指觀世音菩薩。有很多對觀世音菩薩的稱名,像普陀主、世間主、世間自在、大悲尊、蓮花手等等;這裡邊說還是導師釋迦佛的八大近侍佛子之一,另外雄猛世自在觀世音是三世諸佛大悲的一個總聚體,大悲的代表。那麼度母——這裡邊說主尊度母,度母就是指佛教的本尊,主要是白度母和綠度母。 [03′51″]</p>
<p>   接下來,「<p> 即勝樂輪、不動尊共六尊<p> 」,「勝樂輪」就是無上瑜伽部的母續的本尊,或者有人稱勝樂金剛、黑茹迦。「不動尊」,這裡邊仁波切解釋為是忿怒不動明王,不是五部如來的不動佛。這是噶當派的六個本尊,覺窩傑尊者平常的課誦就是這六位本尊的自生法等儀軌,主要依止的本尊也就是這六尊。格西對「不動尊」的解釋是說,是指阿底峽尊者的不共護法,尊者在前往拜見金洲大師的途中遇到了很多的災障,都是由於他的護持而順利度過的。也會有本尊和護法都是一尊的,像瑪哈嘎拉,他是忿怒的觀世音,但是他也是不共的護法、大乘的護法。在這裡邊,仁波切為我們介紹說噶當派的六個本尊,阿底峽尊者常常修的是這六位本尊的自生法等儀軌,主要依止的本尊也是這六尊。 [05′07″]</p>
<p>   「<p> 謁顏得許故<p> 」,就是直接地現見了他們,並且獲得開許。「<p> 或夢或現前,常聞最甚深,及廣大正法<p> 」,就是說或者在夢裡呀、或者直接現前——直接現前是什麼意思?可能靜坐的時候,或者有的時候本尊現前也不一定是在靜坐的時候,已經直接就像師生一樣對話,像生活一樣地這樣對話——經常從他們聽聞甚深、廣大的正法。 [05′41″]</p>
<p>   這些本尊當中,度母是以常人談話互動的方式在尊者的面前,這個有大量的史料記載。在尊者進入西藏之前,尊者就啟問度母說:「此行是否有利藏人呢?」度母就授記說:「對藏人有廣大的利益,尤其是依靠一位優婆塞——種敦巴,會產生很大的利益。透過這位優婆塞,就能作廣大的佛教事業。」這就是「謁見本尊天顏」的部分。 [06′20″]
<p>   在開始今天的課程之前,我先請大家看一下《四家合註入門》的 147 頁,我做一個更正。這裡邊的第一行,說「勝歡喜金剛」就是本尊喜金剛,「三昧耶王」是指釋迦牟尼佛——這個是法師在翻譯的時候漏掉了,是「立三三昧耶王」,是這樣的,前面有個「立三」兩個字。希望大家在《四家合註入門》自己用筆把它加上去。 [00′35″]</p>
<p>   接下來,大家可以看這一步,像尊者準備進入西藏之前啟問度母。其實很多上師都是遵循著我們《廣論》中的皈依學處,但有什麼事情都是要啟白上師、三寶、本尊,得到加持和開許然後再去做。所以像這麼偉大的上師,他取得了這麼了不起的成就,但是他還是要問說:「我這樣去西藏的行為,到底能否有利益藏人?」 [01′12″]</p>
<p>   像師父在做什麼事情之前,也常常是啟白三寶,啟白的最根本的一個理由都是:這樣對聖教會有利益嗎?這樣可以利益眾生嗎?都是以這樣的前提。從來沒有說:這樣我是否很吉祥?我能得到什麼?從來沒有任何一絲絲這樣的一個希求而去祈求的。 [01′35″]</p>
<p>   所以我們可以看到,越是偉大的上師,他們的皈依學處越是守得非常地清淨,而且跟本尊的關係就像師生關係一樣,甚至就像母子關係一樣。不過他們談的家常話就是:怎麼樣的行為可以利益眾生?怎麼樣的行為能對聖教有益?這就是佛家族裡邊的菩薩,或者佛示現的,他們就是這樣的。並不是我們有很高的修行,什麼事情都可以自己做主了,甚至自己做主的就跟本尊一樣了,好像也不用啟白了,越有修行的大德在這一點上尤為嚴謹。 [02′17″]</p>
<p>   那麼反觀察我們,我們常常自己給自己做很多決定,一堆一堆的計劃出爐,當這個計劃出爐的時候,甚至都不願意跟自己的上師講一下。因為有的時候講了之後,上師就直接把你的計劃給砍掉了,說:「這個對聖教的利益不大!」唯恐自己的計劃被砍掉,所以有的時候就是能講就講、不能講就不講,趕快沿著自己的想法做。像這樣的一個習慣,看了這一段之後,大家可以稍微觀察一下自己,或者說透徹地觀察一下自己:我們要不要養成做什麼都會啟問本尊這樣的一個習慣呢? [02′58″]</p>
<p>   這位大德能夠依靠他自己的力量造一部論,那麼他經典的水平,還有他修證的水平應該也是很厲害了,但是這麼厲害的大德他要做什麼,還是要啟問本尊、得到本尊的開許。請問為什麼要這樣呢?為什麼造論三因裡要著重地寫這個?我們就看到從最初的依止法到皈依學處,到最後這麼高的一個成就——親見本尊,它都是一脈相承的,淬鍊我們精純的皈依心。越是有成就的大德,他的這個皈依越會做得徹底,不會留什麼餘地。有些人為什麼啟白就是做不了?他就是給自己空間、給自己餘地,或者說太信任自己了。 [03′46″]</p>
<p>   那你說阿底峽尊者這樣的大德,他難道不確信他去西藏會利益到藏人嗎?所有的藏人都知道的事情,那為什麼尊者好像不知道的樣子?他為什麼還要去問度母呢?造論這件事情為什麼還要得到本尊的開許?他完全是有本事、有力量或者說有功德,可以寫一部救世的論著,為什麼還要得到本尊的開許?在經典裡這樣的一些祖師的行誼,就是要提醒我們後學,從一開始親近善知識——什麼事情啟白善知識、得到善知識的加持,到啟白三寶、精進地持守皈依學處,就是常念三寶恩啊、常念上師恩。 [04′35″]</p>
<p>   有些人會認為:老是啟白,好像也沒有時間。還有人認為:啟白了有時候自己一半的計劃,甚至百分之百的計劃都被砍掉了,沒有自由、沒有發揮的自由。但這條路上要發揮的是能夠常常啟白佛菩薩,甚至是每事都會啟問! [04′57″]</p>
<p>   就這一點,我也曾經問過我的好幾位上師,說:「這個皈依學處裡真的每件事都要啟白嗎?」實際上,真正守得精純是要每件事都要啟白。因為你會覺得:哪有一件事是不得到佛的加持、不得到善知識的加持,能靠我自力成辦利益眾生的善行呢?我怎麼自力成辦呢?還有包括從最初的任何一個修證功德的生起,如果沒有上師、佛菩薩的加持,一個凡夫怎麼樣擺脫無始劫來的煩惱習氣,能夠在那麼多障礙和自己退墮的各種可能性下,在可上可下的時候都上一步?都上一步,一定會完成增上生,因為不會向下去。在遇到可上可下的因緣、可上可下的念頭的時候,我們都選擇向上一步!那麼誰給了我們這種勇氣?上師的加持力、佛菩薩的加持力!如果我們不養成啟白的習慣,還是自己拿主意,什麼事都自己拿主意,那終歸是轉自己那一套! [06′01″]</p>
<p>   所以,我是說看這一段,我們反省一下自己:這麼偉大的上師,他的行為都是這樣的,在佛菩薩面前就像一個孩子一樣,什麼自己的行為都問問說:「媽媽!這樣我可以做嗎?媽媽!這樣我可以做嗎?你覺得這樣好嗎?」非常尊重他們的老師,或者說像父母親一樣,非常尊重父母親。所以我覺得還是滿感動的,不知道你們感覺如何? [06′29″]
<p>   今天我們繼續學習阿底峽尊者的功德,請大家把《四家合註入門》翻到 147 頁,看最下一段中間的藍字。 [00′13″]</p>
<p>   <p> 第二、傳承無間斷之理者:<p> 師傳承中,有所共乘及其大乘二種傳承。後中分二,謂度彼岸及秘密咒。度彼岸中復有兩種傳承:謂見傳承及行傳承;其行傳承復有從慈尊傳來及妙音傳,凡三傳承。於密咒中亦復具足五派傳承,復具宗派傳承、加持傳承,及其種種教授傳承等諸多傳承。親從聞學諸尊長者,如《讚》云:「恆親近尊重,響底巴<p> 寂靜<p> 、金洲<p> 法稱<p> 、跋陀羅菩提<p> 覺賢<p> ,及迦那師利<p> 智吉祥<p> ,多得成就者。尊又特具足,從龍猛輾轉,傳來最甚深,及廣大教授。」說有十二得成就師,然餘尚多。<p> 第三、善巧五種明處前已說訖者:<p> 善巧五種明處者,前已說訖。是故此阿闍黎能善決擇勝者密意。<p>  [01′44″]</p>
<p>   那麼這一段傳承沒有間斷的狀況:就是尊者的師承中,有共通乘小乘及其大乘兩種傳承,大乘的傳承中又分為顯教度彼岸乘及密咒乘的兩種傳承。度彼岸乘又分兩種傳承:見傳承和行傳承;尊者的行傳承又有從彌勒菩薩所傳來的,還有從文殊菩薩所傳來的,這裡邊說共有三種傳承。然後在密咒乘中又具足一切密咒的傳承、密集的傳承、母續的傳承、事部及瑜伽部的傳承、閻摩敵的傳承,共五派傳承。另外尊者還具足宗派的傳承、加持的傳承,以及種種教授的傳承等許多傳承。尊者親炙聞法的上師,就像《讚》中說:「尊者長時依止的師長,有響底巴——寂靜、金洲法稱、跋陀羅菩提——覺賢,及迦那師利——智吉祥等許多得到成就的大德。特別是您還具足從龍猛輾轉傳來的甚深和廣大的教授。」相傳尊者有十二位得到成就的師長,另外還有許多其他的師長。接著到第三科、尊者善巧五種明處,前面已經講過了:尊者善巧五種明處的情形,前面已經講過了。所以,綜上所述,這位大阿闍黎是能夠周密地抉擇佛陀的意旨。 [03′28″]</p>
<p>   下面我們看一下仁波切的講記。這一段主要是學習阿底峽尊者的傳承——傳承也就是師承。「<p> 第二、傳承無間斷之理者:<p> 師傳承中,有所共乘及其大乘二種傳承<p> 」,就是覺窩傑具德阿底峽尊者所擁有的傳承。那麼「所共乘」就是大小乘的共通乘。一般是指相續中生起大乘道或小乘道都必須先修習的意樂,譬如皈依、出離心。但還有一位善慧摩尼大師認為此處所說的共乘傳承指聲聞四部等小乘傳承。 [04′12″]</p>
<p>   「<p> 後中分二<p> 」,「後中」就是指大乘,這個「分二」就是「<p> 謂度彼岸及秘密咒<p> 」——顯、密。「<p> 度彼岸中復有兩種傳承:謂見傳承及行傳承;其中行傳承復有從慈尊傳及妙音傳,凡三傳承。<p> 」這所有的傳承具德阿底峽尊者都是具有的。 [04′35″]</p>
<p>   接下來是「<p> 於密咒中亦復具足五派傳承<p> 」,這個「密咒中」,例如父續傳承、母續傳承——父續又是指什麼呢?就是指密集為主的諸多本尊。那母續是指什麼呢?指勝樂為主的諸多本尊。第三個是事部及瑜伽部,第四個是一切密咒傳承,接下來就是閻摩敵的傳承,這個五派傳承在《廣傳》中都有記載。 [05′10″]</p>
<p>   接著說:「<p> 復具宗派傳承、加持傳承,及其種種教授傳承等諸多傳承。親從聞學諸尊長者,如《讚》云:『恆親近尊重<p> (就是上師了)<p> ,響底巴<p> 寂靜<p> 、金洲<p> 法稱<p> 、跋陀羅菩提<p> 覺賢<p> ,及迦那師利<p> 智吉祥<p> 』<p> 」等等眾多獲得成就的上師。 [05′40″]</p>
<p>   然後在這裡邊說:「一切密咒傳承」,特別是指咒語的傳承,這個咒語的傳承包括顯教、密教,還有內外道的種種咒語的傳承。還有這裡邊涉及到「密集」,「密集」是指無上瑜伽部的一位本尊的名字。無上瑜伽部分為父續、母續兩種,父續主要是闡釋密法中的方便分,母續主要是智慧分。「瑜伽部」的傳承也是四部密續的傳承之一。瑜伽部是四部密續中的第幾部啊?第三部。此部修習密法的時候,以內在瑜伽為主,但是還不是最殊勝的密法,所以稱為瑜伽部,這一部的傳承就是「瑜伽傳承」。「閻摩敵」就是無上瑜伽的一位本尊的名字,至尊文殊化現的忿怒相的本尊。 [06′39″]</p>
<p>   還有一個,「<p> 於密咒中亦復具足五派傳承<p> 」,這個改譯了一下。還有「<p> 宗派傳承<p> 」,就是泛指各種內外道宗義的傳承,因為我們也會學到外道宗義,對不對?「<p> 及其種種教授傳承等諸多傳承<p> 」,法尊法師原來的是「及其種種教授傳承等」,沒有「諸多傳承」,這個根據藏文譯本又改譯了一下。 [07′09″]</p>
<p>   這個「<p> 如《讚》云<p> 」,就是《噶當箴言集》的那個《讚》。現在就涉及到阿底峽尊者的上師,他就說:「<p> 恆親近尊重,響底巴<p> 寂靜<p> 」,「響底巴」翻譯成寂靜,又可以翻譯成寶源寂靜,是九世紀時代的上師。他是婆羅門種姓,在摩羯陀國提婆波羅國王的時候進入佛門出家,博通五明,名聲遠揚。曾經有一個很重大的事情,就是應斯里蘭卡國王迎請去斯里蘭卡,當時大臣和百姓聽到這個上師要乘船將至,就在海邊等待了七天,並且把海邊到國內的路途徹底地清掃,沿途旗幟飄揚,國王也做了廣大的供養。 [08′09″]</p>
<p>   這位上師非常地長壽,到了百歲的時候,他有一個弟子叫多希巴大師,非常地出色、非常地精進,在十二年間勤修無分別法,獲得了大手印的成就,安住在原始法性中。這時候帝釋天看到了這麼偉大的成就者,就很想迎請多希巴大師到三十三天,可是多希巴大師捨不得自己的上師,他說:「我要去禮拜上師響底巴大師,就算如今我已成佛,上師的恩德依然浩瀚無盡。」然後他就以神通剎那間飛到了響底巴大師的住所。他跟響底巴大師的住所,大概要用六個月的路程才能夠來到他上師的住所,但他用剎那間就完成了。 [09′12″]</p>
<p>   去了之後,他將所得的一切無分別的教授等等全部供養了響底巴大師。最精采的是響底巴大師學習十二年後,也獲得了大手印的成就。這裡面說的百歲,應該是他的弟子成就時候他百歲,等到他修習十二年之後獲得大手印的成就,他已經多大年齡了?一百一十二歲,從一百歲開始修法,然後修習十二年獲得大手印成就。 [09′47″]</p>
<p>   我覺得這兩個師徒真的是很不可思議,很令人驚愕!百歲老人就是個奇蹟了,但這裡邊說還能夠經過十二年的修行獲得大手印的成就,真的是奇蹟中的奇蹟!所以我們修行人也要學習這樣的大上師,不管年齡多大要勇於修法,不要被年齡所限。當然這樣的成就者,他可能是本來就不同凡響,但是我們就是為了要不同凡響才修行的,就是不滿足於做一個凡夫。這位就是阿底峽尊者的上師。 [10′24″]
<p>   接著還有一位「<p> 跋陀羅菩提<p> 」,也是阿底峽尊者的上師,也在九世紀,他叫「<p> 覺賢<p> 」。慧海大師曾經說過:阿底峽尊者在這位上師的座下聽聞了一切宗義各派的說法,所以是恩德滿深的。接著還有一位「<p> 迦那師利<p> 」,也是阿底峽尊者的上師,也在九世紀,梵語迦那師利,義譯為「<p> 智吉祥<p> 」。 [00′32″]</p>
<p>   這裡邊要解釋一下,阿底峽尊者實際上曾經依止一百多位上師,有十二位得到成就。這十二位得到成就的上師:上師阿哇都帝、閻摩敵瑜伽師、種比跋,這三位稱為三瑜伽師;勸請尊者出家的瑜伽母、度母所授記的瑜伽母及迦那師利所授記的瑜伽母,這三位稱為三瑜伽母;加上獲得神通的菩提賢、哲達里、法鎧三位上師,還有傳授金剛瑜伽母加持的瑜伽母、指示往金剛座道場的瑜伽母及開示遺教的瑜伽母,共十二位。這個是《噶當父法》裡邊有記載的。 [01′25″]</p>
<p>   學了傳承這一段,不知道諸位聽起來是怎樣的?會不會覺得:喔,有這麼多種傳承!師從這麼多位善知識,得到這麼多種傳承,大家心裡會想什麼呢?這裡邊我想講一點是:提到傳承,就一定會提到善知識,因為沒有善知識就沒有傳承,從何處得到傳承呢?看這些精采的善知識傳下來的這個傳承,大家都知道甚深、廣大行的教授,阿底峽尊者把它融會為一了。哇!這麼多精采的大善知識,把這麼多的傳承都傳給了阿底峽尊者,有沒有一種富麗堂皇的感覺? [02′18″]</p>
<p>   所以像這麼絕頂聰明的阿底峽尊者,他有這麼多了不起的上師來教,那何況這麼愚笨的自己呢?這麼渺小的自己呢?更要去勤求善知識,還要希求清淨的傳承教授,絕對不可以認為沒有傳承教授修法能夠修出來,按照自己所理解的佛經、所理解的論典,甚至自己看一看書就覺得:啊!可能這一段的意思是這樣。依自己的意思去解釋經義、論義,而不依佛陀所授記的菩薩解釋經義的來解釋的話,非常容易地就墮落三惡道,因為會錯解經義、會錯修行。 [03′02″]</p>
<p>   所以,怎麼樣覓得一條清淨無染的修行之路呢?一定要追隨有清淨無染傳承的上師們。上師們的清淨傳承是怎麼得到的呢?是從他們的上師得到的。然後這樣輾轉、輾轉往上推,就像長江大河的水從哪裡來?從雪山來,那麼我們所有的傳承的源頭就直接會推到釋迦佛,這個傳承居然可以從上師推、推、推,一位一位推、推、推到釋迦佛。看起來釋迦佛到現在已經兩千多年了,但是我們依然能夠學到原汁原味的佛陀的密意,全靠善知識們的傳承。如果沒有這個傳承的鏈條,我們現在學的也不知道是什麼,都不是佛陀的意思了。因為我們的導師是佛陀,我們想跟隨佛陀獲得他所獲得的遍智的果位、大覺的果位,獲得他那樣的悲、智、力,所以一定要沿著他所看到的那個真理然後去修鍊自己。 [04′07″]</p>
<p>   但是他所看到的真理到底是什麼樣,如果沒有善知識、佛菩薩造論的話,我們是很難徹見本源的。所以對於我們這些弟子來說、對我這樣的一個凡夫來說,如果沒有這些傳承的善知識辛辛苦苦地把這個傳承傳至現在,我又何德何能能夠知道哪怕是一段經文的意思呢?哪怕是一段論典的意思呢?可能心中有好多意思,到底取哪一個呢?就進入懷疑的兩端,決定下來的東西也不一定是對的。 [04′47″]</p>
<p>   因為有傳承寫得這麼清楚,所以我們的自宗也不可能是飄來飄去的,自宗就是這麼承許的。所以我們辯論場上反覆地討論自宗還有他宗,還有決疑等等很多,這些對我們能夠得到非常清淨無染的見地有絕對的幫助。有老師學,又有同學相互切磋,自己又有這麼多論典可以去閱讀,真是好像在佛法的大海裡的感覺。雖然學起來並不是很容易,但是比一個人去讀大藏經想要獲得其中的三主要道不知道強多少倍了。五大論雖然好像很浩瀚——確實很浩瀚——但是比一個人閱藏,我覺得實在是輕舟已過萬重山,非常非常輕鬆的學習方式! [05′40″]</p>
<p>   讀到了這一段阿底峽尊者的這些傳承,我們還是要發願能夠學到這麼多清淨圓滿的傳承。因為阿底峽尊者一定會把他的傳承再往下傳,對於上師有信心、對佛法有信心的弟子們,一定要希求清淨圓滿的傳承。這些珍貴的傳承在這個世界上存在,對我們來說具有著極其非凡的意義,因為解脫的慧命就是靠上師來養育,就像父母養育小孩一樣,我們的法身慧命都是上師來養育的。上師用什麼來養育?就是法乳來養育。那麼這個清淨的傳承就像法乳一樣,會養育我們的法身慧命。 [06′24″]</p>
<p>   所以感恩阿底峽尊者及其所有的這些偉大的善知識們,因為他們住持著這個偉大的傳承,傳到現在,我們才能夠聽到這些名字,才知道:哇,世上有這麼多精采的傳承!如果不學的話,完全是墮在一片無知的黑暗裡,以為自己理解的經義甚至就是佛陀的意思,甚至還以為:我無師自通,我是最厲害的,我不用看祖師們的解釋我就能明白。真是離題萬里! [06′55″]</p>
<p>   我是稍微清楚一點我有多笨,所以一定要好好地跟老師學;我是不敢相信我自己看完經之後理會那個意思,所以一定要依照龍猛、無著二大車軌的意思來學習《般若經》,學習一切經教。也希望我們這些對於《道次第》勤修、有信心的佛陀的弟子們能夠發起尋求清淨傳承的熾盛的意樂,好好地依著傳承的教授聞、思、修。因為這條路畢竟是最穩的,也是最節約時間的,也是最讓我們省力的,最不讓我們受苦的、少走彎路的。這些傳承都是善知識們留給我們的無價之寶,彌足珍貴! [07′42″]</p>
<p>   所以千萬千萬要好好珍惜!聽到的時候要有希求心、要有敬意,祈願令法久住,也祈願善知識能夠長久住世,因為這樣我們才能夠聽到這些傳承。希望大家能夠真的發起令法久住的這樣一個祈願,祈願善知識久住! [08′04″]
<p>   請大家翻開《四家合註入門》150 頁,我們繼續學習阿底峽尊者的功德。請看 150 頁第一段藍字的部分。 [00′15″]</p>
<p>   <p> 第五、殊勝弟子,分二:印度、阿里、西藏三地弟子者:<p> 此阿闍黎於五印度、迦溼彌羅、<p> 〔鄔智<p> 依<p> 雅那音變為<p> 鄔僅<p> ,飛行國。〕<p> 、尼泊爾、藏中諸地,所有弟子不可思數。然主要者印度有四,謂與依怙智慧平等大<p> 〔<p> 班智達<p> 義譯通五明者。〕,<p> 號毘柁跋,及達摩阿嘎惹瑪帝<p> 法生慧<p> 、中獅、地藏,或復加入友密為五。阿里則有寶賢<p> 〔<p> 譯師<p> ,羅嘎紮克<p> 有<p> ,意為世間眼,略作羅紮瓦。〕<p> 、那措譯師、天尊重菩提光;後藏則有迦格瓦及廓枯巴天生;羅札則有卡巴勝位及善護;康地則有大瑜伽師、阿蘭若師、智慧金剛、卡達敦巴;中藏則有枯、俄、種三。<p> 第二、最勝弟子:<p> 是等之中,能廣師尊所有法業大持承者,厥為度母親授記莂,種敦巴勝生是也。造者殊勝略說如是,廣則應知出《廣傳》文。<p>  [01′54″]</p>
<p>   我們接下來看仁波切的講記,妙音笑大師箋註的第五科,「<p> 第五、殊勝弟子<p> 」,阿底峽尊者他殊勝的弟子有多少呢?按地域分為:「<p> 印度、阿里、西藏三地弟子者<p> 」,西藏就是指拉薩衛藏等地。有沒有注意到阿里和西藏是分開的?所以這個西藏就是指拉薩衛藏等地。「<p> 此阿闍黎於五印度、迦溼彌羅、鄔僅<p> 」,藏文中並沒有這個「五」字。「<p> 鄔智<p> 依<p> 雅那音變為<p> 鄔僅<p> 」,也叫作「<p> 飛行國<p> 」。「<p> 尼泊爾、藏中諸地,所有弟子不可思數<p> 」,有很多數量不可思議、功德不可思議的弟子。 [02′46″]</p>
<p>   在聽的時候,我問了一個問題說:「師父,『不可思數』要解釋成『不可思議』嗎?還是『不可思議的數目』?」然後仁波切說:「藏文中並沒有『數』這個字,但此處可以理解為『數量不可思議。』」 [03′02″]</p>
<p>   仁波切接著講:這邊有個「然」字,「<p> 然主要者印度有四,謂與依怙智慧平等大<p> 〔<p> 班智達<p> 義譯通五明者。〕<p> 」「大班智達」義譯為通五明者,即是大班智達「<p> 毘柁跋<p> 」。「<p> 達摩阿嘎惹瑪帝<p> 」,義為「<p> 法生慧<p> 」。再加上「<p> 中獅、地藏<p> 」共四位,這些是在印度的主要弟子,「<p> 或復加入<p> 」弟子「<p> 友密<p> 」為五位。「<p> 阿里則有寶賢<p> 〔<p> 譯師<p> ,羅嘎紮克<p> 有<p> ,意為世間眼,略作羅紮瓦。<p> 〕<p> 」「羅嘎」是世間,「紮克<p> 有<p> 」是眼睛的意思。「<p> 那措譯師,還有天尊重菩提光;後藏則有迦格瓦及廓枯巴天生<p> 」;「<p> 羅札<p> 」,也是地名,在羅札這個地方,「<p> 則有卡巴勝位及善護;康地則有大瑜伽師、阿蘭若師、智慧金剛、卡達敦巴;中藏則有枯、俄、種三<p> 」,「枯」就是枯精進堅固,「俄」就是善慧譯師,「種」就是種敦巴勝者生源。現在就是按照地域,說印度、阿里、西藏三地都有阿底峽尊者的弟子。 [04′24″]</p>
<p>   「迦溼彌羅」就是北印度的古國,現今的喀什米爾,古時候的毗婆沙宗大興此地,後來因為回教徒入侵,佛教逐漸衰微,現今盛行伊斯蘭教,就是在這個地方。 [04′43″]</p>
<p>   然後這裡邊出現了「毘柁跋」,他是阿底峽尊者在印度的大弟子之一,約 11 世紀。依慧海大師的解釋,這個梵語義為「五明者」,因這位善知識他通曉五明而得名。尊者在印度的大弟子有什麼樣的功德呢?可能要再去看一看,今天就不廣講。 [05′09″]</p>
<p>   接著是「達摩阿嘎惹瑪帝」,這位也是阿底峽尊者在印度的大弟子之一,約 11 世紀,他叫「法生慧」。還有「地藏」,也是阿底峽尊者門徒中的大班智達,都是在約 11 世紀。他沒有遇到尊者之前通學內外道教義,通學完了之後,認為內外道一樣的,所以有時候入外道,有時候又自稱自己為內道徒,就是他示現為通學;直到尊者為他善巧地分辨內外道的差別,遂對尊者生起了信心,並拜尊者為師,成為印度能辨別內外道四大師之一。之後曾追隨尊者赴金洲,就是去金洲那個地方,拜見金洲大師學法。大家可能會覺得我已經皈依佛門了,我當然是內道弟子。但是能辨別內外道不是一個小的本事,大家可以慢慢好好去了解一下。 [06′16″]
<p>   接著我們可以介紹一下「寶賢譯師」,是略略地介紹,因為在《阿底峽尊者傳》的時候,我們再廣泛地講一下。寶賢譯師是西藏的大譯師之一,十三歲出家,奉藏王的命令到喀什米爾依止七十五位班智達學習翻譯,譯出了許多的經典。回國後藏王供出一個地方,為他建了寺院,然後請這個善知識宣說顯密的教法。 [00′32″]</p>
<p>   大家可以猜一下他多大年齡才遇到阿底峽尊者?你們心中會猜幾歲呢?他十三歲就出家了,然後又去了喀什米爾依止到那麼多的班智達學習,又翻譯,而且又講經,算算這都多少年了?他八十五歲才值遇了阿底峽尊者!他把所譯出的經論請尊者校正,並且翻譯出阿底峽尊者所著的這個《誓言攝要》。又供養尊者黃金七兩等,求受勝樂灌頂及生圓二次第教授,並且依此教授專修後獲得成就。八十五歲值遇上師、值遇阿底峽尊者,這是寶賢譯師。 [01′21″]</p>
<p>   「迦格瓦」,是阿底峽尊者的居士弟子,他曾經到一個地方去迎請阿底峽尊者,那個地方叫芒域吧!然後經尊者的教導而通達了密法。他向尊者求受歡喜金剛、勝樂金剛等法門,所以現今才有阿底峽尊者在歡喜金剛、勝樂金剛方面的著述。有聽到吧?這個很重要!如果迦格瓦不去跟阿底峽尊者請求受這樣的一個法門的話,阿底峽尊者在歡喜金剛和勝樂金剛方面的著述可能就不會流傳下來,所以他對我們的恩是很深的! [02′03″]</p>
<p>   所以有的時候因為我們去求法了,上師就會把這方面的寫出來,或者講出來了,後世像我們這些弟子們就會讀到。由於他去求法,我們會得到這樣的深恩,不然阿底峽尊者對於歡喜金剛和勝樂金剛方面的著述,我們就是看不到的。所以求法的人啊,他也能夠利益後世很多、很多的有情。頂禮這位善知識! [02′28″]</p>
<p>   還有「廓枯巴天生」,他是阿底峽尊者的後藏弟子,也在 11 世紀。曾經去印度依止阿底峽尊者等七十二位上師,這位善知識他主要聽受密集金剛的法門,也是一個譯師,翻譯很多經論,並且校對《密集根本續》及其釋論。他去印度留學,學完之後,回到西藏之後大弘密集法門。後世的布敦大師,還有宗喀巴大師一系都遵從此師的宗規,廣為弘傳,至今不衰。也是一個去印度求法的大譯師。 [03′09″]</p>
<p>   接著就是「卡巴勝位」,是阿底峽尊者座下的四大瑜伽師之一,也在約 11 世紀。他依止阿底峽尊者五年,聆聽了許多教授,特別熟練對法——就是論。在阿底峽尊者示寂之後,他又繼續依止種敦巴尊者。一生遵循阿底峽尊者的教誡,做什麼呢?捨世專修,親見許多本尊,獲得禪定。但是他圓寂得非常早,四十二歲在熱振寺圓寂。 [03′47″]</p>
<p>   另外,「大瑜伽師」,是阿底峽尊者座下的四大瑜伽師之一,他的本名其實叫菩提寶。也是年幼出家,他在阿底峽尊者的座下聽法,注意!長時隨侍尊者,一直跟著阿底峽尊者。尊者示寂後又奉師教——奉阿底峽尊者的教誨——依止種敦巴大師,常駐熱振寺。種敦巴大師示寂之後,這一位善知識住持在熱振寺十三年之久,期間他就擴建寺院、培育僧才,對佛教做了很大的貢獻。 [04′27″]</p>
<p>   接著是「智慧金剛」,也是阿底峽尊者座下的四大瑜伽師之一。他依止阿底峽尊者三年,聽受了很多教誨,精通各派的宗義,親見觀世音菩薩——看!阿底峽尊者的弟子都這麼精采——心中懷有真實的菩提心。阿底峽尊者示寂之後,他常駐在桑樸一心專修,後來就示寂在這裡。他的弟子就是慬哦瓦。 [04′58″]</p>
<p>   接著是「卡達敦巴」,也是阿底峽尊者的弟子,在 11 世紀。這位善知識通達尊者所傳的許多教授,特別熟練的是波羅蜜多教授。也是在阿底峽尊者示寂之後,他就去依止種敦巴。而博朵瓦、慬哦瓦和樸窮瓦三昆仲,誰是他們的老師呢?就是卡達敦巴,以他為師。後來也是大弘佛法。 [05′32″]</p>
<p>   接著是「枯俄種三」,指枯敦、俄善慧譯師和種敦巴三人。種敦巴後面還會有專門介紹,都是阿底峽尊者在前藏的主要的弟子。像這個枯敦大師,在《阿底峽尊者傳》有他很豐富的傳記,我們這兒只是簡要地介紹。他原來叫「精進堅固」,在依止阿底峽尊者之前有依止其他上師學,後來長時依止阿底峽尊者,聽受了許多教授,特別精通波羅蜜多及閻摩敵的法門,世壽六十五歲。 [06′12″]</p>
<p>   接著是「俄善慧譯師」——桑樸瓦,約 11 世紀。他是在智慧功德這個上師面前出家,之後到了康區,跟隨在覺窩色尊座前聽受經論的教義。他也到芒域這個地方,迎請阿底峽尊者,並且依止阿底峽尊者很多年,通達了許多法門,尤為精通中觀正見。看到這個心中就會有很大的喜悅,想要讀一讀他留下來的關於中觀正見的著作。他依照阿底峽尊者的授記,在桑樸建寺弘法利生,這位善知識是《噶當寶典》的傳人。桑樸瓦依止阿底峽尊者十年,在我們的《菩提道次第廣論四家合註.白話校註集》第 155 頁,這裡邊寫「桑樸瓦依止阿底峽尊者十九年之久」,這個「九」字是多的,把它劃掉就可以了,是十年。 [07′23″]
<p>   接著就到了「第二、最勝弟子」,最勝弟子就是阿底峽尊者的弟子當中最殊勝的。「<p> 是等之中,能廣師尊所有法業大持承者,厥為度母親授記莂,種敦巴勝生是也<p> 」,在這些弟子中,能廣弘覺窩傑阿底峽尊者的法業、最主要承接傳承的弟子,就是度母親自授記的種敦巴勝生。 [00′35″]</p>
<p>   度母曾經授記阿底峽尊者:「覺窩,你到西藏的話,會有一位優婆塞依止你,他將對聖教和有情做極大的利益。」阿底峽尊者可能是和度母師生的關係好得不得了,好像很多事情請問都有問有答。所以阿底峽尊者後來是長時間住在聶塘寺——又稱是「度母殿」的那個寺院,住在那兒長達九年之久。他也就是帶著那個度母像,一直對度母祈求。 [01′08″]</p>
<p>   我們可以看到阿底峽尊者的弟子,對於「種敦巴」特別列出,另外還有「枯」、「俄」兩位,都是對聖教做有極大貢獻的,廣弘上師的事業。 [01′25″]</p>
<p>   接著往下看。「<p> 造者殊勝略說如是,廣則應知出廣傳文。<p> 」〈造者殊勝〉簡單而言是這樣,欲知詳情可以閱讀《噶當父法》、《噶當子法》等尊者的廣傳。這是結語。 [01′44″]</p>
<p>   接著仁波切給我們做了總結!「為顯其法根源淨故開示造者殊勝」這一個科判到現在為止已經結束了。這個法源到底清不清淨、是不是從佛陀一脈相承傳下來的,這是必須要了解的;了解之後,在自相續中對學習《廣論》的欲求心會有很大的幫助。 [02′11″]</p>
<p>   「為顯其法根源淨故開示造者殊勝」,誰是造者?阿底峽尊者。他是怎樣的人物呢?為了明白這點而開出前面〈造者殊勝〉第一個科判。看到造者殊勝時,要再再思惟,意識到這也是我們要學習的。對於尊者他如何奉獻聖教、通達五明——五種明處、守護自己的增上戒學、利益佛陀的教法等等,有許多該了解注意的地方,要多思惟才能真正對造者生起清淨的信心。一旦有清淨的信心,加持很容易就會進來;如果沒有信心,不管怎麼學習,都很難有加持的,所以這對我們的行持幫助非常大。對造者有極為清淨的信心,也會對他所著的論典產生信心;如果對論典有信心,就有想學習的心,同樣地也就會生起想修持的渴望,這是很重要的目的!這是仁波切這一段的結示,特別地精采! [03′33″]</p>
<p>   這裡邊有一個非常重要的問題:怎麼樣能夠生起信心呢?看到〈造者殊勝〉的時候,仁波切說要再再地思惟。再再地思惟比如說:思惟阿底峽尊者有什麼地方是我們要學習的?如何奉獻聖教、通達五種明處、守護自己的增上戒學、利益佛陀的教法、還有他常常祈禱本尊,很多、很多事蹟。師父又加一句:「要多思惟才能真正對造者生起清淨的信心。」所以這一段前面講了,怎麼樣能生起清淨的信心呢?就是要對這些功德多去思惟。 [04′15″]</p>
<p>   平常我們對自己生活中的一些瑣事,有的人常常習慣於反覆琢磨,比如說我不知道現在是不是還對一餐飯吃什麼費盡腦汁?穿什麼?房子怎麼改?或者一些瑣事,跟別人的關係處理又絞盡腦汁。但是有沒有絞盡腦汁地去思惟一下阿底峽尊者的功德?因為這樣的話,我們才會對他寫的論生起強大的信心。 [04′44″]</p>
<p>   後一段,仁波切就叮嚀我們說:「一旦有清淨的信心」——注意!那個大家都期待的結果——加持力就會進來。注意!加持力就會進來,仁波切在這裡邊講了:「加持很容易就會進來。」我們都很想要得到上師、佛菩薩的加持力,比如說想要得到阿底峽尊者的加持力,那麼怎麼樣能夠得到他的加持力呢?要有清淨的信心。怎麼樣能夠生起清淨的信心呢?就一定要多多地去再再地思惟這些功德。如果沒有信心的話,不管怎麼樣學習都很難有加持力的。 [05′29″]</p>
<p>   然後師父說:「這對我們行持的幫助是非常大的。」如果對造者有極為清淨的信心,也會對他的論典產生信心;對論典產生信心,就會想學論,同樣地就會想要沿著論典所講述的這些修行的扼要去修持。師父說:「這是很重要的目的!」我想問大家說:「這是很重要的目的」的「這」是指什麼?是不是要修行佛法啊?修行道次第、修行《菩提道次第廣論》啊?就是要實證三主要道,這是我們學習《廣論》的目的。 [06′06″]</p>
<p>   那麼如何能夠達成這樣的目的?一定要再再地思惟造者殊勝——阿底峽尊者的功德。是這樣吧?數數地思惟之後會產生信心,加持力就很容易進來;加持力很容易進來之後,我們就能夠對修行產生極大的信心。那產生極大的信心精進地修行,哪有不成的?所以再次地強調了對於善知識修信的重要性! [06′37″]</p>
<p>   希望我們一定要把仁波切的這一段放在自己的心上!千萬不要以為學《阿底峽尊者傳》只是聽一聽故事,好像聽一聽那個久遠的故事,它跟現在的時代有一個好像很長時間的隔閡,很多名字都沒聽過。不是由於好奇,而是要為了思惟阿底峽尊者的功德、產生信心來聽的。產生信心做什麼呢?我們要沿著道次第修行,枯竭老死的海,能夠發起利益如母有情的這樣一個心去希求遍智的果位。所以一定要把上師的叮嚀放在自己的心上! [07′22″]
<p>   大家好!今天我們又到了研討《廣論》的時間,已經開始進入「法殊勝」了,在第 8 頁第 2 段。請大家看一下原文。<p> 顯示法殊勝中,法者此教授基論,謂《菩提道炬》。依怙所造雖有多論,然如根本極圓滿者,厥為《道炬》。<p>   請大家聽一下師父的講解。 [00′33″]</p>
<p>   那麼再翻過來有一段文,這個地方也說一下。第八頁第二段第七行,實際上這個就是甲二,第二個:<p> 顯示法殊勝中,法者此教授基論,謂《菩提道炬》。依怙所造雖有多論,然如根本極圓滿者,厥為《道炬》。<p>   法殊勝當中,法有什麼好處?那麼要曉得,這個我們現在本論的這個藍圖,就是《菩提道炬論》。說阿底峽尊者造了很多論,但是最根本的,以及最圓滿的是《道炬》。根本是什麼?圓滿是什麼?說一下。平常我們談科學上面有兩個:一個是充分條件;一個是必要條件;必要是根本,充分是圓滿,兩樣東西。譬如說,一個就是質本身,一個是量圓滿,這兩樣東西,這兩樣都圓滿的是《道炬》。阿底峽尊者雖然造了很多論,這個才是。不但是尊者,佛菩薩也是如此,每一個成就的人,他說的很多法,因為根性不同,所對機不同,他有各式各樣的差別。但是有一個是特別的,就是說最徹底圓滿地把他所悟證的,從下腳第一步到最究竟圓滿的整個的佛法,和盤托出的,這個才是其中最殊勝的,那麼《菩提道炬論》就是屬於這樣的論。所以這地方特別說明,哦,我這個造者固然殊勝,這個法本身也這樣好啊!為什麼啊?他下面解釋一下: [02′31″]</p>
<p>   師父在這一段的講解裡邊,我提一個問題:師父說阿底峽尊者造了很多論,但是為什麼在這裡邊說根本極圓滿者是《道炬論》呢?他這個「根本極圓滿者」,是從哪個方向闡述的呢?你們在研討的時候也會討論吧?為了闡述這個問題,師父說平常談科學上會有充分條件和必要條件,那必要是根本、充分是圓滿——也就是說質是根本、量是圓滿,兩樣東西。那麼對於《菩提道炬論》來說,可以放眼去望菩薩所造的論,都是根據根性不同、所對機不同說很多法。 [03′31″]</p>
<p>   接著師父說:「<p> 但是有一個是特別的<p> 」,請問什麼是特別?這裡邊《道炬論》特別在哪裡呢?接著師父說:「<p> 最徹底圓滿地把他所悟證的<p> 」,最徹底圓滿地把他所悟證的,注意下面的,「<p> 從下腳第一步到最究竟圓滿的整個的佛法,和盤托出的,這個才是其中最殊勝的,那麼《菩提道炬論》就是屬於這樣的論。<p> 」為什麼它是根本和圓滿的呢?大家有沒有看到?是「徹底圓滿地把他所悟證的」,注意!次第,下腳的第一步乃至到最究竟圓滿的佛法,全部都寫出來了,《菩提道炬論》就是屬於這樣的論。 [04′32″]</p>
<p>   所以,在一個成就的人講很多法的時候,根性不同、對機不同的時候,比如說我們會看到某一部經典可能是宣說無常法宣說地很令人心動,而有的會講菩提心,有的可能會講這樣、那樣的。但是,教導一個修行人從下腳的第一步就按著次第這樣,像穿珠一樣一個次第、一個次第這樣講的,《菩提道炬論》是屬於這樣的論。所以這是它特別的地方,也是宗大師說:「然如根本極圓滿者」是《道炬論》的一個原因。那麼接下來還會再解釋,請大家繼續聽: [05′18″]</p>
<p> 具攝經咒所有樞要而開示故,所詮圓滿。<p>   第一個,因為這個裡面包含了顯教、密教所有的宗要,所以它說的內容本身是最圓滿的。它沒有說小乘,因為這個大乘是必定從小乘的基礎上面上來的。就好像我們平常說:「你的學歷是什麼?」「啊!我是哪一個研究所畢業。」用不著說,我哪一個幼稚園,哪一個小學,哪一個中學,假定你這個研究所畢業的話,那一定是具足這個條件,這個很清楚、很明白。不過這個大乘佛法當中,確確實實是分成功兩部分,所以這兩部分,它都圓滿。這個裡邊呢,第一個質量圓滿,實際上那個質量圓滿一定包括那個次第的,這個地方又特別強調一下: [06′13″]</p>
<p>   「具攝經咒所有樞要而開示故,所詮圓滿」,說從一個凡夫下腳的第一步到最究竟圓滿的佛法,這裡邊都是有的,在這裡邊就會說顯教、密教、大小乘,所以前面看那兩個字叫「具攝」經咒所有樞要——很關鍵的部分——而開示故。所以對於一個找不到方向的,或者不知道從哪裡起步的,中間不知道該怎麼走的,乃至最後不知道怎麼走的人,看這個都是可以的。所以師父舉那個例子是說如果你是某一科的博士後的話,那麼你對這一科的課就都學過了。所以它「具攝經咒所有樞要而開示故」就都是包含的,它的所詮、它所顯示的內容是非常圓滿的。 [07′04″]
<p>   那麼我們接著再聽下一段。<p> 調心次第為最勝故,易於受持。<p>   還有,我這個次第也圓滿,這個圓滿有什麼好處呀?「易於受持」。真正你走上去的時候,必定要按照那個次第,這個次第一亂,你走就走不上去了;走起來也是千辛萬苦,就算你走得上去,跑了很多冤枉路。這個是它真正好的地方。 [00′30″]</p>
<p>   大家在看這幾個字——「調心次第為最勝故,易於受持」,其實只是看這個《廣論》原文的話,我們可以定睛於這幾行字去想一想這是什麼意思。然後再看師父的解釋,說次第圓滿,那麼圓滿還有什麼好處呢?師父說:「<p> 真正你走上去的時候,必定要按照那個次第<p> 」。然後我們會想:真的嗎?一定要按照次第走上去,不能跳級嗎?不能跨越次第嗎?說:「<p> 這個次第一亂,你走就走不上去了<p> 」,真的嗎?先走後面再走前面不行嗎? [01′19″]</p>
<p>   說:「<p> 走起來也是千辛萬苦,就算你走得上去,跑了很多冤枉路。這個是它真正好的地方。<p> 」在這裡邊我們可以想一下,次第這個問題一旦亂了之後,其實初學者是滿麻煩的。比如說剛進廣論班的同學,其實什麼都不太清楚,像我自己那個時候對整體佛法的脈絡是不太清楚的。每個人都有自己每個人相應的部分,比如說有人會相應念死無常,有人會相應一心皈依,或者念佛法門或者參禪法門,每個人都有特別相應的部分,但是對自己特別相應部分的執取性就很高。 [02′00″]</p>
<p>   還有人想要快點證空性,想要快點證空性的人其實就是很想要開悟,關於怎麼樣開悟的這個方面的教授就會一下他入了眼,然後就會鑽進去,很想要得到怎麼開悟,但是沒有去分析自己當下的一步是什麼。用功用很久之後,發現:奇怪!還是悟境遲遲不來。有的時候是功夫進進退退,就算很用功有的時候還發了脾氣,因為太執著了,越用功脾氣越大。還有這種現象。 [02′32″]</p>
<p>   那麼到底應該怎麼辦呢?有的時候自己會倍受打擊,努力了好久之後就覺得:啊!這個有點認命了,我費盡努力地修行,好像也沒取得多大的成就。可是卻沒有分析自己是幾年級的學生,應該上幾年級?如果學高班的課程沒學懂的話,是不是應該從開始往下學?可是這個調心次第我們就會很容易看、很容易上手。 [03′01″]</p>
<p>   比如說在《廣論》裡寫的「親近善知識」的部分,一開始就是很多同學,還有包括我自己也會覺得:親近善知識法有那麼重要嗎?要講這麼多篇幅?一定要列在《道次第》的前面嗎?那時候我自己就會覺得很想越過它去學念死無常,因為我比較相應念死無常、三惡趣苦、皈依,我比較相應那一段。然後甚至「聽聞軌理」大家也沒有耐心,覺得:還要學「聽聞軌理」嗎?我已經學佛好久了欸!所以,從很多方面當我們忽略了一個基礎的道的功夫之後,其實在後面怎麼努力,就會發現進道很慢。當然這裡邊有太多緣由,有的就是次第完全是倒亂了。 [03′47″]</p>
<p>   那時候我還記得,因為不太懂所以就請問仁波切,說:「一定要修依止法嗎?可不可以跳過去直接修念死?跳過去修念死,就真的修不出念死的心來嗎?」那個時候仁波切看了看我,說:「宗大師說要從依止法開始修,可能還是要修一下依止法吧!」就這樣淡淡的一句就沒有再說我了。回來我想了想,覺得:可能自己不能想一齣是一齣,修行這條路可能還得要聽老師的,所以就很仔細地去看「親近善知識」的部分。 [04′27″]</p>
<p>   「聽聞軌理」也是,很多同學覺得要跳過,趕快學後面。其實我們大家都有一種要跳過次第學最後面的,對不對?那空性最厲害了,空性一學就可以解脫生死,那就直接學空性,因為大家覺得這是最快的。卻不知道第七個餅吃飽的原因是——看起來這人吃很多——這前面有六個;不過那餅可能很小。 [04′50″]</p>
<p>   所以這個次第,沒有學習《廣論》之前,我自己來說是覺得相應的就是下腳處,我喜歡的就從那兒入手。至於入手到哪裡去了呢?其實也沒有一個座標或尺子衡量一下現在到什麼程度了?比如說厭離心的修持,大家持戒常常被五欲八風所轉的時候,厭離心修持得不夠持戒就很困難。皈依的心不夠,常常有事沒事就求一些相信各種東西能救自己、能解脫自己的痛苦、能解決眼前的危機,乃至多遠的危機,卻在很多事情來臨的時候,不知道祈求三寶、不知道依靠三寶,或者做個架子去依靠一下,心也不虔誠,不能做到徹底地依靠。 [05′36″]</p>
<p>   不能做到徹底地依靠,別人說自己不虔誠就會很上火,因為畢竟我是三寶弟子,不虔誠這個罪很大呀,我自己也看不過去呀!可是不虔誠這個問題怎麼解決?它是可以解決的。它是要從什麼地方開始修啊?三寶的功德。對吧?還要修什麼?念死、三惡趣苦,然後由這樣的心去皈依。它是有一個辦法治我們這些修行上的毛病的。但是如果不沿著這樣的次第仔細去研閱的話,要麼是不知道自己修行有什麼毛病,要不然有了毛病就會唉聲嘆氣不知道怎麼對治,說不知道自己走在什麼地方、我在何處?這個問題很嚴重! [06′23″]
<p>   所以「調心次第為最勝故」,這裡邊有個「為最勝故」,接著就出現那個所有的修行人都想看到的字——我是很想看到——「易於受持」。因為易於受持這點容易,容易來說我們就少費力氣。少費力氣意味著什麼?意味著我們在生死輪迴裡的時間會變短,我們每次超越痛苦的時間都會變少,所花的力氣會變少,那麼這樣誰不高興呢?如果你用超越痛苦的這個時間來算的話,比如說你要是痛苦十分鐘,如果你用一分鐘就會超越痛苦,不是很快嗎? [00′38″]</p>
<p>   那如果原來痛苦十分鐘,然後努力半個小時還是超越不了,有的人一個煩惱纏自己半個月穿越不了;有的人一個煩惱纏一生、纏半生,很多年之後那個事情還是過不去,就是被那個事糾纏,他穿越不了!這種東西就是很不容易的。但是「調心次第易於受持」,就是把這個心調到你想要調的那位置,它是很容易的,這是道次第系列我覺得很引人入勝的地方,也是我們眼睛發亮的地方! [01′09″]</p>
<p>   師父在這裡邊說了:啊,走起來千辛萬苦啊!就算你走得上去,也費很多冤枉路。那大概奄奄一息,也不一定到達我們想要到達的地方,所以千萬不要把「調心次第為最勝故,易於受持」這句話輕易放過去!因為這句話要是反過來的話——很不容易受持,我們所學習的如果變成這樣,對我們修行人來說實在是太、太辛苦了,而且又不會達到自己的目標。 [01′42″]</p>
<p>   所以如果碰到一個全圓地闡述一個凡夫從腳下的路到最究竟的路,而且它調心次第臺階非常清楚、年級歸類得非常清楚,而且又很容易受持,那不是「根本極圓滿者」嗎?學的人就會很高興學呀!就是你很容易學會很難的課程,從一開始慢慢學就可以了,就這麼簡單!難的課就會慢慢學會。如果逾越了基礎的話,難的就永遠是難的、是達不到的,等同登天一樣。 [02′16″]</p>
<p>   所以,看到宗大師寫下的這幾個字,還是心裡滿感動的!宗大師是讚美《道炬論》,但是善知識能為我們這些弟子們考慮怎麼樣能夠很容易地受持,然後不容易走偏,按照次第來,覺得是非常非常貼心的一個慈母心。 [02′40″]</p>
<p>   那麼我們接著再聽下一段。<p>   同時,還有一個特點:<p> 又以善巧二大車軌二師教授而莊嚴故,勝出餘軌。<p>   那麼,我們傳大乘佛法的一共有兩個,一個是性宗,一個是相宗。它現在呢,兩大道軌統統含攝,這個兩個,一個是偏重「性」,一個「相」。偏重是偏重,不是說忽視哦!它絕對圓滿的,但是雖然都圓滿,卻有偏重。它現在把兩個都併起來了,大家可以截長補短,這兩個補起來,變成功圓滿當中最圓滿,所以勝出所有其他的傳承當中各式各樣的內容,這個就是它的殊勝。 [03′36″]</p>
<p>   這一段說:「<p> 又以善巧二大車軌二師教授而莊嚴故,勝出餘軌。<p> 」實際上,最開始學《廣論》的同學看到「二大車軌」的時候是不知道在說什麼;然後二大車軌之後,又「二師教授而莊嚴故」,其實「二師教授」也不知道是誰;「勝出餘軌」,「餘軌」是指其他的什麼也不知道。這個在《四家合註》上我們會再講。 [04′03″]</p>
<p>   在當時的那種狀況,怎麼樣把這樣的一個二大車軌的教授介紹給我們這些漢地的有情?師父應該是花了很多心思的。所以在這個地方師父是從這樣的角度,師父說:「<p> 勝出所有其他的傳承當中各式各樣的內容,這個就是它的殊勝。<p> 」就是圓滿中的圓滿。 [04′27″]</p>
<p>   其實讀到這一段,一開始學的時候我在想:二大車軌、二師的教授,因為有二師的教授莊嚴,為什麼這個二師的教授就勝出餘軌呢?這個二大車軌到底是精采在什麼地方?因為其他的軌也是傳承啊!為什麼這樣的傳承它會勝出其他的餘軌?這是師父在這一段講解裡給我們留下來的疑問,你們不知道是不是看了會有疑問? [04′53″]</p>
<p>   我那個時候學都是有很深的疑問,後來學到《現觀》、聽到《金鬘論》之後,才知道這二大車軌是這麼一個殊勝法!但是當時就是剛開始學《廣論》的人,其實這個部分也是不能廣講的,廣講可能就覺得太難了。所以師父用這樣簡易的一個語言,希望我們了解到「傳承」,這就是這樣的一個傳承,所以它圓滿當中最圓滿,勝出了其他的——你看!宗大師用這「勝出餘軌」。 [05′27″]</p>
<p>   剛開始學《廣論》的時候,很喜歡把《廣論》的字一個字地讀過,然後再讀過、再讀過,讀很多遍,去研究這個字到底是什麼意思?所以這個文字傳遞佛法的準確性是非常重要的。研究完了之後,再看師父的解釋;然後再看字、再看師父的解釋。 [05′47″]</p>
<p>   那時候,真的!我覺得師父在此處拋下一個疑問:為什麼這二師的教授而莊嚴,就變成了勝出餘軌?大家可以沿著整個的《廣論》和五大論的系統去探討這句話,看這句話說的是不是真的? [06′05″]
<p>   今天我們學習《四家合註入門》的「顯示法殊勝」,請大家把書打開到 160 頁,看第一段:<p> 第二、<p> 顯示法殊勝中,<p> 分三:辨識法者:<p> 法者,此教授基論,謂《菩提道炬》。<p> 第二、宣說具有圓滿、易於受持、派軌殊勝三法:<p> 依怙所造雖有多論,然如根本極圓滿者,厥為《道炬》。具攝經咒所有樞要而開示故,所詮圓滿;調心次第為最勝故,易於受持;又以善巧二大車軌二師教授而莊嚴故,勝出餘軌。<p> 二師者,謂善巧無著派之金洲,及善巧龍樹派之小明了杜鵑,如《道次第傳承上師祈請文》中所說,為覺窩阿底峽之親傳上師。雖有說是阿哇都帝巴及金洲二師,然師云,德哇尖巴及喇嘛一切遍智二師俱許前說。<p>  [01′16″]</p>
<p>   接下來我們來看仁波切的講記。第二科,「<p> 為於教授起敬重故開示其法殊勝<p> 」。那麼我們可以想一下:為什麼要開示這個法的殊勝呢?因為要對這個教授內心起恭敬和殷重這樣的一個意樂。那麼是令誰要起呢?就是令學的我們啊!在此妙音笑大師就做了科判,把它分作三科。 [01′53″]</p>
<p>   我們在學習的都知道學一個論典中間那一篇的話,如果有一個學習特別出色的人把它作了科判,科判就是它貫穿的像一個線索一樣,那麼我們就很容易把這一篇貫通。所以妙音笑大師給我們作了三科,第一科就是「<p> 辨識法者<p> 」。「法」可以有很多意思,在此處「法」就是指「<p> 此教授基論,謂《菩提道炬》<p> 」——《菩提道炬論》。那麼「為於教授起敬重故開示其法殊勝」的「法」,是指什麼呢?就是指《菩提道炬論》。這是第一科,辨識法。就是要辨識哪一個啊?令我們對於什麼樣的法起敬重?在開示那個法殊勝的「法」就是《菩提道炬論》。 [02′58″]</p>
<p>   接著第二科,注意!分成三個殊勝,「<p> 第二、宣說具有圓滿、易於受持、派軌殊勝三法<p> 」,將這個三項攝為一個科判。「<p> 依怙所造雖有多論,然如根本極圓滿者,厥為《道炬》<p> 」,尊者造了很多的論著,有各式各樣的法類,共有百種,被稱為《阿底峽小品集》——這個「品」比如《中品般若》、《大品般若》那個「品」——在共有百種的阿底峽尊者的論著中,最主要的是《道炬論》。 [03′44″]</p>
<p>   為何《道炬論》是最為主要呢?那兩個字出現了,「<p> 具攝<p> 」,毫無遺漏地包含,包含什麼?「<p> 經咒所有樞要而開示故,所詮圓滿<p> 」。它的範圍是非常非常地周遍的,對吧?沒有遺漏什麼,毫無遺漏地包含了所有經咒的樞要而開示,所以所詮圓滿。 [04′14″]</p>
<p>   然後是「<p> 易於受持<p> 」,這個易於受持,仁波切說是很容易行持的意思——主要是指「<p> 調心<p> 」的方便,以三士道的「<p> 次第<p> 」來調心,先以下士道,再以中士道,漸次引導,然後就進入不共上士道,很容易受持。說任何論典它的內容都是圓滿的,然而一旦涉及到行持的時候,就很難有比《廣論》更容易行持的。我再說一遍:任何論典它的內容都是很圓滿的,然而一旦涉及到行持的時候,很難有比《廣論》更容易行持的。 [04′58″]</p>
<p>   在這裡邊,我們可以稍稍地停一下,這一句話是什麼意思呢?說:「很難有比《廣論》更容易行持的」,很容易照著修。那麼為什麼它變得那麼容易呢?因為它調心的次第,它以下士、中士漸次引導,它有個次第,沒有上手就讓我們修菩提心、沒有上手就開始講空性、也沒有上手就生圓次第,它是從最初、最初的一個次第開始的。 [05′28″]</p>
<p>   比如說像《現觀莊嚴論》的所詮圓滿嗎?雖然是圓滿,但是對於初機者要學這個,中等者、中根的要學這個,然後再上去要學這個的話,可能次第就沒有像《廣論》這麼明顯了。比如說在《現觀莊嚴論》裡有沒有給我們講聽聞軌理呢?有沒有講前邊的很多呢?次第就沒有像《廣論》這麼明顯。而《廣論》則是把這樣的次第書寫出來,明明白白的,所以「<p> 易於受持<p> 」。 [06′01″]</p>
<p>   那麼我問大家一個問題:為什麼《廣論》變得易於受持?這個「受持」是指行持,對不對?為什麼那麼容易調心啊?是源於它的次第井然,對不對?全都明明白白地書寫出來。不知道大家聽課的時候有沒有那種習慣?有一些人願意寫筆記的,一旦筆記寫得清清楚楚的時候,對於這一節課的大綱,乃至思路、講課老師的思路是怎樣的就會很清晰。 [06′30″]</p>
<p>   三世諸佛雖然給我們開示了三主要道,但是它在比如《華嚴經》裡、在《楞嚴經》裡、《妙法蓮華經》裡,乃至《涅槃經》、很多很多的經裡,我們怎麼樣閱藏的時候能閱出三主要道,而且這樣排序呢?如果沒有宗大師這樣把佛陀的意思這麼清晰地寫出來的話,對我們來說是非常困難的。所以這個容易,就是容易在「調心次第井然」。 [06′59″]
<p style="text-align:justify">  這個次第井然的問題,我再贅言幾句。比如說現在——應該在很多年就有這種說法,說:「不要聞思了啊!人命無常啊!也不知道能活多久,趕快修吧!趕快修!聞思幹什麼啊?」不需要聞到聞所成慧、思到思所成慧,然後再修到修所成慧,他那個修就是直接就要拿一個善所緣上去修,好像修就可以直接修到修所成慧。&nbsp;<span style="color:rgb(42, 100, 150)">[00′29″]</span></p>
<p style="text-align:justify">  實際上,這個善所緣是什麼呢?那個時候大家都很喜歡念一句佛號,但是念一句佛號是以出離心念的、是以菩提心念的,還是想要希求空性的心念的?反正就是:啊!特別相信阿彌陀佛,相信佛陀會來救我們。但是在前行,念佛的前行和正行的時候,實際上有沒有注意到防止昏沉和散亂?有沒有徹底地去研習佛陀的功德?乃至有沒有夾雜著各種煩惱的名利心在念?很顯然前面的基礎是不夠的,修了很久之後,那個道心還是不行。所以並不是說:「啊!時間來不及了,我趕快修!」你就能修起來。這裡邊缺了什麼呀?下腳處是什麼?這個修行的下腳處是什麼?次第是什麼?沿著次第才能夠到修到修所成慧。&nbsp;<span style="color:rgb(42, 100, 150)">[01′24″]</span></p>
<p style="text-align:justify">  一個修行人如果忽略了聞法這個過程,而且沒有學到清淨的傳承就直接修的話,十有八九是非常危險的。比如說從 A 地到 B 地,你越著急,更不能出門就走,你必須得有個嚮導給你找一條最近的路、最省力的路。因為你著急,所以只能選最近的路,不能再走冤枉路,走冤枉路就會更著急。&nbsp;<span style="color:rgb(42, 100, 150)">[01′51″]</span></p>
<p style="text-align:justify">  很多年前很多人把聽法也不當作是修行,學經典也不當作是修行,都當作是好像了解一些事情啊、多了解一點知識,沒有意識到實際上在聽法就是在研究到底怎麼修,修的次第、質量,然後怎麼樣才是一個非常清淨的修法,而且最重要的是怎麼樣持戒。&nbsp;<span style="color:rgb(42, 100, 150)">[02′17″]</span></p>
<p style="text-align:justify">  因為有這樣的次第所以很容易,「易於受持」就是很容易修成的意思。&nbsp;<span style="color:rgb(42, 100, 150)">[02′23″]</span></p>
<p style="text-align:justify">  所以當我們很急著要得到修行的成就的時候,要想一想:「沿著道次第這樣的修行是很慢的嗎?」後面會講到不管是什麼根基的,都請從共下士開始修。為什麼呢?因為萬一你自己估計錯了就會兩頭空,直接去修上面的,結果下面你沒有,怎麼可能走上面呢?所以,「次第」對我們來說是非常重要的!&nbsp;<span style="color:rgb(42, 100, 150)">[02′52″]</span></p>
<p style="text-align:justify">  我覺得今天學這一段,我們再反思一下自己:大家都非常熱愛修行,如果學了很久之後,發現自己進步不是很大,這時候要考慮考慮我們希望進步的點是什麼?我沒有達到那樣一個進步的點,那麼正確的方式是什麼?有沒有注意到次第?比如說有沒有注意到聽聞軌理呀?有沒有注意到修上師相應啊?還有,有沒有注意到戒律的日益皎潔?這些資糧善如果不好好地積聚,比如說對上師與本尊無二無別的這樣一個觀想來祈求,得不到這樣的加持,通常進道是很緩慢的;如果對上師退失信心的話,還會比原來還不如,原來達到的高度會全都退失掉!這些都是我們要去檢查的。檢查什麼呢?就是我為什麼進步慢?甚至我為什麼會退步了?&nbsp;<span style="color:rgb(42, 100, 150)">[03′49″]</span></p>
<p style="text-align:justify">  還有一點,就是要觀察我們這樣一個辨識的角度對不對?說:我退步了!那上了這麼多年廣論班,得去除多少黑暗哪!當初沒有聽《廣論》的時候,很多事情都不知道;現在聽了那麼多的取捨之後,那麼多的取捨都會掃蕩我們對境不取捨的那種愚癡,因為愚癡就會造惡業,掃蕩了多少可能會發生的惡業。這筆也要算一算!認真地算一算之後,才能夠確定說:「我比很多年前沒有學《廣論》前進步了多少。」你聽了多少正知見?這是一個問題。聽了之後,我們會想去供養三寶啊、承事善知識、孝順父母啊,這樣的善行又有多少?聽了那麼多法,在內心中引起的那種希求心,還有歡喜心,又跟法結了多少那樣的善緣!&nbsp;<span style="color:rgb(42, 100, 150)">[04′42″]</span></p>
<p style="text-align:justify">  所以要認真地檢查、要如法地檢查,不能心情低落的時候,就認為自己什麼都沒有;心情一好了,就說:「哇,這個修行滿好的!」它不是一個正確的量,它是根據自己的心情好壞去判定自己的,顯然這個判定是不準確的。應該依著《道次第》法鏡來照,看看自己在什麼地方。最重要的是,堅持了很多年學習《廣論》,一直在聽法、如理抉擇,在一遍一遍學這樣的同學,千萬不要對自己聞思從《般若經》傳出來的《廣論》起追悔心啊!千萬不要這樣辛辛苦苦堅持了這麼多年還起追悔心。&nbsp;<span style="color:rgb(42, 100, 150)">[05′27″]</span></p>
<p style="text-align:justify">  另外對於新的學員,也不要害怕難!這本論雖然有點厚,但是看五大論就更多。有人游過大海嗎?看到了更廣闊的、更廣闊的之後,我們就不會覺得:「啊,這本《廣論》我就學不完,依我的慧力是無法完成的。」開始學《廣論》,後來就可以學到更廣闊的,為什麼呢?因為心是無自性的,可以鍛鍊它,將來就會能承載越來越多的法,它會顯現為廣闊無邊的這個特性。&nbsp;<span style="color:rgb(42, 100, 150)">[06′01″]</span></p>
<p style="text-align:justify">  接下來是「派軌殊勝」,說:「<strong>又以善巧二大車軌二師教授而莊嚴故,勝出餘軌</strong>」,善巧二大車軌是哪兩個車軌呢?龍樹、無著二大車軌。善巧龍樹、無著二大車軌的兩位上師,語王尊者在這裡邊註道:「<strong>二師者,謂善巧無著派之金洲,及善巧龍樹派之小明了杜鵑,如《道次第傳承上師祈請文》中所說,為覺窩阿底峽之親傳上師。雖有說是阿哇都帝巴及金洲二師,然師云,德哇尖巴及喇嘛一切遍智二師俱許前說。</strong>」「師云」,就是指語王尊者的上師,他承許這裡邊的兩位上師應該是依前一種說法。另外再標明一下,這裡邊的阿哇都帝巴,不是小明了杜鵑。有人說他倆是一個人,會有這樣的名字,但是這裡邊不是指小明了杜鵑。&nbsp;<span style="color:rgb(42, 100, 150)">[07′08″]</span></p>
<p style="text-align:justify">  好!今天就上到這裡。 [07′12″]</p>
<p style="text-align:justify">  很高興又到了我們一起學習《廣論》的時間,今天我們將繼續學習:「<strong>此論教授殊勝分四:通達一切聖教無違殊勝,一切聖言現為教授殊勝,易於獲得勝者密意殊勝,極大罪行自趣消滅殊勝。</strong>」我們開始一起聽師父的講解,一定要注意聽!&nbsp;<span style="color:rgb(42, 100, 150)">[00′26″]</span></p>
<blockquote>
<h4>此論教授殊勝分四:</h4>
<h4>  這個本論的內容,本論的精要的內容,它好的、特別殊勝的地方,分四部分來說明它:</h4>
<h4><span style="font-size:15px">一</span>通達一切聖教無違殊勝,<span style="font-size:15px">二</span>一切聖言現為教授殊勝,<span style="font-size:15px">三</span>易於獲得勝者密意殊勝,<span style="font-size:15px">四</span>極大罪行自趣消滅殊勝。</h4>
<h4>  分成功這個四部分,那麼這個四部分,現在我們先大致地來了解、說明一下。第一個呢,它這個論,我們現在所要學的這個論,它通達所有的聖教,這第一個。就它的整個內涵來說,包含了一切佛的圓滿的教法。不過在一般情況之下,我們了解的這個教法,往往彼此之間好像有差別,乃至於有牴觸,乃至於有牴觸。說性宗講空,相宗講有,這個不對;小乘講的跟大乘講的,往往又是各說各的,互相不能容納對方。他現在說,不但包含了一切,而且彼此間絕不違背,這個不違背,擺在一塊兒的話,產生的卻是相輔相成。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[02′23″]</span></h4>
<h4>  平常我們學佛法,最感到困擾的一點事情,就是這個。說我們要學圓滿的,結果這個法師嘛,這個講這個,那個講那個,不一樣;等到你看經嘛,經上面又是說有各各差別,你不知道如何取捨。乃至於再退下來,說我們現在看看那個佛教當中修持的人嘛,那一派修這個的,那一派修這個,彼此之間又各說各的,你不曉得如何取捨。更進一層,總之我們看,乃至於我們現在這個團體當中,也是大家呀,哎呀,這個你沒辦法把那些事情擺平。現在不!它不但包含一切,而且彼此間相輔相成。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[03′22″]</span></h4></blockquote>
<p style="text-align:justify">  好!我們聽完了這一段之後,我想問大家一個問題。以前在廣論班學習的時候,通常聽一遍,我提問題同學都有點答不上,因為聽過去了沒什麼印象。所以那個時候很多同學就在上課之前他們會用功,會組成小組把這一段師父的帶子反覆地聽,然後找出他們要研討的點。因為聽過了,我再上稍微大一點的課——就是同學來得多一點的時候,他們就會去對比他們小組研討的點和我們這個大課研討的點有什麼不同呢?對比之下大家互相學習,效果是很好的。你們如果能夠這樣做的話,我是很感謝諸位的!&nbsp;<span style="color:rgb(42, 100, 150)">[04′10″]</span></p>
<p style="text-align:justify">  提第一個問題:師父說本論精要的內容、特別殊勝的地方,分四個部分;接著師父說:「<strong>大致地來了解、說明一下。</strong>」那麼「通達一切聖教無違殊勝」,是指什麼「通達一切聖教無違殊勝」?是指什麼?是指本論,對吧?本論是哪部論呢?你說是《道炬論》也好,可以說是《菩提道次第廣論》嗎?這個論它會有這樣的一個殊勝。&nbsp;<span style="color:rgb(42, 100, 150)">[04′48″]</span></p>
<p style="text-align:justify">  那麼這裡邊就出現了一個問題:就內涵來說,它有多麼地遼闊呢?師父用那個原話還記得嗎?「<strong>包含了一切佛的圓滿的教法。</strong>」注意!這裡邊出現了「一切佛的圓滿的教法」,就這樣一本論,它的內涵喔!你看原文的話,就是通達一切聖教、佛陀的一切聖教沒有相違背的這種殊勝,這裡前面有「通達」兩個字。然後師父用非常簡要的一段話,就告訴我們實際上這本論它的範圍包含了一切佛圓滿的教法——它的這個內涵的廣闊性。&nbsp;<span style="color:rgb(42, 100, 150)">[05′40″]</span></p>
<p style="text-align:justify">  那麼再對比我們現在一般的狀況。注意!在說到在一般的狀況下,師父用了幾個字,還記不記得那幾個字是什麼?八、九個字吧!是用了什麼?說佛的一切圓滿教法的內涵是非常殊妙的,那麼一般的情況下——接著該到誰了?該到我們這些學的弟子們。他說:「<strong>我們了解的這個教法</strong>」,和佛說的那個圓滿的教法這兩者,師父說:「<strong>往往彼此之間好像有差別,乃至於有牴觸</strong>」。「乃至於有牴觸,乃至於有牴觸」,師父說了兩次,接著就舉了什麼?相宗、性宗、大小乘,說各說各的,不能容納對方。這是佛說的教法的意思嗎?不是的,是我們了解的教法,我們了解成這樣子了。&nbsp;<span style="color:rgb(42, 100, 150)">[06′36″]</span></p>
<p style="text-align:justify">  那麼現在師父說:「<strong>他現在說</strong>」,他是指什麼?是這部論,對吧?「<strong>不但包含了一切,而且彼此間絕不違背,這個不違背,擺在一塊兒的話,產生的卻是相輔相成。</strong>」很顯然這本論想讓我們通達一切聖教無違殊勝,和我們學的人犯了這個毛病,好像都不一樣的,這個產生了一個天壤之別的差距。師父透過把這部論「通達一切聖教無違」的這個宗立在這兒,然後看看我們的現狀是這樣。&nbsp;<span style="color:rgb(42, 100, 150)">[07′11″]</span></p>
<p style="text-align:justify">  接下來又講了一下我們的困擾。「<strong>最感到困擾的一點事情</strong>」,就是平常我們學佛法——這一定是很認真學的——學佛法嘛當然都想要學圓滿的,但是看一看,講的是不一樣的;看經也各各差別,也不知道怎麼辦,看不懂的話就退下來;然後再看看修行的人,這一派修那個、那一派修那個,彼此間也是各說各的,不知道怎麼取捨;再進一層看看我們這個團體,很多事情也擺平不了。&nbsp;<span style="color:rgb(42, 100, 150)">[07′43″]</span></p>
<p style="text-align:justify">  師父接著說:「<strong>現在不!</strong>」請問「現在不」是什麼意思?現在不是這樣了,就這麼簡單嗎?現在為什麼不是這樣?師父說其實它正確的狀態,是「<strong>它不但包含一切,而且彼此間相輔相成</strong>」。有沒有注意到師父在講「通達一切聖教無違」的時候,一直在結合我們的現狀?結合我們作為學佛的弟子們,在跟隨法師學習啊、看經教啊,乃至在立出自己的宗的時候,看看有一些什麼樣的問題——就擺出了一大堆的問題。&nbsp;<span style="color:rgb(42, 100, 150)">[08′19″]</span></p>
<p style="text-align:justify">  這些問題都是我們了解的這個教法、我們了解的教法,那是不是教法的本身呢?可能不是佛陀講的那個教法清淨圓滿的本身,是我們理解的那個教法。那麼真正的教法,師父說現在不是的,它不但包含了一切,而且彼此間相輔相成,要能夠通達這一點。 [08′47″]</p>
<p style="text-align:justify">  很高興又到了我們一起學習《廣論》的時間,今天我們將繼續學習:「<strong>此論教授殊勝分四:通達一切聖教無違殊勝,一切聖言現為教授殊勝,易於獲得勝者密意殊勝,極大罪行自趣消滅殊勝。</strong>」我們開始一起聽師父的講解,一定要注意聽!&nbsp;<span style="color:rgb(42, 100, 150)">[00′26″]</span></p>
<blockquote>
<h4>此論教授殊勝分四:</h4>
<h4>  這個本論的內容,本論的精要的內容,它好的、特別殊勝的地方,分四部分來說明它:</h4>
<h4><span style="font-size:15px">一</span>通達一切聖教無違殊勝,<span style="font-size:15px">二</span>一切聖言現為教授殊勝,<span style="font-size:15px">三</span>易於獲得勝者密意殊勝,<span style="font-size:15px">四</span>極大罪行自趣消滅殊勝。</h4>
<h4>  分成功這個四部分,那麼這個四部分,現在我們先大致地來了解、說明一下。第一個呢,它這個論,我們現在所要學的這個論,它通達所有的聖教,這第一個。就它的整個內涵來說,包含了一切佛的圓滿的教法。不過在一般情況之下,我們了解的這個教法,往往彼此之間好像有差別,乃至於有牴觸,乃至於有牴觸。說性宗講空,相宗講有,這個不對;小乘講的跟大乘講的,往往又是各說各的,互相不能容納對方。他現在說,不但包含了一切,而且彼此間絕不違背,這個不違背,擺在一塊兒的話,產生的卻是相輔相成。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[02′23″]</span></h4>
<h4>  平常我們學佛法,最感到困擾的一點事情,就是這個。說我們要學圓滿的,結果這個法師嘛,這個講這個,那個講那個,不一樣;等到你看經嘛,經上面又是說有各各差別,你不知道如何取捨。乃至於再退下來,說我們現在看看那個佛教當中修持的人嘛,那一派修這個的,那一派修這個,彼此之間又各說各的,你不曉得如何取捨。更進一層,總之我們看,乃至於我們現在這個團體當中,也是大家呀,哎呀,這個你沒辦法把那些事情擺平。現在不!它不但包含一切,而且彼此間相輔相成。&nbsp;<span style="color:rgb(42, 100, 150); font-family:微軟正黑體,times new roman; font-size:16px">[03′22″]</span></h4></blockquote>
<p style="text-align:justify">  好!我們聽完了這一段之後,我想問大家一個問題。以前在廣論班學習的時候,通常聽一遍,我提問題同學都有點答不上,因為聽過去了沒什麼印象。所以那個時候很多同學就在上課之前他們會用功,會組成小組把這一段師父的帶子反覆地聽,然後找出他們要研討的點。因為聽過了,我再上稍微大一點的課——就是同學來得多一點的時候,他們就會去對比他們小組研討的點和我們這個大課研討的點有什麼不同呢?對比之下大家互相學習,效果是很好的。你們如果能夠這樣做的話,我是很感謝諸位的!&nbsp;<span style="color:rgb(42, 100, 150)">[04′10″]</span></p>
<p style="text-align:justify">  提第一個問題:師父說本論精要的內容、特別殊勝的地方,分四個部分;接著師父說:「<strong>大致地來了解、說明一下。</strong>」那麼「通達一切聖教無違殊勝」,是指什麼「通達一切聖教無違殊勝」?是指什麼?是指本論,對吧?本論是哪部論呢?你說是《道炬論》也好,可以說是《菩提道次第廣論》嗎?這個論它會有這樣的一個殊勝。&nbsp;<span style="color:rgb(42, 100, 150)">[04′48″]</span></p>
<p style="text-align:justify">  那麼這裡邊就出現了一個問題:就內涵來說,它有多麼地遼闊呢?師父用那個原話還記得嗎?「<strong>包含了一切佛的圓滿的教法。</strong>」注意!這裡邊出現了「一切佛的圓滿的教法」,就這樣一本論,它的內涵喔!你看原文的話,就是通達一切聖教、佛陀的一切聖教沒有相違背的這種殊勝,這裡前面有「通達」兩個字。然後師父用非常簡要的一段話,就告訴我們實際上這本論它的範圍包含了一切佛圓滿的教法——它的這個內涵的廣闊性。&nbsp;<span style="color:rgb(42, 100, 150)">[05′40″]</span></p>
<p style="text-align:justify">  那麼再對比我們現在一般的狀況。注意!在說到在一般的狀況下,師父用了幾個字,還記不記得那幾個字是什麼?八、九個字吧!是用了什麼?說佛的一切圓滿教法的內涵是非常殊妙的,那麼一般的情況下——接著該到誰了?該到我們這些學的弟子們。他說:「<strong>我們了解的這個教法</strong>」,和佛說的那個圓滿的教法這兩者,師父說:「<strong>往往彼此之間好像有差別,乃至於有牴觸</strong>」。「乃至於有牴觸,乃至於有牴觸」,師父說了兩次,接著就舉了什麼?相宗、性宗、大小乘,說各說各的,不能容納對方。這是佛說的教法的意思嗎?不是的,是我們了解的教法,我們了解成這樣子了。&nbsp;<span style="color:rgb(42, 100, 150)">[06′36″]</span></p>
<p style="text-align:justify">  那麼現在師父說:「<strong>他現在說</strong>」,他是指什麼?是這部論,對吧?「<strong>不但包含了一切,而且彼此間絕不違背,這個不違背,擺在一塊兒的話,產生的卻是相輔相成。</strong>」很顯然這本論想讓我們通達一切聖教無違殊勝,和我們學的人犯了這個毛病,好像都不一樣的,這個產生了一個天壤之別的差距。師父透過把這部論「通達一切聖教無違」的這個宗立在這兒,然後看看我們的現狀是這樣。&nbsp;<span style="color:rgb(42, 100, 150)">[07′11″]</span></p>
<p style="text-align:justify">  接下來又講了一下我們的困擾。「<strong>最感到困擾的一點事情</strong>」,就是平常我們學佛法——這一定是很認真學的——學佛法嘛當然都想要學圓滿的,但是看一看,講的是不一樣的;看經也各各差別,也不知道怎麼辦,看不懂的話就退下來;然後再看看修行的人,這一派修那個、那一派修那個,彼此間也是各說各的,不知道怎麼取捨;再進一層看看我們這個團體,很多事情也擺平不了。&nbsp;<span style="color:rgb(42, 100, 150)">[07′43″]</span></p>
<p style="text-align:justify">  師父接著說:「<strong>現在不!</strong>」請問「現在不」是什麼意思?現在不是這樣了,就這麼簡單嗎?現在為什麼不是這樣?師父說其實它正確的狀態,是「<strong>它不但包含一切,而且彼此間相輔相成</strong>」。有沒有注意到師父在講「通達一切聖教無違」的時候,一直在結合我們的現狀?結合我們作為學佛的弟子們,在跟隨法師學習啊、看經教啊,乃至在立出自己的宗的時候,看看有一些什麼樣的問題——就擺出了一大堆的問題。&nbsp;<span style="color:rgb(42, 100, 150)">[08′19″]</span></p>
<p style="text-align:justify">  這些問題都是我們了解的這個教法、我們了解的教法,那是不是教法的本身呢?可能不是佛陀講的那個教法清淨圓滿的本身,是我們理解的那個教法。那麼真正的教法,師父說現在不是的,它不但包含了一切,而且彼此間相輔相成,要能夠通達這一點。 [08′47″]</p>
<dt><$link><$view field="title"/></$link></dt><dd><$transclude field="description"/></dd>